@multi-agent-protocol/sdk 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-BQXp4_rd.d.cts → index-BVvyY2kb.d.cts} +794 -3
- package/dist/{index-BQXp4_rd.d.ts → index-BVvyY2kb.d.ts} +794 -3
- package/dist/index.cjs +500 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +499 -5
- package/dist/index.js.map +1 -1
- package/dist/testing.cjs +392 -1
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +392 -1
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stream/agentic-mesh.ts","../src/types/index.ts","../src/jsonrpc/index.ts","../src/errors/index.ts","../src/stream/index.ts","../src/subscription/index.ts","../src/connection/base.ts","../src/utils/ulid.ts","../src/utils/retry.ts","../src/utils/causal-buffer.ts","../src/acp/types.ts","../src/acp/stream.ts","../src/connection/client.ts","../src/connection/agent.ts","../src/federation/envelope.ts","../src/federation/buffer.ts","../src/connection/gateway.ts","../src/schema/zod.gen.ts","../src/protocol/index.ts","../src/permissions/index.ts","../src/server/messages/address.ts","../src/mesh/peer.ts","../src/acp/adapter.ts"],"names":["agenticMeshStream","agenticMeshCreateMeshPeer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Agentic-Mesh Stream Adapter\n *\n * Wraps agentic-mesh's TunnelStream as a MAP SDK Stream interface.\n * This enables MAP clients/agents to communicate over encrypted mesh\n * networks (Nebula, Tailscale, Headscale).\n *\n * @module\n */\n\nimport type { Stream, AnyMessage } from './index';\nimport { TunnelStream, type TransportAdapter } from 'agentic-mesh';\n\n/**\n * Peer endpoint for mesh connection.\n * Re-exported from agentic-mesh for convenience.\n */\nexport interface MeshPeerEndpoint {\n /** Peer identifier */\n peerId: string;\n /** Transport-specific address (IP, URL, etc.) */\n address: string;\n /** Optional port (for TCP-based transports) */\n port?: number;\n /** Additional transport-specific metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Transport adapter interface (subset used by this module).\n * Full interface is defined in agentic-mesh.\n */\nexport interface MeshTransportAdapter {\n /** Whether the transport is currently active */\n readonly active: boolean;\n /** Start the transport */\n start(): Promise<void>;\n /** Connect to a peer endpoint */\n connect(endpoint: MeshPeerEndpoint): Promise<boolean>;\n /** Check if connected to a peer */\n isConnected(peerId: string): boolean;\n}\n\n/**\n * Configuration for agentic-mesh stream.\n */\nexport interface AgenticMeshStreamConfig {\n /**\n * The agentic-mesh transport adapter (Nebula, Tailscale, etc.).\n *\n * Create using agentic-mesh factory functions:\n * - `createNebulaTransport()` for Nebula networks\n * - `createTailscaleTransport()` for Tailscale networks\n */\n transport: MeshTransportAdapter;\n\n /**\n * Remote peer to connect to.\n */\n peer: MeshPeerEndpoint;\n\n /**\n * Local peer ID for identification.\n * Used to generate unique stream IDs.\n */\n localPeerId: string;\n\n /**\n * Connection timeout in milliseconds.\n * @default 10000\n */\n timeout?: number;\n}\n\n/**\n * Internal TunnelStream interface (from agentic-mesh).\n * We use a minimal interface to avoid tight coupling.\n */\ninterface TunnelStreamLike {\n readonly isOpen: boolean;\n open(): Promise<void>;\n close(): Promise<void>;\n write(frame: unknown): Promise<void>;\n [Symbol.asyncIterator](): AsyncIterator<unknown>;\n}\n\n/**\n * Creates a MAP Stream over an agentic-mesh tunnel.\n *\n * This wraps agentic-mesh's TunnelStream (NDJSON over encrypted transport)\n * and adapts it to the MAP SDK's Stream interface.\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param config - Stream configuration\n * @returns Promise resolving to a connected MAP Stream\n * @throws Error if agentic-mesh is not installed\n * @throws Error if peer connection fails\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n * import { agenticMeshStream, ClientConnection } from '@multi-agent-protocol/sdk';\n *\n * // Create Nebula transport\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * // Create MAP stream over mesh\n * const stream = await agenticMeshStream({\n * transport,\n * peer: { peerId: 'server', address: '10.0.0.1', port: 4242 },\n * localPeerId: 'my-client',\n * });\n *\n * // Use with MAP client\n * const client = new ClientConnection(stream, { name: 'MeshClient' });\n * await client.connect();\n * ```\n */\nexport async function agenticMeshStream(\n config: AgenticMeshStreamConfig\n): Promise<Stream> {\n // Start transport if not already active\n if (!config.transport.active) {\n await config.transport.start();\n }\n\n // Connect to peer\n const connected = await config.transport.connect(config.peer);\n if (!connected) {\n throw new Error(`Failed to connect to peer: ${config.peer.peerId}`);\n }\n\n // Create tunnel stream with unique ID\n const streamId = `map-${config.localPeerId}-${Date.now()}`;\n const tunnelStream = new TunnelStream({\n transport: config.transport as unknown as TransportAdapter,\n peerId: config.peer.peerId,\n streamId,\n });\n\n // Open the stream\n await tunnelStream.open();\n\n // Adapt to MAP Stream interface\n return tunnelStreamToMapStream(tunnelStream);\n}\n\n/**\n * Adapts a TunnelStream to the MAP SDK Stream interface.\n *\n * The MAP SDK uses Web Streams API (ReadableStream/WritableStream)\n * while TunnelStream uses AsyncIterator pattern.\n *\n * @internal\n */\nfunction tunnelStreamToMapStream(tunnel: TunnelStreamLike): Stream {\n // Track if reading has been aborted (for cleanup)\n let readingAborted = false;\n\n const readable = new ReadableStream<AnyMessage>({\n async start(controller) {\n try {\n for await (const frame of tunnel) {\n if (readingAborted) break;\n controller.enqueue(frame as AnyMessage);\n }\n if (!readingAborted) {\n controller.close();\n }\n } catch (error) {\n if (!readingAborted) {\n controller.error(error);\n }\n }\n },\n cancel() {\n readingAborted = true;\n tunnel.close().catch(() => {\n // Ignore close errors during cancel\n });\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n if (!tunnel.isOpen) {\n throw new Error('Stream is not open');\n }\n await tunnel.write(message);\n },\n async close() {\n await tunnel.close();\n },\n abort() {\n readingAborted = true;\n tunnel.close().catch(() => {\n // Ignore close errors during abort\n });\n },\n });\n\n return { readable, writable };\n}\n","/**\n * Multi-Agent Protocol (MAP) Type Definitions - v2\n *\n * Core type definitions matching the MAP JSON Schema.\n * These types are the foundation for the TypeScript SDK.\n *\n * v2 Changes:\n * - Fixed ERROR_CODES collision (FEDERATION_AUTH_FAILED)\n * - Added Agent.ownerId for ownership tracking\n * - Reorganized method constants by capability domain\n * - Added EventInput type and createEvent() helper\n * - Added disconnect policy and lifecycle events\n * - Expanded subscription filters\n * - Standardized response shapes (always return entities)\n * - Added hierarchy expansion to agents/get\n * - Added CAPABILITY_REQUIREMENTS mapping\n * - Clarified message event data (no payloads)\n */\n\n// =============================================================================\n// Primitive Types & Identifiers\n// =============================================================================\n\n/** Unique identifier for any participant (agent, client, system, gateway) */\nexport type ParticipantId = string;\n\n/** Unique identifier for an agent */\nexport type AgentId = string;\n\n/** Unique identifier for a scope */\nexport type ScopeId = string;\n\n/** Unique identifier for a session */\nexport type SessionId = string;\n\n/** Unique identifier for a message */\nexport type MessageId = string;\n\n/** Unique identifier for a subscription */\nexport type SubscriptionId = string;\n\n/** Identifier for correlating related messages */\nexport type CorrelationId = string;\n\n/** JSON-RPC request ID */\nexport type RequestId = string | number;\n\n/** MAP protocol version */\nexport type ProtocolVersion = 1;\n\n/** Unix timestamp in milliseconds */\nexport type Timestamp = number;\n\n/** Vendor extension metadata */\nexport type Meta = Record<string, unknown>;\n\n// =============================================================================\n// Participant Types\n// =============================================================================\n\n/** Type of participant in the protocol */\nexport type ParticipantType = 'agent' | 'client' | 'system' | 'gateway';\n\n/** Transport binding type */\nexport type TransportType = 'websocket' | 'stdio' | 'inprocess' | 'http-sse';\n\n/**\n * Streaming capabilities for backpressure and flow control.\n * Servers advertise these to indicate what features they support.\n */\nexport interface StreamingCapabilities {\n /** Server can receive and process ack notifications */\n supportsAck?: boolean;\n /** Server will pause sending when client falls behind */\n supportsFlowControl?: boolean;\n /** Server supports pause/resume subscription state */\n supportsPause?: boolean;\n}\n\n/** Capabilities of a participant, grouped by category */\nexport interface ParticipantCapabilities {\n observation?: {\n /** Can subscribe to event streams */\n canObserve?: boolean;\n /** Can query agents and structure */\n canQuery?: boolean;\n };\n messaging?: {\n /** Can send messages */\n canSend?: boolean;\n /** Can receive messages addressed to it */\n canReceive?: boolean;\n /** Can send to scopes/roles */\n canBroadcast?: boolean;\n };\n lifecycle?: {\n /** Can create child agents */\n canSpawn?: boolean;\n /** Can register agents (not as children) */\n canRegister?: boolean;\n /** Can remove agents */\n canUnregister?: boolean;\n /** Can inject context/control agents */\n canSteer?: boolean;\n /** Can request agent termination */\n canStop?: boolean;\n };\n scopes?: {\n /** Can create new scopes */\n canCreateScopes?: boolean;\n /** Can modify and delete scopes */\n canManageScopes?: boolean;\n };\n federation?: {\n /** Can connect to and route to federated systems */\n canFederate?: boolean;\n };\n /** Streaming/backpressure capabilities */\n streaming?: StreamingCapabilities;\n\n /**\n * Protocols supported by this participant.\n * Used for protocol capability discovery.\n *\n * @example ['acp', 'mcp']\n */\n protocols?: string[];\n\n /**\n * ACP (Agent Client Protocol) capability details.\n * Only present if 'acp' is in the protocols array.\n */\n acp?: ACPCapability;\n\n _meta?: Meta;\n}\n\n/**\n * ACP capability advertisement.\n * Describes what ACP features an agent supports.\n */\nexport interface ACPCapability {\n /** ACP protocol version supported (e.g., '2024-10-07') */\n version: string;\n /** ACP features supported by this agent */\n features?: string[];\n _meta?: Meta;\n}\n\n/** A participant in the MAP protocol */\nexport interface Participant {\n id: ParticipantId;\n type: ParticipantType;\n name?: string;\n capabilities?: ParticipantCapabilities;\n transport?: TransportType;\n sessionId?: SessionId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Agent Types\n// =============================================================================\n\n/**\n * State of an agent.\n * Standard states are enumerated; custom states use 'x-' prefix.\n */\nexport type AgentState =\n | 'registered'\n | 'active'\n | 'busy'\n | 'idle'\n | 'suspended'\n | 'stopping'\n | 'stopped'\n | 'failed'\n | 'orphaned'\n | `x-${string}`;\n\n/** Type of relationship between agents */\nexport type AgentRelationshipType = 'peer' | 'supervisor' | 'supervised' | 'collaborator';\n\n/** A relationship between agents */\nexport interface AgentRelationship {\n type: AgentRelationshipType;\n agentId: AgentId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/** Lifecycle metadata for an agent */\nexport interface AgentLifecycle {\n createdAt?: Timestamp;\n startedAt?: Timestamp;\n stoppedAt?: Timestamp;\n lastActiveAt?: Timestamp;\n orphanedAt?: Timestamp;\n exitCode?: number;\n exitReason?: string;\n _meta?: Meta;\n}\n\n/** Who can see this agent */\nexport type AgentVisibility = 'public' | 'parent-only' | 'scope' | 'system';\n\n/** An agent in the multi-agent system */\nexport interface Agent {\n id: AgentId;\n\n /**\n * The participant that owns/controls this agent's connection.\n * Used for message routing and cleanup on disconnect.\n *\n * - Non-null: Agent is owned by the specified participant\n * - null: Agent is orphaned (owner disconnected with 'orphan' policy)\n */\n ownerId: ParticipantId | null;\n\n name?: string;\n description?: string;\n\n /** Parent agent ID (for spawned agents) */\n parent?: AgentId;\n\n /** Child agent IDs (populated when queried with include.children) */\n children?: AgentId[];\n\n relationships?: AgentRelationship[];\n state: AgentState;\n role?: string;\n scopes?: ScopeId[];\n\n /**\n * Simple visibility setting (legacy).\n * @deprecated Use permissionOverrides.canSee.agents for more granular control\n */\n visibility?: AgentVisibility;\n\n /**\n * Per-agent permission overrides.\n * Merged on top of role-based defaults from system configuration.\n * Only include fields that differ from the role default.\n *\n * @example\n * ```typescript\n * // Agent that accepts messages from clients (unlike role default)\n * permissionOverrides: {\n * acceptsFrom: { clients: 'all' }\n * }\n * ```\n */\n permissionOverrides?: Partial<AgentPermissions>;\n\n lifecycle?: AgentLifecycle;\n capabilities?: ParticipantCapabilities;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Check if an agent is orphaned (owner disconnected).\n * Orphaned agents have `ownerId === null`.\n */\nexport function isOrphanedAgent(agent: Agent): boolean {\n return agent.ownerId === null;\n}\n\n// =============================================================================\n// Agent Permission Types\n// =============================================================================\n\n/**\n * Rule for which agents this agent can see.\n * - 'all': Can see any agent in the system\n * - 'hierarchy': Can see parent, children, ancestors, descendants\n * - 'scoped': Can see agents in the same scopes\n * - 'direct': Can only see explicitly included agents\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentVisibilityRule =\n | 'all'\n | 'hierarchy'\n | 'scoped'\n | 'direct'\n | { include: AgentId[] };\n\n/**\n * Rule for which scopes this agent can see.\n * - 'all': Can see any scope\n * - 'member': Can only see scopes they're a member of\n * - { include: [...] }: Explicit allowlist of scope IDs\n */\nexport type ScopeVisibilityRule =\n | 'all'\n | 'member'\n | { include: ScopeId[] };\n\n/**\n * Rule for how much agent hierarchy structure this agent can see.\n * - 'full': Can see the full agent hierarchy tree\n * - 'local': Can see immediate parent and children only\n * - 'none': Cannot see hierarchy relationships\n */\nexport type StructureVisibilityRule = 'full' | 'local' | 'none';\n\n/**\n * Rule for which agents this agent can send messages to.\n * - 'all': Can message any agent\n * - 'hierarchy': Can message parent, children, ancestors, descendants\n * - 'scoped': Can message agents in the same scopes\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentMessagingRule =\n | 'all'\n | 'hierarchy'\n | 'scoped'\n | { include: AgentId[] };\n\n/**\n * Rule for which scopes this agent can send messages to.\n * - 'all': Can send to any scope\n * - 'member': Can only send to scopes they're a member of\n * - { include: [...] }: Explicit allowlist of scope IDs\n */\nexport type ScopeMessagingRule =\n | 'all'\n | 'member'\n | { include: ScopeId[] };\n\n/**\n * Rule for which agents this agent accepts messages from.\n * - 'all': Accepts from any agent\n * - 'hierarchy': Accepts from parent, children, ancestors, descendants\n * - 'scoped': Accepts from agents in the same scopes\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentAcceptanceRule =\n | 'all'\n | 'hierarchy'\n | 'scoped'\n | { include: AgentId[] };\n\n/**\n * Rule for which clients this agent accepts messages from.\n * - 'all': Accepts from any client\n * - 'none': Does not accept from any client\n * - { include: [...] }: Explicit allowlist of participant IDs\n */\nexport type ClientAcceptanceRule =\n | 'all'\n | 'none'\n | { include: ParticipantId[] };\n\n/**\n * Rule for which federated systems this agent accepts messages from.\n * - 'all': Accepts from any federated system\n * - 'none': Does not accept from any federated system\n * - { include: [...] }: Explicit allowlist of system IDs\n */\nexport type SystemAcceptanceRule =\n | 'all'\n | 'none'\n | { include: string[] };\n\n/**\n * Permission configuration for an agent.\n * Defines what the agent can see, who it can message, and who it accepts messages from.\n *\n * Used in two ways:\n * 1. As role-based defaults in system configuration\n * 2. As per-agent overrides via Agent.permissionOverrides\n *\n * @example\n * ```typescript\n * const workerPermissions: AgentPermissions = {\n * canSee: {\n * agents: 'hierarchy',\n * scopes: 'member',\n * structure: 'local',\n * },\n * canMessage: {\n * agents: 'hierarchy',\n * scopes: 'member',\n * },\n * acceptsFrom: {\n * agents: 'hierarchy',\n * clients: 'none',\n * systems: 'none',\n * },\n * };\n * ```\n */\nexport interface AgentPermissions {\n /** Rules for what this agent can see */\n canSee?: {\n /** Which agents this agent can see */\n agents?: AgentVisibilityRule;\n /** Which scopes this agent can see */\n scopes?: ScopeVisibilityRule;\n /** How much hierarchy structure this agent can see */\n structure?: StructureVisibilityRule;\n };\n /** Rules for who this agent can send messages to */\n canMessage?: {\n /** Which agents this agent can message */\n agents?: AgentMessagingRule;\n /** Which scopes this agent can send to */\n scopes?: ScopeMessagingRule;\n };\n /** Rules for who this agent accepts messages from */\n acceptsFrom?: {\n /** Which agents this agent accepts messages from */\n agents?: AgentAcceptanceRule;\n /** Which clients this agent accepts messages from */\n clients?: ClientAcceptanceRule;\n /** Which federated systems this agent accepts messages from */\n systems?: SystemAcceptanceRule;\n };\n}\n\n/**\n * System-level configuration for agent permissions.\n * Defines default permissions and role-based permission templates.\n *\n * Resolution order:\n * 1. Start with defaultPermissions\n * 2. If agent has a role, deep merge rolePermissions[role]\n * 3. Deep merge agent.permissionOverrides\n *\n * @example\n * ```typescript\n * const config: AgentPermissionConfig = {\n * defaultPermissions: {\n * canSee: { agents: 'hierarchy', scopes: 'member', structure: 'local' },\n * canMessage: { agents: 'hierarchy', scopes: 'member' },\n * acceptsFrom: { agents: 'hierarchy', clients: 'none', systems: 'none' },\n * },\n * rolePermissions: {\n * coordinator: {\n * canSee: { agents: 'all', scopes: 'all', structure: 'full' },\n * canMessage: { agents: 'all', scopes: 'all' },\n * acceptsFrom: { agents: 'all', clients: 'all', systems: 'none' },\n * },\n * },\n * };\n * ```\n */\nexport interface AgentPermissionConfig {\n /** Default permissions for agents without a role or role-specific config */\n defaultPermissions: AgentPermissions;\n /** Role-based permission templates */\n rolePermissions: Record<string, AgentPermissions>;\n}\n\n// =============================================================================\n// Addressing Types\n// =============================================================================\n\n/** Address a single agent directly */\nexport interface DirectAddress {\n agent: AgentId;\n}\n\n/** Address multiple agents */\nexport interface MultiAddress {\n agents: AgentId[];\n}\n\n/** Address all agents in a scope */\nexport interface ScopeAddress {\n scope: ScopeId;\n}\n\n/** Address agents by role, optionally within a scope */\nexport interface RoleAddress {\n role: string;\n within?: ScopeId;\n}\n\n/** Address relative to sender in hierarchy */\nexport interface HierarchicalAddress {\n parent?: true;\n children?: true;\n ancestors?: true;\n descendants?: true;\n siblings?: true;\n depth?: number;\n}\n\n/** Address all agents in the system */\nexport interface BroadcastAddress {\n broadcast: true;\n}\n\n/** Address the system/router itself */\nexport interface SystemAddress {\n system: true;\n}\n\n/** Address any participant by ID or category */\nexport interface ParticipantAddress {\n participant?: ParticipantId;\n participants?: 'all' | 'agents' | 'clients';\n}\n\n/** Address an agent in a federated system */\nexport interface FederatedAddress {\n system: string;\n agent: AgentId;\n}\n\n/** Flexible addressing for any topology */\nexport type Address =\n | string\n | DirectAddress\n | MultiAddress\n | ScopeAddress\n | RoleAddress\n | HierarchicalAddress\n | BroadcastAddress\n | SystemAddress\n | ParticipantAddress\n | FederatedAddress;\n\n// =============================================================================\n// Message Types\n// =============================================================================\n\n/** Message priority */\nexport type MessagePriority = 'urgent' | 'high' | 'normal' | 'low';\n\n/** Message delivery guarantees */\nexport type DeliverySemantics = 'fire-and-forget' | 'acknowledged' | 'guaranteed';\n\n/** Relationship context for the message */\nexport type MessageRelationship = 'parent-to-child' | 'child-to-parent' | 'peer' | 'broadcast';\n\n/** Metadata for a message */\nexport interface MessageMeta {\n timestamp?: Timestamp;\n relationship?: MessageRelationship;\n expectsResponse?: boolean;\n correlationId?: CorrelationId;\n isResult?: boolean;\n priority?: MessagePriority;\n delivery?: DeliverySemantics;\n ttlMs?: number;\n /**\n * Protocol identifier for tunneled protocols (e.g., 'acp').\n * Used to identify the protocol of the payload.\n */\n protocol?: string;\n _meta?: Meta;\n}\n\n/** A message in the multi-agent system */\nexport interface Message<T = unknown> {\n id: MessageId;\n from: ParticipantId;\n to: Address;\n timestamp: Timestamp;\n payload?: T;\n meta?: MessageMeta;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Scope Types\n// =============================================================================\n\n/** Policy for joining a scope */\nexport type JoinPolicy = 'open' | 'invite' | 'role' | 'system';\n\n/** Who can see the scope exists and its members */\nexport type ScopeVisibility = 'public' | 'members' | 'system';\n\n/** Who can see messages sent to this scope */\nexport type MessageVisibility = 'public' | 'members' | 'system';\n\n/** Who can send messages to this scope */\nexport type SendPolicy = 'members' | 'any';\n\n/** A scope for grouping agents */\nexport interface Scope {\n id: ScopeId;\n name?: string;\n description?: string;\n parent?: ScopeId;\n joinPolicy?: JoinPolicy;\n autoJoinRoles?: string[];\n visibility?: ScopeVisibility;\n messageVisibility?: MessageVisibility;\n sendPolicy?: SendPolicy;\n persistent?: boolean;\n autoDelete?: boolean;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Event Types\n// =============================================================================\n\n/**\n * Event type constants.\n * Use these instead of string literals for type safety and autocomplete.\n */\nexport const EVENT_TYPES = {\n // Agent lifecycle events\n AGENT_REGISTERED: 'agent_registered',\n AGENT_UNREGISTERED: 'agent_unregistered',\n AGENT_STATE_CHANGED: 'agent_state_changed',\n AGENT_ORPHANED: 'agent_orphaned',\n\n // Participant lifecycle events\n PARTICIPANT_CONNECTED: 'participant_connected',\n PARTICIPANT_DISCONNECTED: 'participant_disconnected',\n\n // Message events\n MESSAGE_SENT: 'message_sent',\n MESSAGE_DELIVERED: 'message_delivered',\n MESSAGE_FAILED: 'message_failed',\n\n // Scope events\n SCOPE_CREATED: 'scope_created',\n SCOPE_DELETED: 'scope_deleted',\n SCOPE_MEMBER_JOINED: 'scope_member_joined',\n SCOPE_MEMBER_LEFT: 'scope_member_left',\n\n // Permission events\n PERMISSIONS_CLIENT_UPDATED: 'permissions_client_updated',\n PERMISSIONS_AGENT_UPDATED: 'permissions_agent_updated',\n\n // System events\n SYSTEM_ERROR: 'system_error',\n\n // Federation events\n FEDERATION_CONNECTED: 'federation_connected',\n FEDERATION_DISCONNECTED: 'federation_disconnected',\n} as const;\n\n/** Type of system event (derived from EVENT_TYPES) */\nexport type EventType = (typeof EVENT_TYPES)[keyof typeof EVENT_TYPES];\n\n/**\n * Input for creating events.\n * id and timestamp are optional - server generates them.\n */\nexport interface EventInput {\n type: EventType;\n timestamp?: Timestamp;\n source?: ParticipantId;\n data?: Record<string, unknown>;\n causedBy?: string[];\n _meta?: Meta;\n}\n\n/**\n * Wire event as sent to clients.\n * id and timestamp are always present.\n */\nexport interface Event {\n id: string;\n type: EventType;\n timestamp: Timestamp;\n source?: ParticipantId;\n data?: Record<string, unknown>;\n causedBy?: string[];\n _meta?: Meta;\n}\n\n/** Helper to create events with auto-generated id and timestamp */\nexport function createEvent(input: EventInput): Event {\n return {\n id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: input.timestamp ?? Date.now(),\n type: input.type,\n source: input.source,\n data: input.data,\n causedBy: input.causedBy,\n _meta: input._meta,\n };\n}\n\n// =============================================================================\n// Subscription Types\n// =============================================================================\n\n/**\n * Filter for event subscriptions.\n *\n * ## Combination Logic\n *\n * All specified fields are combined with **AND** logic:\n * - An event must match ALL specified criteria to be delivered\n * - Within array fields, values are combined with **OR** logic\n * - Empty arrays (`[]`) are treated as \"no filter\" (matches any)\n * - Undefined/omitted fields are treated as \"no filter\" (matches any)\n *\n * ## Examples\n *\n * ```typescript\n * // Match agent_registered OR agent_unregistered events from agent-1 OR agent-2\n * {\n * eventTypes: ['agent_registered', 'agent_unregistered'],\n * fromAgents: ['agent-1', 'agent-2']\n * }\n *\n * // Match any event from agents with role 'worker' OR 'supervisor'\n * { fromRoles: ['worker', 'supervisor'] }\n *\n * // Match scope events in scope-1 with metadata containing priority='high'\n * {\n * scopes: ['scope-1'],\n * metadataMatch: { priority: 'high' }\n * }\n * ```\n *\n * ## Field Semantics\n *\n * | Field | Within-field | Cross-field | Description |\n * |-------|--------------|-------------|-------------|\n * | `eventTypes` | OR | AND | Event type is one of the listed types |\n * | `fromAgents` | OR | AND | Event source is one of the listed agents |\n * | `fromRoles` | OR | AND | Event source agent has one of the listed roles |\n * | `roles` | OR | AND | Event relates to agents with one of the listed roles |\n * | `scopes` | OR | AND | Event relates to one of the listed scopes |\n * | `priorities` | OR | AND | Message priority is one of the listed levels |\n * | `correlationIds` | OR | AND | Event has one of the listed correlation IDs |\n * | `metadataMatch` | AND | AND | Event metadata contains ALL specified key-value pairs |\n */\nexport interface SubscriptionFilter {\n /**\n * Filter by roles the event relates to.\n * Matches events where the related agent has one of these roles.\n */\n roles?: string[];\n\n /**\n * Filter by scopes the event relates to.\n * Matches events with scopeId in event.data matching one of these.\n */\n scopes?: ScopeId[];\n\n /**\n * Filter by event type.\n * Use EVENT_TYPES constants: `eventTypes: [EVENT_TYPES.AGENT_REGISTERED]`\n */\n eventTypes?: EventType[];\n\n /**\n * Filter by message priority (for message events).\n */\n priorities?: MessagePriority[];\n\n /**\n * Filter by correlation ID.\n * Matches events with correlationId in event.data matching one of these.\n */\n correlationIds?: CorrelationId[];\n\n /**\n * Filter by source agent ID.\n * Matches events where event.source is one of these agent IDs.\n */\n fromAgents?: AgentId[];\n\n /**\n * Filter by source agent role.\n * Matches events where the source agent has one of these roles.\n */\n fromRoles?: string[];\n\n /**\n * Filter by metadata key-value pairs.\n * All specified pairs must match (AND logic within this field).\n * Checks event.data.metadata for matching values.\n */\n metadataMatch?: Record<string, unknown>;\n\n _meta?: Meta;\n}\n\n/** Options for subscriptions */\nexport interface SubscriptionOptions {\n /** Include full payloads in message events (default: false) */\n includeMessagePayloads?: boolean;\n /** Exclude events from own actions (default: false) */\n excludeOwnEvents?: boolean;\n}\n\n/** An active event subscription */\nexport interface Subscription {\n id: SubscriptionId;\n filter?: SubscriptionFilter;\n options?: SubscriptionOptions;\n createdAt?: Timestamp;\n replayFrom?: Timestamp | string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Subscription Backpressure Types\n// =============================================================================\n\n/**\n * State of a subscription's event delivery.\n * - 'active': Events are being delivered normally\n * - 'paused': Events are buffered but not delivered to the iterator\n * - 'closed': Subscription is terminated\n */\nexport type SubscriptionState = 'active' | 'paused' | 'closed';\n\n/**\n * Information about events dropped due to buffer overflow.\n * Passed to overflow handlers when events cannot be buffered.\n */\nexport interface OverflowInfo {\n /** Number of events dropped in this overflow batch */\n eventsDropped: number;\n /** Event ID of oldest dropped event (if available) */\n oldestDroppedId?: string;\n /** Event ID of newest dropped event (if available) */\n newestDroppedId?: string;\n /** Timestamp when overflow occurred */\n timestamp: Timestamp;\n /** Total events dropped since subscription started */\n totalDropped: number;\n}\n\n/** Handler called when subscription buffer overflows */\nexport type OverflowHandler = (info: OverflowInfo) => void;\n\n/**\n * Parameters for acknowledging received events.\n * Sent as a notification to inform the server of client progress.\n * Enables optional server-side flow control.\n */\nexport interface SubscriptionAckParams {\n /** Subscription being acknowledged */\n subscriptionId: SubscriptionId;\n /** Acknowledge all events up to and including this sequence number */\n upToSequence: number;\n _meta?: Meta;\n}\n\n/** Notification for subscription acknowledgment */\nexport interface SubscriptionAckNotification extends MAPNotificationBase<SubscriptionAckParams> {\n method: 'map/subscribe.ack';\n params: SubscriptionAckParams;\n}\n\n// =============================================================================\n// Message Event Data Types\n// =============================================================================\n\n/** Data for message_sent events (no payload for privacy) */\nexport interface MessageSentEventData {\n messageId: MessageId;\n from: ParticipantId;\n to: Address;\n timestamp: Timestamp;\n correlationId?: CorrelationId;\n priority?: MessagePriority;\n}\n\n/** Data for message_delivered events (no payload for privacy) */\nexport interface MessageDeliveredEventData {\n messageId: MessageId;\n from: ParticipantId;\n deliveredTo: ParticipantId[];\n timestamp: Timestamp;\n correlationId?: CorrelationId;\n}\n\n/** Data for message_failed events */\nexport interface MessageFailedEventData {\n messageId: MessageId;\n from: ParticipantId;\n to: Address;\n reason: string;\n code?: number;\n}\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/** Category of error for handling decisions */\nexport type ErrorCategory =\n | 'protocol'\n | 'auth'\n | 'routing'\n | 'agent'\n | 'resource'\n | 'federation'\n | 'internal';\n\n/** Structured error data */\nexport interface MAPErrorData {\n category?: ErrorCategory;\n retryable?: boolean;\n retryAfterMs?: number;\n details?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/** JSON-RPC 2.0 error object */\nexport interface MAPError {\n code: number;\n message: string;\n data?: MAPErrorData;\n}\n\n// =============================================================================\n// JSON-RPC Base Types\n// =============================================================================\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = '2.0' as const;\n\n/** Base JSON-RPC request */\nexport interface MAPRequestBase<TParams = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/** Base JSON-RPC response (success) */\nexport interface MAPResponseSuccess<T = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n result: T;\n}\n\n/** Base JSON-RPC response (error) */\nexport interface MAPResponseError {\n jsonrpc: '2.0';\n id: RequestId;\n error: MAPError;\n}\n\n/** JSON-RPC response (success or error) */\nexport type MAPResponse<T = unknown> = MAPResponseSuccess<T> | MAPResponseError;\n\n/** Base JSON-RPC notification */\nexport interface MAPNotificationBase<TParams = unknown> {\n jsonrpc: '2.0';\n method: string;\n params?: TParams;\n}\n\n// =============================================================================\n// Session Types\n// =============================================================================\n\nexport interface SessionInfo {\n id: SessionId;\n createdAt: Timestamp;\n lastActiveAt?: Timestamp;\n closedAt?: Timestamp;\n}\n\n// =============================================================================\n// Authentication Types\n// =============================================================================\n\n/** Standard authentication methods defined by the protocol */\nexport type StandardAuthMethod = 'bearer' | 'api-key' | 'mtls' | 'none';\n\n/** Authentication method - standard or custom (x- prefixed) */\nexport type AuthMethod = StandardAuthMethod | `x-${string}`;\n\n/** Authentication error codes */\nexport type AuthErrorCode =\n | 'invalid_credentials'\n | 'expired'\n | 'insufficient_scope'\n | 'method_not_supported'\n | 'auth_required';\n\n/**\n * Client-provided authentication credentials.\n * Used in connect requests and authenticate calls.\n */\nexport interface AuthCredentials {\n /** The authentication method being used */\n method: AuthMethod;\n /** The credential value (token, API key, etc.) */\n credential?: string;\n /** Method-specific additional data */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Server-advertised authentication capabilities.\n * Included in connect response when auth is required.\n */\nexport interface ServerAuthCapabilities {\n /** Supported authentication methods (in preference order) */\n methods: AuthMethod[];\n /** Is authentication required to proceed? */\n required: boolean;\n /** OAuth2 authorization server metadata URL (RFC 8414) */\n oauth2MetadataUrl?: string;\n /** JWKS URL for local JWT verification (RFC 7517) */\n jwksUrl?: string;\n /** Realm identifier for this server */\n realm?: string;\n}\n\n/**\n * Authenticated principal information.\n * Returned after successful authentication.\n */\nexport interface AuthPrincipal {\n /** Unique identifier for this principal */\n id: string;\n /** Token issuer (for federated auth) */\n issuer?: string;\n /** Additional claims from the credential */\n claims?: Record<string, unknown>;\n /** Token expiration timestamp (Unix ms) - from JWT exp claim */\n expiresAt?: number;\n}\n\n/**\n * Authentication error details.\n */\nexport interface AuthError {\n /** Error code */\n code: AuthErrorCode;\n /** Human-readable error message */\n message: string;\n}\n\n/**\n * Result of an authentication attempt.\n */\nexport interface AuthResult {\n /** Whether authentication succeeded */\n success: boolean;\n /** Authenticated principal (if success) */\n principal?: AuthPrincipal;\n /** Error details (if failure) */\n error?: AuthError;\n}\n\n/**\n * Authentication for federated connections.\n */\nexport interface FederationAuth {\n method: 'bearer' | 'api-key' | 'mtls';\n credentials?: string;\n}\n\n// =============================================================================\n// Connect Types\n// =============================================================================\n\n/** Policy for handling unexpected disconnection */\nexport interface DisconnectPolicy {\n /** What happens to agents on disconnect */\n agentBehavior: 'unregister' | 'orphan' | 'grace-period';\n /** Grace period before unregistering (ms) */\n gracePeriodMs?: number;\n /** Emit events to subscribers */\n notifySubscribers?: boolean;\n}\n\nexport interface ConnectRequestParams {\n protocolVersion: ProtocolVersion;\n participantType: ParticipantType;\n participantId?: ParticipantId;\n name?: string;\n capabilities?: ParticipantCapabilities;\n sessionId?: SessionId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n /** Reclaim orphaned agents from previous connection */\n reclaimAgents?: AgentId[];\n /** Policy for unexpected disconnect */\n disconnectPolicy?: DisconnectPolicy;\n /** Authentication credentials */\n auth?: AuthCredentials;\n _meta?: Meta;\n}\n\nexport interface ConnectRequest extends MAPRequestBase<ConnectRequestParams> {\n method: 'map/connect';\n params: ConnectRequestParams;\n}\n\nexport interface ConnectResponseResult {\n protocolVersion: ProtocolVersion;\n sessionId: SessionId;\n participantId: ParticipantId;\n capabilities: ParticipantCapabilities;\n systemInfo?: {\n name?: string;\n version?: string;\n };\n /** Is this a reconnection? */\n reconnected?: boolean;\n /** Reclaimed agents */\n reclaimedAgents?: Agent[];\n /** Currently owned agents */\n ownedAgents?: AgentId[];\n /** Authenticated principal (if auth succeeded) */\n principal?: AuthPrincipal;\n /** Auth required but not provided - client should authenticate */\n authRequired?: ServerAuthCapabilities;\n /** Token to resume this session later */\n resumeToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Disconnect Types\n// =============================================================================\n\nexport interface DisconnectRequestParams {\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface DisconnectRequest extends MAPRequestBase<DisconnectRequestParams> {\n method: 'map/disconnect';\n params?: DisconnectRequestParams;\n}\n\nexport interface DisconnectResponseResult {\n session: SessionInfo;\n /** Token to resume this session later */\n resumeToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Session Request/Response Types\n// =============================================================================\n\nexport interface SessionListRequestParams {\n _meta?: Meta;\n}\n\nexport interface SessionListRequest extends MAPRequestBase<SessionListRequestParams> {\n method: 'map/session/list';\n params?: SessionListRequestParams;\n}\n\nexport interface SessionListResponseResult {\n sessions: SessionInfo[];\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequestParams {\n sessionId: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequest extends MAPRequestBase<SessionLoadRequestParams> {\n method: 'map/session/load';\n params: SessionLoadRequestParams;\n}\n\nexport interface SessionLoadResponseResult {\n sessionId: SessionId;\n restored: boolean;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequestParams {\n sessionId?: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequest extends MAPRequestBase<SessionCloseRequestParams> {\n method: 'map/session/close';\n params?: SessionCloseRequestParams;\n}\n\nexport interface SessionCloseResponseResult {\n session: SessionInfo;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Agents Request/Response Types\n// =============================================================================\n\nexport interface AgentsListFilter {\n states?: AgentState[];\n roles?: string[];\n scopes?: ScopeId[];\n parent?: AgentId;\n hasChildren?: boolean;\n ownerId?: ParticipantId;\n}\n\nexport interface AgentsListRequestParams {\n filter?: AgentsListFilter;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsListRequest extends MAPRequestBase<AgentsListRequestParams> {\n method: 'map/agents/list';\n params?: AgentsListRequestParams;\n}\n\nexport interface AgentsListResponseResult {\n agents: Agent[];\n nextCursor?: string;\n _meta?: Meta;\n}\n\n/** Options for expanding related agents */\nexport interface AgentIncludeOptions {\n parent?: boolean;\n children?: boolean;\n siblings?: boolean;\n ancestors?: boolean;\n descendants?: boolean;\n maxDepth?: number;\n}\n\nexport interface AgentsGetRequestParams {\n agentId: AgentId;\n include?: AgentIncludeOptions;\n _meta?: Meta;\n}\n\nexport interface AgentsGetRequest extends MAPRequestBase<AgentsGetRequestParams> {\n method: 'map/agents/get';\n params: AgentsGetRequestParams;\n}\n\nexport interface AgentsGetResponseResult {\n agent: Agent;\n parent?: Agent;\n children?: Agent[];\n siblings?: Agent[];\n ancestors?: Agent[];\n descendants?: Agent[];\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n metadata?: Record<string, unknown>;\n /** Permission overrides merged on top of role-based defaults */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequest extends MAPRequestBase<AgentsRegisterRequestParams> {\n method: 'map/agents/register';\n params?: AgentsRegisterRequestParams;\n}\n\nexport interface AgentsRegisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequest extends MAPRequestBase<AgentsUnregisterRequestParams> {\n method: 'map/agents/unregister';\n params: AgentsUnregisterRequestParams;\n}\n\nexport interface AgentsUnregisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequestParams {\n agentId: AgentId;\n state?: AgentState;\n metadata?: Record<string, unknown>;\n /**\n * Permission overrides to apply to the agent.\n * Merged on top of role-based defaults.\n */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequest extends MAPRequestBase<AgentsUpdateRequestParams> {\n method: 'map/agents/update';\n params: AgentsUpdateRequestParams;\n}\n\nexport interface AgentsUpdateResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n initialMessage?: Message;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequest extends MAPRequestBase<AgentsSpawnRequestParams> {\n method: 'map/agents/spawn';\n params?: AgentsSpawnRequestParams;\n}\n\nexport interface AgentsSpawnResponseResult {\n agent: Agent;\n messageId?: MessageId;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequestParams {\n agentId: AgentId;\n reason?: string;\n force?: boolean;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequest extends MAPRequestBase<AgentsStopRequestParams> {\n method: 'map/agents/stop';\n params: AgentsStopRequestParams;\n}\n\nexport interface AgentsStopResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequest extends MAPRequestBase<AgentsSuspendRequestParams> {\n method: 'map/agents/suspend';\n params: AgentsSuspendRequestParams;\n}\n\nexport interface AgentsSuspendResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequestParams {\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequest extends MAPRequestBase<AgentsResumeRequestParams> {\n method: 'map/agents/resume';\n params: AgentsResumeRequestParams;\n}\n\nexport interface AgentsResumeResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Send Types\n// =============================================================================\n\nexport interface SendRequestParams {\n to: Address;\n payload?: unknown;\n meta?: MessageMeta;\n _meta?: Meta;\n}\n\nexport interface SendRequest extends MAPRequestBase<SendRequestParams> {\n method: 'map/send';\n params: SendRequestParams;\n}\n\nexport interface SendResponseResult {\n messageId: MessageId;\n delivered?: ParticipantId[];\n _meta?: Meta;\n}\n\n// =============================================================================\n// Subscribe Types\n// =============================================================================\n\nexport interface SubscribeRequestParams {\n filter?: SubscriptionFilter;\n options?: SubscriptionOptions;\n replayFrom?: Timestamp | string;\n _meta?: Meta;\n}\n\nexport interface SubscribeRequest extends MAPRequestBase<SubscribeRequestParams> {\n method: 'map/subscribe';\n params?: SubscribeRequestParams;\n}\n\nexport interface SubscribeResponseResult {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequestParams {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequest extends MAPRequestBase<UnsubscribeRequestParams> {\n method: 'map/unsubscribe';\n params: UnsubscribeRequestParams;\n}\n\nexport interface UnsubscribeResponseResult {\n subscription: {\n id: SubscriptionId;\n closedAt: Timestamp;\n };\n _meta?: Meta;\n}\n\n// =============================================================================\n// Replay Types\n// =============================================================================\n\n/**\n * A replayed event with its envelope metadata.\n */\nexport interface ReplayedEvent {\n /** Globally unique event ID (ULID format) */\n eventId: string;\n /** Server timestamp when event was originally processed */\n timestamp: Timestamp;\n /** Event IDs that causally precede this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n}\n\n/**\n * Parameters for replaying historical events.\n *\n * Uses keyset pagination with `afterEventId` - pass the last eventId\n * from the previous response to get the next page of results.\n *\n * @example\n * ```typescript\n * // Replay from a specific point\n * const page1 = await client.replay({ limit: 100 });\n * const page2 = await client.replay({\n * afterEventId: page1.events.at(-1)?.eventId,\n * limit: 100\n * });\n * ```\n */\nexport interface ReplayRequestParams {\n /**\n * Start after this eventId (exclusive).\n * Used for keyset pagination - pass the last eventId from previous response.\n */\n afterEventId?: string;\n\n /**\n * Alternative: start from this timestamp (inclusive).\n * If both afterEventId and fromTimestamp are provided, afterEventId takes precedence.\n */\n fromTimestamp?: Timestamp;\n\n /**\n * End at this timestamp (inclusive).\n * If not provided, replays up to the most recent event.\n */\n toTimestamp?: Timestamp;\n\n /**\n * Filter events (same as subscription filter).\n */\n filter?: SubscriptionFilter;\n\n /**\n * Maximum number of events to return.\n * Default: 100, Maximum: 1000\n */\n limit?: number;\n\n _meta?: Meta;\n}\n\nexport interface ReplayRequest extends MAPRequestBase<ReplayRequestParams> {\n method: 'map/replay';\n params?: ReplayRequestParams;\n}\n\nexport interface ReplayResponseResult {\n /** Replayed events in chronological order */\n events: ReplayedEvent[];\n\n /** Whether more events exist after the last returned event */\n hasMore: boolean;\n\n /**\n * Total count of matching events (if known).\n * May be omitted for performance reasons on large result sets.\n */\n totalCount?: number;\n\n _meta?: Meta;\n}\n\n// =============================================================================\n// Auth Types\n// =============================================================================\n\nexport interface AuthRefreshRequestParams {\n refreshToken: string;\n _meta?: Meta;\n}\n\nexport interface AuthRefreshRequest extends MAPRequestBase<AuthRefreshRequestParams> {\n method: 'map/auth/refresh';\n params: AuthRefreshRequestParams;\n}\n\nexport interface AuthRefreshResponseResult {\n accessToken: string;\n expiresAt: Timestamp;\n refreshToken?: string;\n _meta?: Meta;\n}\n\n/**\n * Parameters for map/authenticate request.\n * Used when auth negotiation is required after initial connect.\n */\nexport interface AuthenticateRequestParams {\n /** The authentication method being used */\n method: AuthMethod;\n /** The credential value (token, API key, etc.) */\n credential?: string;\n /** Method-specific additional data */\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface AuthenticateRequest extends MAPRequestBase<AuthenticateRequestParams> {\n method: 'map/authenticate';\n params: AuthenticateRequestParams;\n}\n\n/**\n * Response from map/authenticate request.\n */\nexport interface AuthenticateResponseResult {\n /** Whether authentication succeeded */\n success: boolean;\n /** Session ID (if auth succeeded) */\n sessionId?: SessionId;\n /** Participant ID (if auth succeeded) */\n participantId?: ParticipantId;\n /** Authenticated principal (if auth succeeded) */\n principal?: AuthPrincipal;\n /** Error details (if auth failed) */\n error?: AuthError;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Scope Types\n// =============================================================================\n\nexport interface ScopesListRequestParams {\n parent?: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesListRequest extends MAPRequestBase<ScopesListRequestParams> {\n method: 'map/scopes/list';\n params?: ScopesListRequestParams;\n}\n\nexport interface ScopesListResponseResult {\n scopes: Scope[];\n _meta?: Meta;\n}\n\nexport interface ScopesGetRequestParams {\n scopeId: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesGetRequest extends MAPRequestBase<ScopesGetRequestParams> {\n method: 'map/scopes/get';\n params: ScopesGetRequestParams;\n}\n\nexport interface ScopesGetResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesCreateRequestParams {\n scopeId?: ScopeId;\n name?: string;\n description?: string;\n parent?: ScopeId;\n joinPolicy?: JoinPolicy;\n autoJoinRoles?: string[];\n visibility?: ScopeVisibility;\n messageVisibility?: MessageVisibility;\n sendPolicy?: SendPolicy;\n persistent?: boolean;\n autoDelete?: boolean;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface ScopesCreateRequest extends MAPRequestBase<ScopesCreateRequestParams> {\n method: 'map/scopes/create';\n params?: ScopesCreateRequestParams;\n}\n\nexport interface ScopesCreateResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesDeleteRequestParams {\n scopeId: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesDeleteRequest extends MAPRequestBase<ScopesDeleteRequestParams> {\n method: 'map/scopes/delete';\n params: ScopesDeleteRequestParams;\n}\n\nexport interface ScopesDeleteResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesJoinRequestParams {\n scopeId: ScopeId;\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface ScopesJoinRequest extends MAPRequestBase<ScopesJoinRequestParams> {\n method: 'map/scopes/join';\n params: ScopesJoinRequestParams;\n}\n\nexport interface ScopesJoinResponseResult {\n scope: Scope;\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface ScopesLeaveRequestParams {\n scopeId: ScopeId;\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface ScopesLeaveRequest extends MAPRequestBase<ScopesLeaveRequestParams> {\n method: 'map/scopes/leave';\n params: ScopesLeaveRequestParams;\n}\n\nexport interface ScopesLeaveResponseResult {\n scope: Scope;\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface ScopesMembersRequestParams {\n scopeId: ScopeId;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface ScopesMembersRequest extends MAPRequestBase<ScopesMembersRequestParams> {\n method: 'map/scopes/members';\n params: ScopesMembersRequestParams;\n}\n\nexport interface ScopesMembersResponseResult {\n members: AgentId[];\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Structure Graph Types\n// =============================================================================\n\nexport interface StructureGraphRequestParams {\n rootAgentId?: AgentId;\n depth?: number;\n includeRelationships?: boolean;\n _meta?: Meta;\n}\n\nexport interface StructureGraphRequest extends MAPRequestBase<StructureGraphRequestParams> {\n method: 'map/structure/graph';\n params?: StructureGraphRequestParams;\n}\n\nexport interface GraphEdge {\n from: AgentId;\n to: AgentId;\n type: 'parent-child' | 'peer' | 'supervisor' | 'collaborator';\n}\n\nexport interface StructureGraphResponseResult {\n nodes: Agent[];\n edges: GraphEdge[];\n _meta?: Meta;\n}\n\n// =============================================================================\n// Inject Types\n// =============================================================================\n\nexport type InjectDelivery = 'interrupt' | 'queue' | 'best-effort';\nexport type InjectDeliveryResult = 'interrupt' | 'queue' | 'message';\n\nexport interface InjectRequestParams {\n agentId: AgentId;\n content: unknown;\n delivery?: InjectDelivery;\n _meta?: Meta;\n}\n\nexport interface InjectRequest extends MAPRequestBase<InjectRequestParams> {\n method: 'map/inject';\n params: InjectRequestParams;\n}\n\nexport interface InjectResponseResult {\n injected: boolean;\n delivery?: InjectDeliveryResult;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Permission Update Types\n// =============================================================================\n\n/**\n * Parameters for updating client permissions.\n * Only system/admin participants can update client permissions.\n */\nexport interface PermissionsUpdateRequestParams {\n /** Client to update permissions for */\n clientId: ParticipantId;\n /** Partial permissions to merge with existing */\n permissions: Partial<ParticipantCapabilities>;\n _meta?: Meta;\n}\n\nexport interface PermissionsUpdateRequest extends MAPRequestBase<PermissionsUpdateRequestParams> {\n method: 'map/permissions/update';\n params: PermissionsUpdateRequestParams;\n}\n\nexport interface PermissionsUpdateResponseResult {\n /** Whether update was applied */\n success: boolean;\n /** Effective permissions after update */\n effectivePermissions: ParticipantCapabilities;\n _meta?: Meta;\n}\n\n/**\n * Event data for permissions_client_updated events.\n * Emitted when a client's permissions are changed.\n */\nexport interface PermissionsClientUpdatedEventData {\n /** Client whose permissions changed */\n clientId: ParticipantId;\n /** The permission changes that were applied */\n changes: Partial<ParticipantCapabilities>;\n /** Effective permissions after the update */\n effectivePermissions: ParticipantCapabilities;\n /** Participant who made the change */\n updatedBy: ParticipantId;\n}\n\n/**\n * Event data for permissions_agent_updated events.\n * Emitted when an agent's permission overrides are changed.\n */\nexport interface PermissionsAgentUpdatedEventData {\n /** Agent whose permissions changed */\n agentId: AgentId;\n /** The permission changes that were applied */\n changes: Partial<AgentPermissions>;\n /** Effective permissions after the update */\n effectivePermissions: AgentPermissions;\n /** Participant who made the change */\n updatedBy: ParticipantId;\n}\n\n// =============================================================================\n// Federation Types\n// =============================================================================\n\n/**\n * Metadata for federation routing and tracking.\n * Included in every message routed between federated systems.\n */\nexport interface FederationMetadata {\n /** System that originated this message */\n sourceSystem: string;\n /** Intended final destination system */\n targetSystem: string;\n /** Number of systems this message has traversed */\n hopCount: number;\n /** Maximum hops before rejection (prevents infinite loops) */\n maxHops?: number;\n /** Systems this message has traversed (for debugging/loop detection) */\n path?: string[];\n /** Timestamp when message was first sent (ms since epoch) */\n originTimestamp: Timestamp;\n /** Correlation ID for cross-system tracing */\n correlationId?: string;\n /**\n * Signature for integrity verification.\n * @todo Define signing algorithm and key management\n */\n signature?: string;\n}\n\n/**\n * Envelope for messages routed between federated systems.\n * Wraps the payload with routing metadata for tracking and loop prevention.\n *\n * @typeParam T - The payload type (typically Message)\n *\n * @example\n * ```typescript\n * const envelope: FederationEnvelope<Message> = {\n * payload: message,\n * federation: {\n * sourceSystem: 'alpha',\n * targetSystem: 'beta',\n * hopCount: 0,\n * originTimestamp: Date.now(),\n * },\n * };\n * ```\n */\nexport interface FederationEnvelope<T = unknown> {\n /** The payload being routed */\n payload: T;\n /** Federation routing metadata */\n federation: FederationMetadata;\n}\n\n/**\n * Configuration for federation routing behavior.\n * Used by gateways to control message routing policies.\n */\nexport interface FederationRoutingConfig {\n /** This system's identifier */\n systemId: string;\n /** Maximum hops to accept (default: 10) */\n maxHops?: number;\n /** Whether to track full path for debugging (default: false) */\n trackPath?: boolean;\n /** Systems we're willing to route to (undefined = all) */\n allowedTargets?: string[];\n /** Systems we accept routes from (undefined = all) */\n allowedSources?: string[];\n}\n\n// =============================================================================\n// Federation Reconnection Types\n// =============================================================================\n\n/**\n * Configuration for buffering messages during federation outages.\n * Messages are stored locally until the peer reconnects.\n */\nexport interface FederationBufferConfig {\n /** Enable buffering of messages during disconnection (default: true) */\n enabled?: boolean;\n /** Maximum number of messages to buffer per peer (default: 1000) */\n maxMessages?: number;\n /** Maximum buffer size in bytes per peer (default: 10MB) */\n maxBytes?: number;\n /** Time to retain buffered messages in ms (default: 1 hour) */\n retentionMs?: number;\n /** Strategy when buffer is full */\n overflowStrategy?: 'drop-oldest' | 'drop-newest' | 'reject';\n}\n\n/**\n * Configuration for replaying events from event store on reconnection.\n * Supplements buffer with persisted events.\n */\nexport interface FederationReplayConfig {\n /** Enable replay from event store on reconnection (default: true) */\n enabled?: boolean;\n /** Maximum time window for replay in ms (default: 1 hour) */\n maxReplayWindowMs?: number;\n /** Maximum number of events to replay (default: 10000) */\n maxReplayEvents?: number;\n /** Filter for events to replay (optional) */\n filter?: SubscriptionFilter;\n}\n\n/**\n * Type of gateway reconnection event.\n */\nexport type GatewayReconnectionEventType =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'reconnect_failed'\n | 'buffer_overflow'\n | 'replay_started'\n | 'replay_completed';\n\n/**\n * Event emitted during gateway reconnection lifecycle.\n */\nexport interface GatewayReconnectionEvent {\n /** Type of reconnection event */\n type: GatewayReconnectionEventType;\n /** Target system ID */\n systemId: string;\n /** Timestamp of the event */\n timestamp: Timestamp;\n /** Current reconnection attempt (for reconnecting events) */\n attempt?: number;\n /** Error message (for disconnected/reconnect_failed) */\n error?: string;\n /** Number of buffered messages (for buffer_overflow) */\n bufferedCount?: number;\n /** Number of events being replayed (for replay_started/completed) */\n replayCount?: number;\n /** Duration of outage in ms (for connected after reconnect) */\n outageDurationMs?: number;\n}\n\n/** Handler for gateway reconnection events */\nexport type GatewayReconnectionEventHandler = (event: GatewayReconnectionEvent) => void;\n\n/**\n * Options for gateway connection with reconnection support.\n * Extends base connection options with federation-specific settings.\n */\nexport interface GatewayReconnectionOptions {\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Initial delay before first reconnection attempt in ms (default: 1000) */\n initialDelayMs?: number;\n /** Maximum delay between reconnection attempts in ms (default: 30000) */\n maxDelayMs?: number;\n /** Backoff multiplier for exponential backoff (default: 2) */\n backoffMultiplier?: number;\n /** Maximum number of reconnection attempts (default: Infinity) */\n maxRetries?: number;\n /** Add random jitter to delays (default: true) */\n jitter?: boolean;\n /** Buffer configuration for outages */\n buffer?: FederationBufferConfig;\n /** Replay configuration for event store recovery */\n replay?: FederationReplayConfig;\n /** Handler for reconnection lifecycle events */\n onReconnectionEvent?: GatewayReconnectionEventHandler;\n}\n\nexport interface FederationConnectRequestParams {\n systemId: string;\n endpoint: string;\n auth?: FederationAuth;\n _meta?: Meta;\n}\n\nexport interface FederationConnectRequest extends MAPRequestBase<FederationConnectRequestParams> {\n method: 'map/federation/connect';\n params: FederationConnectRequestParams;\n}\n\nexport interface FederationConnectResponseResult {\n connected: boolean;\n systemInfo?: {\n name?: string;\n version?: string;\n capabilities?: ParticipantCapabilities;\n };\n _meta?: Meta;\n}\n\nexport interface FederationRouteRequestParams {\n /** Target system ID (for immediate next hop) */\n systemId: string;\n /**\n * Wrapped message with federation metadata.\n * Use this for new implementations.\n */\n envelope?: FederationEnvelope<Message>;\n /**\n * Raw message (legacy format).\n * @deprecated Use envelope instead for proper routing metadata\n */\n message?: Message;\n _meta?: Meta;\n}\n\nexport interface FederationRouteRequest extends MAPRequestBase<FederationRouteRequestParams> {\n method: 'map/federation/route';\n params: FederationRouteRequestParams;\n}\n\nexport interface FederationRouteResponseResult {\n routed: boolean;\n messageId?: MessageId;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Notification Types\n// =============================================================================\n\n/**\n * Parameters for event notifications delivered to subscribers.\n *\n * The envelope contains both delivery metadata (subscriptionId, sequence)\n * and optional fields for deduplication and causal ordering.\n */\nexport interface EventNotificationParams {\n /** The subscription this event is being delivered to */\n subscriptionId: SubscriptionId;\n\n /** Monotonically increasing sequence number within this subscription */\n sequenceNumber: number;\n\n /**\n * Globally unique event identifier (ULID format).\n *\n * Used for:\n * - Deduplication (same event delivered multiple times)\n * - Replay references (afterEventId in replay requests)\n * - Causal tracking (referenced in causedBy arrays)\n *\n * Format: 26-character ULID, e.g., \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n *\n * @remarks\n * If not provided by the server, deduplication is skipped.\n * New routers should always provide this field.\n */\n eventId?: string;\n\n /**\n * Server timestamp when the event was processed (milliseconds since epoch).\n *\n * This is the envelope-level timestamp, which may differ from event.timestamp\n * if the event was queued or replayed.\n */\n timestamp?: Timestamp;\n\n /**\n * Event IDs of events that causally precede this event.\n *\n * Used for enforcing causal ordering - this event should not be\n * processed until all events in causedBy have been processed.\n *\n * @example\n * A message_delivered event would have causedBy: [messagesentEventId]\n */\n causedBy?: string[];\n\n /** The event payload */\n event: Event;\n\n _meta?: Meta;\n}\n\nexport interface EventNotification extends MAPNotificationBase<EventNotificationParams> {\n method: 'map/event';\n params: EventNotificationParams;\n}\n\nexport interface MessageNotificationParams {\n message: Message;\n _meta?: Meta;\n}\n\nexport interface MessageNotification extends MAPNotificationBase<MessageNotificationParams> {\n method: 'map/message';\n params: MessageNotificationParams;\n}\n\n// =============================================================================\n// Union Types for All Requests/Responses/Notifications\n// =============================================================================\n\n/** All MAP request types */\nexport type MAPRequest =\n // Core\n | ConnectRequest\n | DisconnectRequest\n | SessionListRequest\n | SessionLoadRequest\n | SessionCloseRequest\n | AgentsListRequest\n | AgentsGetRequest\n | SendRequest\n | SubscribeRequest\n | UnsubscribeRequest\n | ReplayRequest\n | AuthRefreshRequest\n // Structure\n | AgentsRegisterRequest\n | AgentsSpawnRequest\n | AgentsUnregisterRequest\n | AgentsUpdateRequest\n | AgentsStopRequest\n | AgentsSuspendRequest\n | AgentsResumeRequest\n | StructureGraphRequest\n | ScopesListRequest\n | ScopesGetRequest\n | ScopesCreateRequest\n | ScopesDeleteRequest\n | ScopesJoinRequest\n | ScopesLeaveRequest\n | ScopesMembersRequest\n // Permissions\n | PermissionsUpdateRequest\n // Extension\n | InjectRequest\n | FederationConnectRequest\n | FederationRouteRequest;\n\n/** All MAP notification types */\nexport type MAPNotification = EventNotification | MessageNotification | SubscriptionAckNotification;\n\n// =============================================================================\n// Method Constants (Reorganized by capability domain)\n// =============================================================================\n\n/** Core methods - All implementations must support */\nexport const CORE_METHODS = {\n CONNECT: 'map/connect',\n DISCONNECT: 'map/disconnect',\n SEND: 'map/send',\n SUBSCRIBE: 'map/subscribe',\n UNSUBSCRIBE: 'map/unsubscribe',\n REPLAY: 'map/replay',\n} as const;\n\n/** Observation methods - Query/read operations */\nexport const OBSERVATION_METHODS = {\n AGENTS_LIST: 'map/agents/list',\n AGENTS_GET: 'map/agents/get',\n SCOPES_LIST: 'map/scopes/list',\n SCOPES_GET: 'map/scopes/get',\n SCOPES_MEMBERS: 'map/scopes/members',\n STRUCTURE_GRAPH: 'map/structure/graph',\n} as const;\n\n/** Lifecycle methods - Agent creation/destruction */\nexport const LIFECYCLE_METHODS = {\n AGENTS_REGISTER: 'map/agents/register',\n AGENTS_UNREGISTER: 'map/agents/unregister',\n AGENTS_SPAWN: 'map/agents/spawn',\n} as const;\n\n/** State methods - Agent state management */\nexport const STATE_METHODS = {\n AGENTS_UPDATE: 'map/agents/update',\n AGENTS_SUSPEND: 'map/agents/suspend',\n AGENTS_RESUME: 'map/agents/resume',\n AGENTS_STOP: 'map/agents/stop',\n} as const;\n\n/** Steering methods - External control */\nexport const STEERING_METHODS = {\n INJECT: 'map/inject',\n} as const;\n\n/** Scope methods - Scope management */\nexport const SCOPE_METHODS = {\n SCOPES_CREATE: 'map/scopes/create',\n SCOPES_DELETE: 'map/scopes/delete',\n SCOPES_JOIN: 'map/scopes/join',\n SCOPES_LEAVE: 'map/scopes/leave',\n} as const;\n\n/** Session methods */\nexport const SESSION_METHODS = {\n SESSION_LIST: 'map/session/list',\n SESSION_LOAD: 'map/session/load',\n SESSION_CLOSE: 'map/session/close',\n} as const;\n\n/** Auth methods */\nexport const AUTH_METHODS = {\n AUTHENTICATE: 'map/authenticate',\n AUTH_REFRESH: 'map/auth/refresh',\n} as const;\n\n/** Permission methods */\nexport const PERMISSION_METHODS = {\n PERMISSIONS_UPDATE: 'map/permissions/update',\n} as const;\n\n/** Federation methods */\nexport const FEDERATION_METHODS = {\n FEDERATION_CONNECT: 'map/federation/connect',\n FEDERATION_ROUTE: 'map/federation/route',\n} as const;\n\n/** Notification methods */\nexport const NOTIFICATION_METHODS = {\n EVENT: 'map/event',\n MESSAGE: 'map/message',\n /** Client acknowledges received events (for backpressure) */\n SUBSCRIBE_ACK: 'map/subscribe.ack',\n /** Server notifies client that auth is about to expire */\n AUTH_EXPIRING: 'map/auth/expiring',\n} as const;\n\n/** All MAP methods */\nexport const MAP_METHODS = {\n ...CORE_METHODS,\n ...OBSERVATION_METHODS,\n ...LIFECYCLE_METHODS,\n ...STATE_METHODS,\n ...STEERING_METHODS,\n ...SCOPE_METHODS,\n ...SESSION_METHODS,\n ...AUTH_METHODS,\n ...PERMISSION_METHODS,\n ...FEDERATION_METHODS,\n} as const;\n\n// Legacy aliases for backward compatibility\nexport const STRUCTURE_METHODS = {\n ...LIFECYCLE_METHODS,\n ...STATE_METHODS,\n ...SCOPE_METHODS,\n STRUCTURE_GRAPH: OBSERVATION_METHODS.STRUCTURE_GRAPH,\n} as const;\n\nexport const EXTENSION_METHODS = {\n ...STEERING_METHODS,\n ...FEDERATION_METHODS,\n} as const;\n\n// =============================================================================\n// Error Codes (Fixed: no collisions)\n// =============================================================================\n\n/** JSON-RPC standard error codes */\nexport const PROTOCOL_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n/** Authentication error codes */\nexport const AUTH_ERROR_CODES = {\n AUTH_REQUIRED: 1000,\n AUTH_FAILED: 1001,\n TOKEN_EXPIRED: 1002,\n PERMISSION_DENIED: 1003,\n INSUFFICIENT_SCOPE: 1004,\n METHOD_NOT_SUPPORTED: 1005,\n INVALID_CREDENTIALS: 1006,\n} as const;\n\n/** Routing error codes */\nexport const ROUTING_ERROR_CODES = {\n ADDRESS_NOT_FOUND: 2000,\n AGENT_NOT_FOUND: 2001,\n SCOPE_NOT_FOUND: 2002,\n DELIVERY_FAILED: 2003,\n ADDRESS_AMBIGUOUS: 2004,\n} as const;\n\n/** Agent error codes */\nexport const AGENT_ERROR_CODES = {\n AGENT_EXISTS: 3000,\n STATE_INVALID: 3001,\n NOT_RESPONDING: 3002,\n TERMINATED: 3003,\n SPAWN_FAILED: 3004,\n} as const;\n\n/** Resource error codes */\nexport const RESOURCE_ERROR_CODES = {\n EXHAUSTED: 4000,\n RATE_LIMITED: 4001,\n QUOTA_EXCEEDED: 4002,\n} as const;\n\n/** Federation error codes - prefixed to avoid collision with AUTH_FAILED */\nexport const FEDERATION_ERROR_CODES = {\n FEDERATION_UNAVAILABLE: 5000,\n FEDERATION_SYSTEM_NOT_FOUND: 5001,\n FEDERATION_AUTH_FAILED: 5002,\n FEDERATION_ROUTE_REJECTED: 5003,\n /** Message has already visited this system (loop detected) */\n FEDERATION_LOOP_DETECTED: 5010,\n /** Message exceeded maximum hop count */\n FEDERATION_MAX_HOPS_EXCEEDED: 5011,\n} as const;\n\n/** All error codes */\nexport const ERROR_CODES = {\n ...PROTOCOL_ERROR_CODES,\n ...AUTH_ERROR_CODES,\n ...ROUTING_ERROR_CODES,\n ...AGENT_ERROR_CODES,\n ...RESOURCE_ERROR_CODES,\n ...FEDERATION_ERROR_CODES,\n} as const;\n\n/** Protocol version */\nexport const PROTOCOL_VERSION: ProtocolVersion = 1;\n\n// =============================================================================\n// Capability Requirements\n// =============================================================================\n\n/**\n * Maps methods to required capabilities.\n * Empty array means no special capability required.\n */\nexport const CAPABILITY_REQUIREMENTS: Record<string, string[]> = {\n // Core\n [CORE_METHODS.CONNECT]: [],\n [CORE_METHODS.DISCONNECT]: [],\n [CORE_METHODS.SEND]: ['messaging.canSend'],\n [CORE_METHODS.SUBSCRIBE]: ['observation.canObserve'],\n [CORE_METHODS.UNSUBSCRIBE]: ['observation.canObserve'],\n\n // Observation\n [OBSERVATION_METHODS.AGENTS_LIST]: ['observation.canQuery'],\n [OBSERVATION_METHODS.AGENTS_GET]: ['observation.canQuery'],\n [OBSERVATION_METHODS.SCOPES_LIST]: ['observation.canQuery'],\n [OBSERVATION_METHODS.SCOPES_GET]: ['observation.canQuery'],\n [OBSERVATION_METHODS.SCOPES_MEMBERS]: ['observation.canQuery'],\n [OBSERVATION_METHODS.STRUCTURE_GRAPH]: ['observation.canQuery'],\n\n // Lifecycle\n [LIFECYCLE_METHODS.AGENTS_REGISTER]: ['lifecycle.canRegister'],\n [LIFECYCLE_METHODS.AGENTS_UNREGISTER]: ['lifecycle.canUnregister'],\n [LIFECYCLE_METHODS.AGENTS_SPAWN]: ['lifecycle.canSpawn'],\n\n // State\n [STATE_METHODS.AGENTS_UPDATE]: ['lifecycle.canRegister'],\n [STATE_METHODS.AGENTS_SUSPEND]: ['lifecycle.canStop'],\n [STATE_METHODS.AGENTS_RESUME]: ['lifecycle.canStop'],\n [STATE_METHODS.AGENTS_STOP]: ['lifecycle.canStop'],\n\n // Steering\n [STEERING_METHODS.INJECT]: ['lifecycle.canSteer'],\n\n // Scopes\n [SCOPE_METHODS.SCOPES_CREATE]: ['scopes.canCreateScopes'],\n [SCOPE_METHODS.SCOPES_DELETE]: ['scopes.canManageScopes'],\n [SCOPE_METHODS.SCOPES_JOIN]: [],\n [SCOPE_METHODS.SCOPES_LEAVE]: [],\n\n // Session\n [SESSION_METHODS.SESSION_LIST]: [],\n [SESSION_METHODS.SESSION_LOAD]: [],\n [SESSION_METHODS.SESSION_CLOSE]: [],\n\n // Auth (no capability required - anyone can authenticate)\n [AUTH_METHODS.AUTHENTICATE]: [],\n [AUTH_METHODS.AUTH_REFRESH]: [],\n\n // Permissions (system-only, no capability check - enforced by participant type)\n [PERMISSION_METHODS.PERMISSIONS_UPDATE]: [],\n\n // Federation\n [FEDERATION_METHODS.FEDERATION_CONNECT]: ['federation.canFederate'],\n [FEDERATION_METHODS.FEDERATION_ROUTE]: ['federation.canFederate'],\n} as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/** Check if a response is an error response */\nexport function isErrorResponse(response: MAPResponse): response is MAPResponseError {\n return 'error' in response;\n}\n\n/** Check if a response is a success response */\nexport function isSuccessResponse<T>(response: MAPResponse<T>): response is MAPResponseSuccess<T> {\n return 'result' in response;\n}\n\n/** Check if an address is a direct address */\nexport function isDirectAddress(address: Address): address is DirectAddress {\n return typeof address === 'object' && 'agent' in address && !('system' in address);\n}\n\n/** Check if an address is a federated address */\nexport function isFederatedAddress(address: Address): address is FederatedAddress {\n return typeof address === 'object' && 'system' in address && 'agent' in address;\n}\n\n/** Check if an address is a scope address */\nexport function isScopeAddress(address: Address): address is ScopeAddress {\n return typeof address === 'object' && 'scope' in address;\n}\n\n/** Check if an address is a broadcast address */\nexport function isBroadcastAddress(address: Address): address is BroadcastAddress {\n return typeof address === 'object' && 'broadcast' in address;\n}\n\n/** Check if an address is a hierarchical address */\nexport function isHierarchicalAddress(address: Address): address is HierarchicalAddress {\n return (\n typeof address === 'object' &&\n ('parent' in address ||\n 'children' in address ||\n 'ancestors' in address ||\n 'descendants' in address ||\n 'siblings' in address)\n );\n}\n","/**\n * JSON-RPC 2.0 utilities for MAP protocol\n */\n\nimport type { RequestId, MAPError } from '../types';\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = '2.0' as const;\n\n/**\n * Generic JSON-RPC request structure\n */\nexport interface JsonRpcRequest<TParams = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC notification structure (no id)\n */\nexport interface JsonRpcNotification<TParams = unknown> {\n jsonrpc: '2.0';\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC success response\n */\nexport interface JsonRpcSuccessResponse<TResult = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n result: TResult;\n}\n\n/**\n * Generic JSON-RPC error response\n */\nexport interface JsonRpcErrorResponse {\n jsonrpc: '2.0';\n id: RequestId;\n error: MAPError;\n}\n\n/**\n * Any JSON-RPC response\n */\nexport type JsonRpcResponse<TResult = unknown> =\n | JsonRpcSuccessResponse<TResult>\n | JsonRpcErrorResponse;\n\n/**\n * Any JSON-RPC message\n */\nexport type JsonRpcMessage =\n | JsonRpcRequest\n | JsonRpcNotification\n | JsonRpcResponse;\n\n/**\n * Check if a message is a request (has id and method)\n */\nexport function isRequest(message: unknown): message is JsonRpcRequest {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n 'method' in message\n );\n}\n\n/**\n * Check if a message is a notification (has method but no id)\n */\nexport function isNotification(message: unknown): message is JsonRpcNotification {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'method' in message &&\n !('id' in message)\n );\n}\n\n/**\n * Check if a message is a response (has id but no method)\n */\nexport function isResponse(message: unknown): message is JsonRpcResponse {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n !('method' in message)\n );\n}\n\n/**\n * Check if a response is an error response\n */\nexport function isErrorResponse(\n response: JsonRpcResponse\n): response is JsonRpcErrorResponse {\n return 'error' in response;\n}\n\n/**\n * Check if a response is a success response\n */\nexport function isSuccessResponse<T>(\n response: JsonRpcResponse<T>\n): response is JsonRpcSuccessResponse<T> {\n return 'result' in response;\n}\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest<TParams>(\n id: RequestId,\n method: string,\n params?: TParams\n): JsonRpcRequest<TParams> {\n const request: JsonRpcRequest<TParams> = {\n jsonrpc: '2.0',\n id,\n method,\n };\n if (params !== undefined) {\n request.params = params;\n }\n return request;\n}\n\n/**\n * Create a JSON-RPC notification\n */\nexport function createNotification<TParams>(\n method: string,\n params?: TParams\n): JsonRpcNotification<TParams> {\n const notification: JsonRpcNotification<TParams> = {\n jsonrpc: '2.0',\n method,\n };\n if (params !== undefined) {\n notification.params = params;\n }\n return notification;\n}\n\n/**\n * Create a JSON-RPC success response\n */\nexport function createSuccessResponse<TResult>(\n id: RequestId,\n result: TResult\n): JsonRpcSuccessResponse<TResult> {\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n}\n\n/**\n * Create a JSON-RPC error response\n */\nexport function createErrorResponse(\n id: RequestId,\n error: MAPError\n): JsonRpcErrorResponse {\n return {\n jsonrpc: '2.0',\n id,\n error,\n };\n}\n","/**\n * Error classes for MAP protocol\n */\n\nimport type { MAPError, MAPErrorData, ErrorCategory, RequestId } from '../types';\nimport {\n PROTOCOL_ERROR_CODES,\n AUTH_ERROR_CODES,\n ROUTING_ERROR_CODES,\n AGENT_ERROR_CODES,\n RESOURCE_ERROR_CODES,\n FEDERATION_ERROR_CODES,\n} from '../types';\nimport { createErrorResponse, type JsonRpcErrorResponse } from '../jsonrpc';\n\n/**\n * Error thrown when a MAP request fails.\n *\n * Extends Error with JSON-RPC error properties and provides\n * factory methods for common error types.\n */\nexport class MAPRequestError extends Error {\n readonly code: number;\n readonly data?: MAPErrorData;\n\n constructor(code: number, message: string, data?: MAPErrorData) {\n super(message);\n this.name = 'MAPRequestError';\n this.code = code;\n this.data = data;\n }\n\n /**\n * Convert to MAP error object\n */\n toError(): MAPError {\n const error: MAPError = {\n code: this.code,\n message: this.message,\n };\n if (this.data) {\n error.data = this.data;\n }\n return error;\n }\n\n /**\n * Convert to JSON-RPC error response\n */\n toResponse(id: RequestId): JsonRpcErrorResponse {\n return createErrorResponse(id, this.toError());\n }\n\n // ==========================================================================\n // Protocol Errors (-32xxx)\n // ==========================================================================\n\n static parseError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.PARSE_ERROR,\n details ?? 'Parse error',\n { category: 'protocol' }\n );\n }\n\n static invalidRequest(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_REQUEST,\n details ?? 'Invalid request',\n { category: 'protocol' }\n );\n }\n\n static methodNotFound(method: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.METHOD_NOT_FOUND,\n `Method not found: ${method}`,\n { category: 'protocol' }\n );\n }\n\n static invalidParams(details?: unknown): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_PARAMS,\n 'Invalid params',\n { category: 'protocol', details: details as Record<string, unknown> }\n );\n }\n\n static internalError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INTERNAL_ERROR,\n details ?? 'Internal error',\n { category: 'internal' }\n );\n }\n\n // ==========================================================================\n // Auth Errors (1xxx)\n // ==========================================================================\n\n static authRequired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_REQUIRED,\n 'Authentication required',\n { category: 'auth' }\n );\n }\n\n static authFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_FAILED,\n details ?? 'Authentication failed',\n { category: 'auth' }\n );\n }\n\n static tokenExpired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.TOKEN_EXPIRED,\n 'Token expired',\n { category: 'auth', retryable: true }\n );\n }\n\n static permissionDenied(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.PERMISSION_DENIED,\n required ? `Permission denied: ${required}` : 'Permission denied',\n { category: 'auth' }\n );\n }\n\n static insufficientScope(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.INSUFFICIENT_SCOPE,\n required ? `Insufficient scope: ${required}` : 'Insufficient scope',\n { category: 'auth' }\n );\n }\n\n static methodNotSupported(method: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.METHOD_NOT_SUPPORTED,\n `Authentication method not supported: ${method}`,\n { category: 'auth' }\n );\n }\n\n static invalidCredentials(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.INVALID_CREDENTIALS,\n details ?? 'Invalid credentials',\n { category: 'auth' }\n );\n }\n\n // ==========================================================================\n // Routing Errors (2xxx)\n // ==========================================================================\n\n static addressNotFound(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_NOT_FOUND,\n `Address not found: ${address}`,\n { category: 'routing' }\n );\n }\n\n static agentNotFound(agentId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.AGENT_NOT_FOUND,\n `Agent not found: ${agentId}`,\n { category: 'routing' }\n );\n }\n\n static scopeNotFound(scopeId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.SCOPE_NOT_FOUND,\n `Scope not found: ${scopeId}`,\n { category: 'routing' }\n );\n }\n\n static deliveryFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.DELIVERY_FAILED,\n details ?? 'Message delivery failed',\n { category: 'routing', retryable: true }\n );\n }\n\n static addressAmbiguous(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_AMBIGUOUS,\n `Address is ambiguous: ${address}`,\n { category: 'routing' }\n );\n }\n\n // ==========================================================================\n // Agent Errors (3xxx)\n // ==========================================================================\n\n static agentExists(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.AGENT_EXISTS,\n `Agent already exists: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static stateInvalid(currentState: string, requestedAction: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.STATE_INVALID,\n `Cannot ${requestedAction} agent in state: ${currentState}`,\n { category: 'agent' }\n );\n }\n\n static agentNotResponding(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.NOT_RESPONDING,\n `Agent not responding: ${agentId}`,\n { category: 'agent', retryable: true }\n );\n }\n\n static agentTerminated(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.TERMINATED,\n `Agent terminated: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static spawnFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.SPAWN_FAILED,\n details ?? 'Failed to spawn agent',\n { category: 'agent' }\n );\n }\n\n // ==========================================================================\n // Resource Errors (4xxx)\n // ==========================================================================\n\n static resourceExhausted(resource?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.EXHAUSTED,\n resource ? `Resource exhausted: ${resource}` : 'Resource exhausted',\n { category: 'resource', retryable: true }\n );\n }\n\n static rateLimited(retryAfterMs?: number): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.RATE_LIMITED,\n 'Rate limited',\n { category: 'resource', retryable: true, retryAfterMs }\n );\n }\n\n static quotaExceeded(quota?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.QUOTA_EXCEEDED,\n quota ? `Quota exceeded: ${quota}` : 'Quota exceeded',\n { category: 'resource' }\n );\n }\n\n // ==========================================================================\n // Federation Errors (5xxx)\n // ==========================================================================\n\n static federationUnavailable(systemId?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_UNAVAILABLE,\n systemId ? `Federation unavailable: ${systemId}` : 'Federation unavailable',\n { category: 'federation', retryable: true }\n );\n }\n\n static federationSystemNotFound(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_SYSTEM_NOT_FOUND,\n `System not found: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationAuthFailed(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_AUTH_FAILED,\n `Federation authentication failed: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationRouteRejected(systemId: string, reason?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n reason ? `Route rejected by ${systemId}: ${reason}` : `Route rejected by ${systemId}`,\n { category: 'federation' }\n );\n }\n\n // ==========================================================================\n // Utility\n // ==========================================================================\n\n /**\n * Create from a MAP error object\n */\n static fromError(error: MAPError): MAPRequestError {\n return new MAPRequestError(error.code, error.message, error.data);\n }\n\n /**\n * Check if this error is retryable\n */\n get retryable(): boolean {\n return this.data?.retryable ?? false;\n }\n\n /**\n * Get retry delay in milliseconds, if specified\n */\n get retryAfterMs(): number | undefined {\n return this.data?.retryAfterMs;\n }\n\n /**\n * Get error category\n */\n get category(): ErrorCategory | undefined {\n return this.data?.category;\n }\n}\n\n/**\n * Error thrown when a connection is closed unexpectedly\n */\nexport class MAPConnectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MAPConnectionError';\n }\n\n static closed(): MAPConnectionError {\n return new MAPConnectionError('Connection closed');\n }\n\n static timeout(): MAPConnectionError {\n return new MAPConnectionError('Connection timeout');\n }\n}\n\n/**\n * Error thrown when an operation times out\n */\nexport class MAPTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(operation: string, timeoutMs: number) {\n super(`Operation timed out after ${timeoutMs}ms: ${operation}`);\n this.name = 'MAPTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n","/**\n * Stream utilities for MAP protocol transport\n *\n * Provides helpers for converting byte streams to/from MAP message streams.\n */\n\nimport type { MAPRequest, MAPResponse, MAPNotification } from '../types';\n\n/** Any MAP message type */\nexport type AnyMessage = MAPRequest | MAPResponse | MAPNotification | Record<string, unknown>;\n\n/**\n * Bidirectional message stream interface.\n * This is the transport abstraction that connection classes use.\n */\nexport interface Stream {\n writable: WritableStream<AnyMessage>;\n readable: ReadableStream<AnyMessage>;\n}\n\n/**\n * Converts raw byte streams to newline-delimited JSON message streams.\n *\n * This is the primary transport adapter - works with any byte stream\n * (stdio, TCP socket, etc.)\n *\n * @param readable - Input byte stream\n * @param writable - Output byte stream\n * @returns Stream interface for MAP messages\n */\nexport function ndJsonStream(\n readable: ReadableStream<Uint8Array>,\n writable: WritableStream<Uint8Array>\n): Stream {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n\n // Buffer for incomplete lines\n let buffer = '';\n\n const messageReadable = new ReadableStream<AnyMessage>({\n async start(controller) {\n const reader = readable.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Process any remaining buffer content\n if (buffer.trim()) {\n try {\n const message = JSON.parse(buffer.trim());\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse final message:', buffer);\n }\n }\n controller.close();\n break;\n }\n\n // Decode bytes and add to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n try {\n const message = JSON.parse(trimmed);\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse message:', trimmed);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n\n const messageWritable = new WritableStream<AnyMessage>({\n async write(message) {\n const writer = writable.getWriter();\n try {\n const json = JSON.stringify(message) + '\\n';\n await writer.write(encoder.encode(json));\n } finally {\n writer.releaseLock();\n }\n },\n async close() {\n await writable.close();\n },\n abort(reason) {\n writable.abort(reason);\n },\n });\n\n return {\n readable: messageReadable,\n writable: messageWritable,\n };\n}\n\n/**\n * Wraps a WebSocket in a Stream interface.\n *\n * @param ws - WebSocket instance (must be open or will wait for open)\n * @returns Stream interface for MAP messages\n */\nexport function websocketStream(ws: WebSocket): Stream {\n // Queue for messages received before reader is ready\n const messageQueue: AnyMessage[] = [];\n let messageResolver: ((value: IteratorResult<AnyMessage>) => void) | null = null;\n let closed = false;\n let closeError: Error | null = null;\n\n // Handle incoming messages\n ws.addEventListener('message', (event) => {\n try {\n const message = JSON.parse(event.data as string);\n if (messageResolver) {\n messageResolver({ value: message, done: false });\n messageResolver = null;\n } else {\n messageQueue.push(message);\n }\n } catch {\n console.error('MAP: Failed to parse WebSocket message:', event.data);\n }\n });\n\n ws.addEventListener('close', () => {\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n ws.addEventListener('error', () => {\n closeError = new Error('WebSocket error');\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n const readable = new ReadableStream<AnyMessage>({\n async pull(controller) {\n if (messageQueue.length > 0) {\n controller.enqueue(messageQueue.shift()!);\n return;\n }\n\n if (closed) {\n if (closeError) {\n controller.error(closeError);\n } else {\n controller.close();\n }\n return;\n }\n\n // Wait for next message\n await new Promise<IteratorResult<AnyMessage>>((resolve) => {\n messageResolver = resolve;\n }).then((result) => {\n if (result.done) {\n controller.close();\n } else {\n controller.enqueue(result.value);\n }\n });\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n if (ws.readyState === WebSocket.CONNECTING) {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.removeEventListener('error', onError);\n resolve();\n };\n const onError = () => {\n ws.removeEventListener('open', onOpen);\n reject(new Error('WebSocket failed to connect'));\n };\n ws.addEventListener('open', onOpen, { once: true });\n ws.addEventListener('error', onError, { once: true });\n });\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not open');\n }\n\n ws.send(JSON.stringify(message));\n },\n close() {\n ws.close();\n },\n abort() {\n ws.close();\n },\n });\n\n return { readable, writable };\n}\n\n/**\n * Wait for a WebSocket to open with timeout.\n *\n * @param ws - WebSocket instance\n * @param timeoutMs - Timeout in milliseconds (default: 10000)\n * @returns Promise that resolves when WebSocket is open\n * @throws Error if connection times out or fails\n */\nexport function waitForOpen(ws: WebSocket, timeoutMs = 10000): Promise<void> {\n return new Promise((resolve, reject) => {\n if (ws.readyState === WebSocket.OPEN) {\n resolve();\n return;\n }\n\n const timeout = setTimeout(() => {\n ws.close();\n reject(new Error(`WebSocket connection timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onOpen = () => {\n clearTimeout(timeout);\n ws.removeEventListener(\"error\", onError);\n resolve();\n };\n\n const onError = () => {\n clearTimeout(timeout);\n ws.removeEventListener(\"open\", onOpen);\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n ws.addEventListener(\"open\", onOpen, { once: true });\n ws.addEventListener(\"error\", onError, { once: true });\n });\n}\n\n/**\n * Creates a pair of connected in-memory streams for testing.\n *\n * Messages written to one stream's writable appear on the other's readable.\n *\n * @returns Tuple of [clientStream, serverStream]\n */\nexport function createStreamPair(): [Stream, Stream] {\n // Queues for each direction\n const clientToServer: AnyMessage[] = [];\n const serverToClient: AnyMessage[] = [];\n\n // Resolvers for blocking reads\n let clientToServerResolver: ((msg: AnyMessage) => void) | null = null;\n let serverToClientResolver: ((msg: AnyMessage) => void) | null = null;\n\n // Closed flags\n let clientToServerClosed = false;\n let serverToClientClosed = false;\n\n function createReadable(\n queue: AnyMessage[],\n _getResolver: () => ((msg: AnyMessage) => void) | null,\n setResolver: (r: ((msg: AnyMessage) => void) | null) => void,\n isClosed: () => boolean\n ): ReadableStream<AnyMessage> {\n return new ReadableStream({\n async pull(controller) {\n if (queue.length > 0) {\n controller.enqueue(queue.shift()!);\n return;\n }\n\n if (isClosed()) {\n controller.close();\n return;\n }\n\n const message = await new Promise<AnyMessage | null>((resolve) => {\n setResolver((msg) => {\n setResolver(null);\n resolve(msg);\n });\n });\n\n if (message === null) {\n controller.close();\n } else {\n controller.enqueue(message);\n }\n },\n });\n }\n\n function createWritable(\n queue: AnyMessage[],\n getResolver: () => ((msg: AnyMessage) => void) | null,\n setClosed: () => void\n ): WritableStream<AnyMessage> {\n return new WritableStream({\n write(message) {\n const resolver = getResolver();\n if (resolver) {\n resolver(message);\n } else {\n queue.push(message);\n }\n },\n close() {\n setClosed();\n const resolver = getResolver();\n if (resolver) {\n resolver(null as unknown as AnyMessage);\n }\n },\n });\n }\n\n const clientStream: Stream = {\n // Client writes to server\n writable: createWritable(\n clientToServer,\n () => clientToServerResolver,\n () => {\n clientToServerClosed = true;\n }\n ),\n // Client reads from server\n readable: createReadable(\n serverToClient,\n () => serverToClientResolver,\n (r) => {\n serverToClientResolver = r;\n },\n () => serverToClientClosed\n ),\n };\n\n const serverStream: Stream = {\n // Server writes to client\n writable: createWritable(\n serverToClient,\n () => serverToClientResolver,\n () => {\n serverToClientClosed = true;\n }\n ),\n // Server reads from client\n readable: createReadable(\n clientToServer,\n () => clientToServerResolver,\n (r) => {\n clientToServerResolver = r;\n },\n () => clientToServerClosed\n ),\n };\n\n return [clientStream, serverStream];\n}\n\n// ===========================================================================\n// Agentic-Mesh Transport (optional peer dependency)\n// ===========================================================================\n\nexport {\n agenticMeshStream,\n type AgenticMeshStreamConfig,\n type MeshPeerEndpoint,\n type MeshTransportAdapter,\n} from './agentic-mesh';\n","/**\n * Subscription class for MAP event streams\n *\n * Provides both AsyncIterable and event emitter patterns for consuming events.\n * Includes automatic deduplication based on eventId when provided by the server.\n */\n\nimport type {\n SubscriptionId,\n Event,\n SubscriptionFilter,\n SubscriptionState,\n SubscriptionAckParams,\n OverflowInfo,\n OverflowHandler,\n EventNotificationParams,\n} from '../types';\n\n/**\n * Event handler callback type\n */\nexport type EventHandler = (event: Event) => void;\n\n/**\n * Subscription options\n */\nexport interface SubscriptionOptions {\n /** Filter for events */\n filter?: SubscriptionFilter;\n /** Buffer size for events before backpressure */\n bufferSize?: number;\n /**\n * Maximum number of eventIds to track for deduplication.\n * Older eventIds are evicted when this limit is reached.\n * Default: 10000\n */\n maxSeenEventIds?: number;\n}\n\n/**\n * Subscription to MAP events.\n *\n * Supports both async iteration and event handler patterns:\n *\n * ```typescript\n * // Async iteration\n * for await (const event of subscription) {\n * console.log(event);\n * }\n *\n * // Event handler\n * subscription.on('event', (event) => console.log(event));\n * ```\n *\n * ## Deduplication\n *\n * When the server provides `eventId` in the notification params,\n * the subscription automatically deduplicates events. This handles\n * scenarios like:\n * - Network retries delivering the same event twice\n * - Reconnection replay overlapping with already-received events\n *\n * If `eventId` is not provided, deduplication is skipped.\n *\n * ## Pause/Resume\n *\n * You can pause event delivery from the async iterator while still\n * buffering events:\n *\n * ```typescript\n * subscription.pause();\n * // Events are buffered but not yielded\n * subscription.resume();\n * // Buffered events are now yielded\n * ```\n *\n * ## Overflow Handling\n *\n * When the buffer is full, events are dropped and overflow handlers\n * are notified:\n *\n * ```typescript\n * subscription.on('overflow', (info) => {\n * console.log(`Dropped ${info.eventsDropped} events`);\n * });\n * ```\n */\nexport class Subscription implements AsyncIterable<Event> {\n readonly id: SubscriptionId;\n readonly filter?: SubscriptionFilter;\n\n readonly #eventHandlers: Set<EventHandler> = new Set();\n readonly #overflowHandlers: Set<OverflowHandler> = new Set();\n readonly #eventQueue: Event[] = [];\n readonly #bufferSize: number;\n readonly #unsubscribe: () => Promise<void>;\n readonly #sendAck?: (params: SubscriptionAckParams) => void;\n\n // Deduplication tracking\n readonly #seenEventIds: Set<string> = new Set();\n readonly #seenEventIdOrder: string[] = []; // For LRU eviction\n readonly #maxSeenEventIds: number;\n\n #eventResolver: ((event: Event | null) => void) | null = null;\n #pauseResolver: (() => void) | null = null;\n #state: SubscriptionState = 'active';\n #lastSequenceNumber = -1;\n #lastEventId: string | undefined;\n #lastTimestamp: number | undefined;\n\n // Overflow tracking\n #totalDropped = 0;\n #oldestDroppedId?: string;\n #newestDroppedId?: string;\n\n // Ack support\n #serverSupportsAck = false;\n\n constructor(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options: SubscriptionOptions = {},\n sendAck?: (params: SubscriptionAckParams) => void\n ) {\n this.id = id;\n this.filter = options.filter;\n this.#bufferSize = options.bufferSize ?? 1000;\n this.#maxSeenEventIds = options.maxSeenEventIds ?? 10000;\n this.#unsubscribe = unsubscribe;\n this.#sendAck = sendAck;\n }\n\n /**\n * Current subscription state\n */\n get state(): SubscriptionState {\n return this.#state;\n }\n\n /**\n * Whether the subscription is closed\n */\n get isClosed(): boolean {\n return this.#state === 'closed';\n }\n\n /**\n * Whether the subscription is paused\n */\n get isPaused(): boolean {\n return this.#state === 'paused';\n }\n\n /**\n * Last received sequence number (for ordering verification)\n */\n get lastSequenceNumber(): number {\n return this.#lastSequenceNumber;\n }\n\n /**\n * Last received eventId (for replay positioning)\n */\n get lastEventId(): string | undefined {\n return this.#lastEventId;\n }\n\n /**\n * Last received server timestamp\n */\n get lastTimestamp(): number | undefined {\n return this.#lastTimestamp;\n }\n\n /**\n * Number of events currently buffered\n */\n get bufferedCount(): number {\n return this.#eventQueue.length;\n }\n\n /**\n * Number of eventIds being tracked for deduplication\n */\n get trackedEventIdCount(): number {\n return this.#seenEventIds.size;\n }\n\n /**\n * Total number of events dropped due to buffer overflow\n */\n get totalDropped(): number {\n return this.#totalDropped;\n }\n\n /**\n * Whether the server supports acknowledgments\n */\n get supportsAck(): boolean {\n return this.#serverSupportsAck && !!this.#sendAck;\n }\n\n /**\n * Pause event delivery from the async iterator.\n * Events are still buffered but not yielded until resume() is called.\n * Event handlers (on('event', ...)) still receive events while paused.\n */\n pause(): void {\n if (this.#state === 'closed') return;\n this.#state = 'paused';\n }\n\n /**\n * Resume event delivery from the async iterator.\n * Any events buffered during pause will be yielded.\n */\n resume(): void {\n if (this.#state === 'closed') return;\n this.#state = 'active';\n\n // Wake up paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // If iterator is waiting for events and we have buffered events, deliver one\n if (this.#eventResolver && this.#eventQueue.length > 0) {\n const event = this.#eventQueue.shift()!;\n this.#eventResolver(event);\n this.#eventResolver = null;\n }\n }\n\n /**\n * Acknowledge events up to a sequence number.\n * No-op if server doesn't support acks.\n *\n * @param upToSequence - Acknowledge all events up to and including this sequence.\n * If omitted, acknowledges up to lastSequenceNumber.\n */\n ack(upToSequence?: number): void {\n if (!this.supportsAck) return;\n\n const seq = upToSequence ?? this.#lastSequenceNumber;\n if (seq < 0) return; // No events received yet\n\n this.#sendAck!({\n subscriptionId: this.id,\n upToSequence: seq,\n });\n }\n\n /**\n * Register an event or overflow handler\n */\n on(type: 'event', handler: EventHandler): this;\n on(type: 'overflow', handler: OverflowHandler): this;\n on(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.add(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.add(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Remove an event or overflow handler\n */\n off(type: 'event', handler: EventHandler): this;\n off(type: 'overflow', handler: OverflowHandler): this;\n off(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.delete(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.delete(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Register a one-time event handler\n */\n once(type: 'event', handler: EventHandler): this {\n if (type === 'event') {\n const wrapper: EventHandler = (event) => {\n this.off('event', wrapper);\n handler(event);\n };\n this.on('event', wrapper);\n }\n return this;\n }\n\n /**\n * Unsubscribe and close the subscription\n */\n async unsubscribe(): Promise<void> {\n if (this.#state === 'closed') return;\n\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // Clear handlers and tracking\n this.#eventHandlers.clear();\n this.#overflowHandlers.clear();\n this.#seenEventIds.clear();\n this.#seenEventIdOrder.length = 0;\n\n // Call the unsubscribe callback\n await this.#unsubscribe();\n }\n\n /**\n * Set whether server supports acknowledgments.\n * Called by connection after capability negotiation.\n * @internal\n */\n _setServerSupportsAck(supports: boolean): void {\n this.#serverSupportsAck = supports;\n }\n\n /**\n * Push an event to the subscription (called by connection)\n * @internal\n */\n _pushEvent(params: EventNotificationParams): void {\n if (this.#state === 'closed') return;\n\n const { sequenceNumber, eventId, timestamp, event } = params;\n\n // Deduplicate by eventId if provided\n if (eventId) {\n if (this.#seenEventIds.has(eventId)) {\n // Duplicate event, skip silently\n return;\n }\n\n // Track this eventId\n this.#seenEventIds.add(eventId);\n this.#seenEventIdOrder.push(eventId);\n\n // LRU eviction if we've exceeded the limit\n while (this.#seenEventIds.size > this.#maxSeenEventIds) {\n const oldestId = this.#seenEventIdOrder.shift();\n if (oldestId) {\n this.#seenEventIds.delete(oldestId);\n }\n }\n\n // Track last eventId for replay positioning\n this.#lastEventId = eventId;\n }\n\n // Track last timestamp\n if (timestamp !== undefined) {\n this.#lastTimestamp = timestamp;\n }\n\n // Check for sequence gaps (out of order or missed events)\n if (this.#lastSequenceNumber >= 0 && sequenceNumber !== this.#lastSequenceNumber + 1) {\n console.warn(\n `MAP: Subscription ${this.id} sequence gap: expected ${this.#lastSequenceNumber + 1}, got ${sequenceNumber}`\n );\n }\n this.#lastSequenceNumber = sequenceNumber;\n\n // Notify event handlers (always, even when paused)\n for (const handler of this.#eventHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Event handler error:', error);\n }\n }\n\n // If there's a waiting iterator and not paused, resolve it directly\n if (this.#eventResolver && this.#state === 'active') {\n this.#eventResolver(event);\n this.#eventResolver = null;\n return;\n }\n\n // Otherwise buffer the event\n if (this.#eventQueue.length < this.#bufferSize) {\n this.#eventQueue.push(event);\n } else {\n // Buffer overflow - track and notify\n this.#totalDropped++;\n\n // Track oldest/newest dropped event IDs\n if (eventId) {\n if (this.#oldestDroppedId === undefined) {\n this.#oldestDroppedId = eventId;\n }\n this.#newestDroppedId = eventId;\n }\n\n // Notify overflow handlers\n const info: OverflowInfo = {\n eventsDropped: 1,\n oldestDroppedId: this.#oldestDroppedId,\n newestDroppedId: this.#newestDroppedId,\n timestamp: Date.now(),\n totalDropped: this.#totalDropped,\n };\n\n for (const handler of this.#overflowHandlers) {\n try {\n handler(info);\n } catch (error) {\n console.error('MAP: Overflow handler error:', error);\n }\n }\n\n console.warn(`MAP: Subscription ${this.id} buffer full, dropping event`);\n }\n }\n\n /**\n * Mark the subscription as closed (called by connection)\n * @internal\n */\n _close(): void {\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n }\n\n /**\n * Async iterator implementation\n */\n async *[Symbol.asyncIterator](): AsyncIterator<Event> {\n while (!this.isClosed) {\n // Wait while paused\n while (this.isPaused) {\n await new Promise<void>((resolve) => {\n this.#pauseResolver = resolve;\n });\n // Check if closed during pause - need to break out of both loops\n if (this.isClosed) {\n // Drain remaining buffered events before returning\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n return;\n }\n }\n\n // Return buffered events first\n if (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n continue;\n }\n\n // Wait for next event\n const event = await new Promise<Event | null>((resolve) => {\n this.#eventResolver = resolve;\n });\n\n if (event === null) {\n // Subscription closed\n break;\n }\n\n yield event;\n }\n\n // Drain remaining buffered events\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n }\n}\n\n/**\n * Create a subscription instance\n * @internal\n */\nexport function createSubscription(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options?: SubscriptionOptions,\n sendAck?: (params: SubscriptionAckParams) => void\n): Subscription {\n return new Subscription(id, unsubscribe, options, sendAck);\n}\n","/**\n * Base connection class for MAP protocol\n *\n * Handles JSON-RPC message correlation, request/response matching,\n * and connection lifecycle management.\n */\n\nimport type { Stream, AnyMessage } from '../stream';\nimport type { RequestId, MAPError } from '../types';\nimport {\n isRequest,\n isNotification,\n isResponse,\n isErrorResponse,\n createRequest,\n createNotification,\n createSuccessResponse,\n createErrorResponse,\n type JsonRpcRequest,\n type JsonRpcNotification,\n type JsonRpcResponse,\n} from '../jsonrpc';\nimport { MAPRequestError, MAPConnectionError, MAPTimeoutError } from '../errors';\n\n/**\n * Pending response tracker\n */\ninterface PendingResponse<T = unknown> {\n resolve: (result: T) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Handler for incoming requests\n */\nexport type RequestHandler = (\n method: string,\n params: unknown\n) => Promise<unknown>;\n\n/**\n * Handler for incoming notifications\n */\nexport type NotificationHandler = (\n method: string,\n params: unknown\n) => Promise<void>;\n\n/**\n * Connection state for tracking lifecycle\n */\nexport type ConnectionState =\n | 'initial'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'closed';\n\n/**\n * Handler for connection state changes\n */\nexport type StateChangeHandler = (\n newState: ConnectionState,\n oldState: ConnectionState\n) => void;\n\n/**\n * Options for base connection\n */\nexport interface BaseConnectionOptions {\n /** Default timeout for requests in milliseconds */\n defaultTimeout?: number;\n}\n\n/**\n * Base connection class providing JSON-RPC message handling.\n *\n * This class is used internally by the role-specific connection classes\n * (ClientConnection, AgentConnection, etc.)\n */\nexport class BaseConnection {\n #stream: Stream;\n readonly #pendingResponses: Map<RequestId, PendingResponse> = new Map();\n readonly #abortController: AbortController = new AbortController();\n readonly #closedPromise: Promise<void>;\n readonly #defaultTimeout: number;\n readonly #stateChangeHandlers: Set<StateChangeHandler> = new Set();\n\n #nextRequestId: number = 1;\n #writeQueue: Promise<void> = Promise.resolve();\n #requestHandler: RequestHandler | null = null;\n #notificationHandler: NotificationHandler | null = null;\n #closed = false;\n #closeResolver!: () => void;\n #state: ConnectionState = 'initial';\n\n constructor(stream: Stream, options: BaseConnectionOptions = {}) {\n this.#stream = stream;\n this.#defaultTimeout = options.defaultTimeout ?? 30000;\n\n // Create closed promise\n this.#closedPromise = new Promise((resolve) => {\n this.#closeResolver = resolve;\n });\n\n // Start receiving messages\n void this.#startReceiving();\n }\n\n /**\n * AbortSignal that triggers when the connection closes.\n * Useful for cancelling operations tied to this connection.\n */\n get signal(): AbortSignal {\n return this.#abortController.signal;\n }\n\n /**\n * Promise that resolves when the connection is closed.\n */\n get closed(): Promise<void> {\n return this.#closedPromise;\n }\n\n /**\n * Whether the connection is closed\n */\n get isClosed(): boolean {\n return this.#closed;\n }\n\n /**\n * Set the handler for incoming requests\n */\n setRequestHandler(handler: RequestHandler): void {\n this.#requestHandler = handler;\n }\n\n /**\n * Set the handler for incoming notifications\n */\n setNotificationHandler(handler: NotificationHandler): void {\n this.#notificationHandler = handler;\n }\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#state;\n }\n\n /**\n * Register a handler for state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(handler: StateChangeHandler): () => void {\n this.#stateChangeHandlers.add(handler);\n return () => this.#stateChangeHandlers.delete(handler);\n }\n\n /**\n * Transition to a new state and notify handlers.\n * @internal\n */\n _transitionTo(newState: ConnectionState): void {\n if (this.#state === newState) return;\n\n const oldState = this.#state;\n this.#state = newState;\n\n for (const handler of this.#stateChangeHandlers) {\n try {\n handler(newState, oldState);\n } catch (error) {\n console.error('MAP: State change handler error:', error);\n }\n }\n }\n\n /**\n * Reconnect with a new stream.\n *\n * This method is used by role-specific connections to replace the\n * underlying transport after a disconnect.\n *\n * @param newStream - The new stream to use\n * @throws If the connection is permanently closed\n */\n async reconnect(newStream: Stream): Promise<void> {\n if (this.#state === 'closed') {\n throw new Error('Cannot reconnect a permanently closed connection');\n }\n\n // Replace the stream\n this.#stream = newStream;\n this.#closed = false;\n\n // Reset the write queue\n this.#writeQueue = Promise.resolve();\n\n // Start receiving on the new stream\n void this.#startReceiving();\n\n this._transitionTo('connected');\n }\n\n /**\n * Send a request and wait for response\n */\n async sendRequest<TParams, TResult>(\n method: string,\n params?: TParams,\n options?: { timeout?: number }\n ): Promise<TResult> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const id = this.#nextRequestId++;\n const request = createRequest(id, method, params);\n\n const responsePromise = new Promise<TResult>((resolve, reject) => {\n const pending: PendingResponse<TResult> = { resolve, reject };\n\n // Set up timeout\n const timeout = options?.timeout ?? this.#defaultTimeout;\n if (timeout > 0) {\n pending.timeoutId = setTimeout(() => {\n this.#pendingResponses.delete(id);\n reject(new MAPTimeoutError(method, timeout));\n }, timeout);\n }\n\n this.#pendingResponses.set(id, pending as PendingResponse);\n });\n\n await this.#sendMessage(request as AnyMessage);\n\n return responsePromise;\n }\n\n /**\n * Send a notification (no response expected)\n */\n async sendNotification<TParams>(\n method: string,\n params?: TParams\n ): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const notification = createNotification(method, params);\n await this.#sendMessage(notification as AnyMessage);\n }\n\n /**\n * Send a response to a request\n */\n async sendResponse<TResult>(id: RequestId, result: TResult): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createSuccessResponse(id, result);\n await this.#sendMessage(response);\n }\n\n /**\n * Send an error response to a request\n */\n async sendErrorResponse(id: RequestId, error: MAPError): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createErrorResponse(id, error);\n await this.#sendMessage(response);\n }\n\n /**\n * Close the connection\n */\n async close(): Promise<void> {\n if (this.#closed) return;\n\n this.#closed = true;\n this._transitionTo('closed');\n this.#abortController.abort();\n\n // Reject all pending responses\n for (const [, pending] of this.#pendingResponses) {\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n pending.reject(MAPConnectionError.closed());\n }\n this.#pendingResponses.clear();\n\n // Close the stream\n try {\n const writer = this.#stream.writable.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Ignore close errors\n }\n\n this.#closeResolver();\n }\n\n /**\n * Start receiving messages from the stream\n */\n async #startReceiving(): Promise<void> {\n const reader = this.#stream.readable.getReader();\n\n try {\n while (!this.#closed) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n await this.#handleMessage(value);\n }\n } catch (error) {\n if (!this.#closed) {\n console.error('MAP: Error receiving message:', error);\n }\n } finally {\n reader.releaseLock();\n await this.close();\n }\n }\n\n /**\n * Handle an incoming message\n */\n async #handleMessage(message: AnyMessage): Promise<void> {\n try {\n if (isRequest(message)) {\n await this.#handleRequest(message);\n } else if (isNotification(message)) {\n await this.#handleNotification(message);\n } else if (isResponse(message)) {\n this.#handleResponse(message);\n } else {\n console.error('MAP: Unknown message type:', message);\n }\n } catch (error) {\n console.error('MAP: Error handling message:', error);\n }\n }\n\n /**\n * Handle an incoming request\n */\n async #handleRequest(request: JsonRpcRequest): Promise<void> {\n const { id, method, params } = request;\n\n if (!this.#requestHandler) {\n await this.sendErrorResponse(\n id,\n MAPRequestError.methodNotFound(method).toError()\n );\n return;\n }\n\n try {\n const result = await this.#requestHandler(method, params);\n await this.sendResponse(id, result ?? null);\n } catch (error) {\n if (error instanceof MAPRequestError) {\n await this.sendErrorResponse(id, error.toError());\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error';\n await this.sendErrorResponse(\n id,\n MAPRequestError.internalError(message).toError()\n );\n }\n }\n }\n\n /**\n * Handle an incoming notification\n */\n async #handleNotification(notification: JsonRpcNotification): Promise<void> {\n const { method, params } = notification;\n\n if (!this.#notificationHandler) {\n // Notifications are fire-and-forget, so just log\n console.warn('MAP: No notification handler for:', method);\n return;\n }\n\n try {\n await this.#notificationHandler(method, params);\n } catch (error) {\n console.error('MAP: Error handling notification:', method, error);\n }\n }\n\n /**\n * Handle an incoming response\n */\n #handleResponse(response: JsonRpcResponse): void {\n const { id } = response;\n const pending = this.#pendingResponses.get(id);\n\n if (!pending) {\n console.warn('MAP: Received response for unknown request:', id);\n return;\n }\n\n this.#pendingResponses.delete(id);\n\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n if (isErrorResponse(response)) {\n pending.reject(MAPRequestError.fromError(response.error));\n } else {\n pending.resolve(response.result);\n }\n }\n\n /**\n * Send a message through the stream with write queue serialization\n */\n async #sendMessage(message: AnyMessage): Promise<void> {\n this.#writeQueue = this.#writeQueue\n .then(async () => {\n if (this.#closed) return;\n\n const writer = this.#stream.writable.getWriter();\n try {\n await writer.write(message);\n } finally {\n writer.releaseLock();\n }\n })\n .catch((error) => {\n console.error('MAP: Write error:', error);\n });\n\n return this.#writeQueue;\n }\n}\n","/**\n * ULID utilities for MAP event IDs\n *\n * ULIDs (Universally Unique Lexicographically Sortable Identifiers) are:\n * - 26 characters, Crockford Base32 encoded\n * - Time-sortable (first 48 bits = millisecond timestamp)\n * - Lexicographically sortable (string comparison = chronological order)\n *\n * Format: TTTTTTTTTTRRRRRRRRRRRRRRR\n * |---------|-------------|\n * Timestamp Randomness\n * (10 chars) (16 chars)\n *\n * @example\n * ```typescript\n * import { ulid, ulidTimestamp, compareUlid } from './utils/ulid';\n *\n * const id = ulid(); // \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n * const ts = ulidTimestamp(id); // 1706123456789\n * ```\n */\n\n// Re-export from ulid package\nexport { ulid, monotonicFactory } from 'ulid';\n\n// Crockford Base32 alphabet used by ULID\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\nconst ENCODING_LEN = ENCODING.length; // 32\n\n/**\n * Extract the timestamp from a ULID.\n *\n * @param id - The ULID string\n * @returns Unix timestamp in milliseconds\n *\n * @example\n * ```typescript\n * const id = ulid();\n * const timestamp = ulidTimestamp(id);\n * console.log(new Date(timestamp));\n * ```\n */\nexport function ulidTimestamp(id: string): number {\n if (id.length !== 26) {\n throw new Error(`Invalid ULID: expected 26 characters, got ${id.length}`);\n }\n\n // Decode first 10 characters (timestamp portion)\n let time = 0;\n for (let i = 0; i < 10; i++) {\n const char = id[i].toUpperCase();\n const idx = ENCODING.indexOf(char);\n if (idx === -1) {\n throw new Error(`Invalid ULID character: ${char}`);\n }\n time = time * ENCODING_LEN + idx;\n }\n\n return time;\n}\n\n/**\n * Compare two ULIDs lexicographically.\n *\n * Since ULIDs are designed to be lexicographically sortable,\n * this comparison also gives chronological ordering.\n *\n * @param a - First ULID\n * @param b - Second ULID\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```typescript\n * const ids = [ulid(), ulid(), ulid()];\n * ids.sort(compareUlid); // Chronological order\n * ```\n */\nexport function compareUlid(a: string, b: string): number {\n return a.localeCompare(b);\n}\n\n/**\n * Check if a string is a valid ULID format.\n *\n * @param id - String to check\n * @returns True if valid ULID format\n */\nexport function isValidUlid(id: string): boolean {\n if (typeof id !== 'string' || id.length !== 26) {\n return false;\n }\n\n for (let i = 0; i < 26; i++) {\n if (ENCODING.indexOf(id[i].toUpperCase()) === -1) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Retry utilities with exponential backoff\n *\n * Provides configurable retry logic for handling transient failures\n * in network operations like reconnection.\n */\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryPolicy {\n /** Maximum number of retry attempts (default: 10) */\n maxRetries: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Add randomness to delay to prevent thundering herd (default: true) */\n jitter: boolean;\n /** Custom function to determine if an error is retryable */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Default retry policy with sensible defaults for network operations\n */\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 10,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitter: true,\n};\n\n/**\n * State passed to retry callbacks\n */\nexport interface RetryState {\n /** Current attempt number (1-indexed) */\n attempt: number;\n /** Delay before next retry in milliseconds */\n nextDelayMs: number;\n /** The error that caused this retry */\n lastError?: Error;\n}\n\n/**\n * Callbacks for monitoring retry progress\n */\nexport interface RetryCallbacks<T> {\n /** Called before each retry attempt */\n onRetry?: (state: RetryState) => void;\n /** Called on successful completion */\n onSuccess?: (result: T, attempts: number) => void;\n /** Called when all retries are exhausted */\n onFailure?: (error: Error, attempts: number) => void;\n}\n\n/**\n * Calculate delay for a retry attempt using exponential backoff.\n *\n * Formula: min(baseDelay * 2^(attempt-1), maxDelay) * jitter\n *\n * @param attempt - Current attempt number (1-indexed)\n * @param policy - Retry policy configuration\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * // With baseDelay=1000, maxDelay=30000:\n * // Attempt 1: 1000ms\n * // Attempt 2: 2000ms\n * // Attempt 3: 4000ms\n * // Attempt 4: 8000ms\n * // Attempt 5: 16000ms\n * // Attempt 6+: 30000ms (capped)\n * ```\n */\nexport function calculateDelay(attempt: number, policy: RetryPolicy): number {\n // Exponential backoff: baseDelay * 2^(attempt-1)\n let delay = Math.min(\n policy.baseDelayMs * Math.pow(2, attempt - 1),\n policy.maxDelayMs\n );\n\n // Add jitter: multiply by random factor between 0.5 and 1.5\n if (policy.jitter) {\n delay = delay * (0.5 + Math.random());\n }\n\n return Math.floor(delay);\n}\n\n/**\n * Execute an async operation with retry logic.\n *\n * Retries the operation on failure using exponential backoff until\n * either it succeeds or the maximum retries are exhausted.\n *\n * @param operation - Async function to execute\n * @param policy - Retry policy (defaults to DEFAULT_RETRY_POLICY)\n * @param callbacks - Optional callbacks for monitoring progress\n * @returns The result of the successful operation\n * @throws The last error if all retries are exhausted\n *\n * @example\n * ```typescript\n * const result = await withRetry(\n * () => fetch('https://api.example.com/data'),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true },\n * {\n * onRetry: ({ attempt, nextDelayMs }) => {\n * console.log(`Retry ${attempt}, waiting ${nextDelayMs}ms`);\n * },\n * }\n * );\n * ```\n */\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY,\n callbacks?: RetryCallbacks<T>\n): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= policy.maxRetries + 1; attempt++) {\n try {\n const result = await operation();\n callbacks?.onSuccess?.(result, attempt);\n return result;\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n const isRetryable = policy.isRetryable?.(lastError) ?? true;\n const hasMoreAttempts = attempt <= policy.maxRetries;\n\n if (!isRetryable || !hasMoreAttempts) {\n break;\n }\n\n // Calculate delay and wait\n const delay = calculateDelay(attempt, policy);\n\n callbacks?.onRetry?.({\n attempt,\n nextDelayMs: delay,\n lastError,\n });\n\n await sleep(delay);\n }\n }\n\n callbacks?.onFailure?.(lastError!, policy.maxRetries + 1);\n throw lastError;\n}\n\n/**\n * Create a retryable wrapper around an async function.\n *\n * Returns a new function with the same signature that automatically\n * retries on failure according to the policy.\n *\n * @param fn - Async function to wrap\n * @param policy - Retry policy\n * @returns Wrapped function with retry behavior\n *\n * @example\n * ```typescript\n * const fetchWithRetry = retryable(\n * async (url: string) => fetch(url),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true }\n * );\n *\n * const response = await fetchWithRetry('https://api.example.com');\n * ```\n */\nexport function retryable<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY\n): (...args: TArgs) => Promise<TResult> {\n return (...args: TArgs) => withRetry(() => fn(...args), policy);\n}\n\n/**\n * Create a partial retry policy merged with defaults.\n *\n * @param options - Partial policy options to override defaults\n * @returns Complete retry policy\n */\nexport function createRetryPolicy(\n options: Partial<RetryPolicy> = {}\n): RetryPolicy {\n return { ...DEFAULT_RETRY_POLICY, ...options };\n}\n\n/**\n * Sleep for a specified duration.\n *\n * @param ms - Duration in milliseconds\n * @returns Promise that resolves after the duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Causal Event Buffer\n *\n * Buffers events and releases them in causal order. Events with `causedBy`\n * dependencies are held until all their predecessor events have been seen.\n *\n * This is useful for:\n * - Ensuring events are processed in correct causal order\n * - Handling out-of-order event delivery\n * - Building consistent views from event streams\n */\n\nimport type { Event } from '../types';\n\n/**\n * Event with envelope metadata for causal tracking\n */\nexport interface CausalEvent {\n /** Unique event identifier */\n eventId: string;\n /** Event IDs that must be processed before this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n /** Timestamp when the event was received */\n receivedAt?: number;\n}\n\n/**\n * Mode for handling events with multiple causal dependencies.\n * - \"all\": Wait for ALL causes before releasing (stricter, default)\n * - \"any\": Release when ANY cause is seen (more permissive)\n */\nexport type MultiCauseMode = \"all\" | \"any\";\n\n/**\n * Options for CausalEventBuffer\n */\nexport interface CausalEventBufferOptions {\n /**\n * Maximum time (ms) to wait for causal predecessors before releasing anyway.\n * Default: 5000ms. Set to 0 or Infinity to wait indefinitely.\n */\n maxWaitTime?: number;\n\n /**\n * Maximum number of events to buffer before force-releasing oldest.\n * Default: 1000. Prevents unbounded memory growth.\n */\n maxBufferSize?: number;\n\n /**\n * Mode for handling events with multiple causes.\n * - \"all\" (default): Wait for ALL causes before releasing\n * - \"any\": Release when ANY cause is seen\n */\n multiCauseMode?: MultiCauseMode;\n\n /**\n * Callback when an event is released despite missing predecessors (timeout or buffer overflow).\n */\n onForcedRelease?: (event: CausalEvent, missingPredecessors: string[]) => void;\n}\n\n/**\n * Result from pushing an event to the buffer\n */\nexport interface CausalBufferPushResult {\n /** Events that are now ready to be processed in causal order */\n ready: CausalEvent[];\n /** Number of events still waiting for predecessors */\n pending: number;\n}\n\n/**\n * Buffers events and releases them in causal order.\n *\n * Events with `causedBy` dependencies are held until all predecessor events\n * have been seen (pushed to the buffer). Events without dependencies are\n * released immediately.\n *\n * @example\n * ```typescript\n * const buffer = new CausalEventBuffer();\n *\n * // Event B depends on A, but arrives first\n * let result = buffer.push({\n * eventId: 'B',\n * causedBy: ['A'],\n * event: { id: 'B', type: 'effect', timestamp: 2 }\n * });\n * console.log(result.ready); // [] - B is waiting for A\n * console.log(result.pending); // 1\n *\n * // Event A arrives\n * result = buffer.push({\n * eventId: 'A',\n * event: { id: 'A', type: 'cause', timestamp: 1 }\n * });\n * console.log(result.ready); // [A, B] - Both released in order\n * console.log(result.pending); // 0\n * ```\n */\nexport class CausalEventBuffer {\n readonly #options: Required<Omit<CausalEventBufferOptions, 'onForcedRelease'>> & {\n onForcedRelease?: CausalEventBufferOptions['onForcedRelease'];\n };\n\n /** Events seen (by eventId) - used to check if predecessors exist */\n readonly #seen: Set<string> = new Set();\n\n /** Events waiting for predecessors */\n readonly #pending: Map<string, CausalEvent> = new Map();\n\n /** Map from eventId to events waiting for it */\n readonly #waitingFor: Map<string, Set<string>> = new Map();\n\n constructor(options: CausalEventBufferOptions = {}) {\n this.#options = {\n maxWaitTime: options.maxWaitTime ?? 5000,\n maxBufferSize: options.maxBufferSize ?? 1000,\n multiCauseMode: options.multiCauseMode ?? \"all\",\n onForcedRelease: options.onForcedRelease,\n };\n }\n\n /**\n * Get the current multi-cause mode.\n */\n get multiCauseMode(): MultiCauseMode {\n return this.#options.multiCauseMode;\n }\n\n /**\n * Push an event into the buffer.\n *\n * @param event - The event to buffer\n * @returns Events that are ready to be processed (in causal order)\n */\n push(event: CausalEvent): CausalBufferPushResult {\n const ready: CausalEvent[] = [];\n\n // Check if we've already seen this event (deduplication)\n if (this.#seen.has(event.eventId)) {\n return { ready, pending: this.#pending.size };\n }\n\n // Mark as seen\n this.#seen.add(event.eventId);\n\n // Add received timestamp if not present\n if (!event.receivedAt) {\n event = { ...event, receivedAt: Date.now() };\n }\n\n // Check if predecessors are satisfied based on multi-cause mode\n const shouldRelease = this.#shouldReleaseEvent(event);\n\n if (shouldRelease) {\n // No dependencies or dependencies satisfied - release immediately\n ready.push(event);\n\n // Check if this event unblocks any pending events\n this.#releaseWaiting(event.eventId, ready);\n } else {\n // Wait for predecessors\n this.#pending.set(event.eventId, event);\n\n // Track what this event is waiting for\n const predecessors = event.causedBy ?? [];\n for (const predecessorId of predecessors) {\n if (!this.#waitingFor.has(predecessorId)) {\n this.#waitingFor.set(predecessorId, new Set());\n }\n this.#waitingFor.get(predecessorId)!.add(event.eventId);\n }\n }\n\n // Check for buffer overflow\n this.#handleBufferOverflow(ready);\n\n // Check for timeouts\n this.#handleTimeouts(ready);\n\n return { ready, pending: this.#pending.size };\n }\n\n /**\n * Get the number of events waiting for predecessors\n */\n get pendingCount(): number {\n return this.#pending.size;\n }\n\n /**\n * Get the number of unique events seen\n */\n get seenCount(): number {\n return this.#seen.size;\n }\n\n /**\n * Check if a specific event has been seen\n */\n hasSeen(eventId: string): boolean {\n return this.#seen.has(eventId);\n }\n\n /**\n * Force release all pending events, regardless of missing predecessors.\n * Useful for cleanup or when you know no more events are coming.\n *\n * @returns All pending events in the order they would be released\n */\n flush(): CausalEvent[] {\n const ready: CausalEvent[] = [];\n\n // Release all pending events, trying to maintain some order\n // Sort by receivedAt to release in arrival order\n const pendingList = Array.from(this.#pending.values()).sort(\n (a, b) => (a.receivedAt ?? 0) - (b.receivedAt ?? 0)\n );\n\n for (const event of pendingList) {\n const missingPredecessors = this.#getMissingPredecessors(event);\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n ready.push(event);\n }\n\n this.#pending.clear();\n this.#waitingFor.clear();\n\n return ready;\n }\n\n /**\n * Clear all state (seen events, pending events)\n */\n clear(): void {\n this.#seen.clear();\n this.#pending.clear();\n this.#waitingFor.clear();\n }\n\n /**\n * Check if an event should be released based on its predecessors and the multi-cause mode.\n */\n #shouldReleaseEvent(event: CausalEvent): boolean {\n if (!event.causedBy || event.causedBy.length === 0) {\n return true; // No dependencies - release immediately\n }\n\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n if (this.#options.multiCauseMode === \"any\") {\n // \"any\" mode: release if ANY predecessor is satisfied (not missing)\n // If all are missing, we must wait\n return missingPredecessors.length < event.causedBy.length;\n } else {\n // \"all\" mode (default): release only if ALL predecessors are satisfied\n return missingPredecessors.length === 0;\n }\n }\n\n /**\n * Get missing predecessors for an event.\n * A predecessor is considered \"missing\" if it hasn't been released yet\n * (either not seen at all, or seen but still pending).\n */\n #getMissingPredecessors(event: CausalEvent): string[] {\n if (!event.causedBy || event.causedBy.length === 0) {\n return [];\n }\n\n return event.causedBy.filter((predecessorId) => {\n // Predecessor is missing if:\n // 1. We haven't seen it at all, OR\n // 2. We've seen it but it's still pending (waiting for its own predecessors)\n return !this.#seen.has(predecessorId) || this.#pending.has(predecessorId);\n });\n }\n\n /**\n * Release events that were waiting for a specific predecessor\n */\n #releaseWaiting(predecessorId: string, ready: CausalEvent[]): void {\n const waitingEventIds = this.#waitingFor.get(predecessorId);\n if (!waitingEventIds) return;\n\n // Remove this predecessor from the waiting map\n this.#waitingFor.delete(predecessorId);\n\n for (const waitingEventId of waitingEventIds) {\n const waitingEvent = this.#pending.get(waitingEventId);\n if (!waitingEvent) continue;\n\n // Check if predecessors are now satisfied (respects multi-cause mode)\n if (this.#shouldReleaseEvent(waitingEvent)) {\n // Predecessors satisfied - release this event\n this.#pending.delete(waitingEventId);\n\n // Clean up waiting entries for this event's other predecessors\n if (waitingEvent.causedBy) {\n for (const otherPredId of waitingEvent.causedBy) {\n if (otherPredId !== predecessorId) {\n const waiting = this.#waitingFor.get(otherPredId);\n if (waiting) {\n waiting.delete(waitingEventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(otherPredId);\n }\n }\n }\n }\n }\n\n ready.push(waitingEvent);\n\n // Recursively check if this event unblocks others\n this.#releaseWaiting(waitingEventId, ready);\n }\n }\n }\n\n /**\n * Handle buffer overflow by force-releasing oldest events\n */\n #handleBufferOverflow(ready: CausalEvent[]): void {\n while (this.#pending.size > this.#options.maxBufferSize) {\n // Find oldest pending event by receivedAt\n let oldest: CausalEvent | null = null;\n for (const event of this.#pending.values()) {\n if (!oldest || (event.receivedAt ?? 0) < (oldest.receivedAt ?? 0)) {\n oldest = event;\n }\n }\n\n if (oldest) {\n this.#forceRelease(oldest, ready);\n }\n }\n }\n\n /**\n * Handle events that have been waiting too long\n */\n #handleTimeouts(ready: CausalEvent[]): void {\n if (this.#options.maxWaitTime <= 0 || this.#options.maxWaitTime === Infinity) {\n return;\n }\n\n const now = Date.now();\n const toRelease: CausalEvent[] = [];\n\n for (const event of this.#pending.values()) {\n const waitTime = now - (event.receivedAt ?? now);\n if (waitTime >= this.#options.maxWaitTime) {\n toRelease.push(event);\n }\n }\n\n for (const event of toRelease) {\n this.#forceRelease(event, ready);\n }\n }\n\n /**\n * Force release an event despite missing predecessors\n */\n #forceRelease(event: CausalEvent, ready: CausalEvent[]): void {\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n // Remove from pending\n this.#pending.delete(event.eventId);\n\n // Remove from waiting lists\n for (const predecessorId of event.causedBy ?? []) {\n const waiting = this.#waitingFor.get(predecessorId);\n if (waiting) {\n waiting.delete(event.eventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(predecessorId);\n }\n }\n }\n\n // Notify callback\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n\n // Add to ready list\n ready.push(event);\n\n // Check if this unblocks others\n this.#releaseWaiting(event.eventId, ready);\n }\n}\n\n/**\n * Validate that events are in causal order.\n *\n * An event sequence is in causal order if no event appears before\n * any of its predecessors (events in its causedBy array).\n *\n * @param events - Events to validate\n * @returns True if events are in valid causal order\n *\n * @example\n * ```typescript\n * const events = [\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * ];\n * console.log(validateCausalOrder(events)); // true\n *\n * const badOrder = [\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'A', event: {...} }, // A should come before B\n * ];\n * console.log(validateCausalOrder(badOrder)); // false\n * ```\n */\nexport function validateCausalOrder(events: CausalEvent[]): boolean {\n const seen = new Set<string>();\n\n for (const event of events) {\n // Check all predecessors have been seen\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!seen.has(predecessorId)) {\n return false;\n }\n }\n }\n\n seen.add(event.eventId);\n }\n\n return true;\n}\n\n/**\n * Sort events into causal order using topological sort.\n *\n * If the events form a valid DAG (no cycles), returns them in an order\n * where no event appears before its predecessors. If there are cycles\n * or missing predecessors, throws an error.\n *\n * @param events - Events to sort\n * @returns Events in causal order\n * @throws If events contain cycles or reference missing predecessors\n *\n * @example\n * ```typescript\n * const unordered = [\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * ];\n * const ordered = sortCausalOrder(unordered);\n * // ordered = [A, B, C]\n * ```\n */\nexport function sortCausalOrder(events: CausalEvent[]): CausalEvent[] {\n const eventMap = new Map<string, CausalEvent>();\n for (const event of events) {\n eventMap.set(event.eventId, event);\n }\n\n const result: CausalEvent[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n\n function visit(eventId: string): void {\n if (visited.has(eventId)) return;\n\n if (visiting.has(eventId)) {\n throw new Error(`Cycle detected involving event: ${eventId}`);\n }\n\n const event = eventMap.get(eventId);\n if (!event) {\n throw new Error(`Missing event: ${eventId}`);\n }\n\n visiting.add(eventId);\n\n // Visit predecessors first\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!eventMap.has(predecessorId)) {\n throw new Error(`Missing predecessor: ${predecessorId} for event: ${eventId}`);\n }\n visit(predecessorId);\n }\n }\n\n visiting.delete(eventId);\n visited.add(eventId);\n result.push(event);\n }\n\n for (const event of events) {\n visit(event.eventId);\n }\n\n return result;\n}\n","/**\n * ACP (Agent Client Protocol) types for ACP-over-MAP tunneling.\n *\n * These types are bundled directly in the MAP SDK for simplicity,\n * enabling ACP semantics to be preserved when routing through MAP.\n *\n * @see https://agentclientprotocol.com/\n * @module\n */\n\n// =============================================================================\n// Core ID Types\n// =============================================================================\n\n/**\n * A unique identifier for a conversation session.\n */\nexport type ACPSessionId = string;\n\n/**\n * JSON-RPC request ID.\n */\nexport type ACPRequestId = string | number | null;\n\n/**\n * Protocol version identifier.\n */\nexport type ACPProtocolVersion = number;\n\n/**\n * Unique identifier for a tool call within a session.\n */\nexport type ACPToolCallId = string;\n\n/**\n * Unique identifier for a permission option.\n */\nexport type ACPPermissionOptionId = string;\n\n/**\n * Unique identifier for a session mode.\n */\nexport type ACPSessionModeId = string;\n\n// =============================================================================\n// JSON-RPC Base Types\n// =============================================================================\n\n/**\n * ACP JSON-RPC request structure.\n */\nexport interface ACPRequest<TParams = unknown> {\n jsonrpc: \"2.0\";\n id: ACPRequestId;\n method: string;\n params?: TParams;\n}\n\n/**\n * ACP JSON-RPC notification structure (no response expected).\n */\nexport interface ACPNotification<TParams = unknown> {\n jsonrpc: \"2.0\";\n method: string;\n params?: TParams;\n}\n\n/**\n * ACP JSON-RPC success response structure.\n */\nexport interface ACPSuccessResponse<TResult = unknown> {\n jsonrpc: \"2.0\";\n id: ACPRequestId;\n result: TResult;\n}\n\n/**\n * ACP JSON-RPC error object.\n */\nexport interface ACPErrorObject {\n code: ACPErrorCode;\n message: string;\n data?: unknown;\n}\n\n/**\n * ACP JSON-RPC error response structure.\n */\nexport interface ACPErrorResponse {\n jsonrpc: \"2.0\";\n id: ACPRequestId;\n error: ACPErrorObject;\n}\n\n/**\n * Union of all ACP JSON-RPC response types.\n */\nexport type ACPResponse<TResult = unknown> =\n | ACPSuccessResponse<TResult>\n | ACPErrorResponse;\n\n/**\n * Union of all ACP JSON-RPC message types.\n */\nexport type ACPMessage =\n | ACPRequest\n | ACPNotification\n | ACPSuccessResponse\n | ACPErrorResponse;\n\n// =============================================================================\n// Error Codes\n// =============================================================================\n\n/**\n * Predefined ACP error codes following JSON-RPC specification.\n */\nexport type ACPErrorCode =\n | -32700 // Parse error\n | -32600 // Invalid request\n | -32601 // Method not found\n | -32602 // Invalid params\n | -32603 // Internal error\n | -32800 // Request cancelled\n | -32000 // Auth required\n | -32002 // Session not found\n | number; // Custom codes\n\n/**\n * Standard ACP error codes with semantic names.\n */\nexport const ACP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n REQUEST_CANCELLED: -32800,\n AUTH_REQUIRED: -32000,\n SESSION_NOT_FOUND: -32002,\n} as const;\n\n// =============================================================================\n// Error Class\n// =============================================================================\n\n/**\n * Error class for ACP protocol errors.\n * Preserves the original ACP error code and data.\n */\nexport class ACPError extends Error {\n readonly code: ACPErrorCode;\n readonly data?: unknown;\n\n constructor(code: ACPErrorCode, message: string, data?: unknown) {\n super(message);\n this.name = \"ACPError\";\n this.code = code;\n this.data = data;\n }\n\n /**\n * Create an ACPError from an error response.\n */\n static fromResponse(error: ACPErrorObject): ACPError {\n return new ACPError(error.code, error.message, error.data);\n }\n\n /**\n * Convert to JSON-RPC error object.\n */\n toErrorObject(): ACPErrorObject {\n return {\n code: this.code,\n message: this.message,\n ...(this.data !== undefined && { data: this.data }),\n };\n }\n}\n\n// =============================================================================\n// Meta Extension\n// =============================================================================\n\n/**\n * The _meta property for ACP extensibility.\n */\nexport type ACPMeta = {\n [key: string]: unknown;\n} | null;\n\n// =============================================================================\n// Implementation Info\n// =============================================================================\n\n/**\n * Metadata about the implementation of a client or agent.\n */\nexport interface ACPImplementation {\n _meta?: ACPMeta;\n /** Programmatic name of the implementation. */\n name: string;\n /** Human-readable title for display. */\n title?: string | null;\n /** Version string (e.g., \"1.0.0\"). */\n version: string;\n}\n\n// =============================================================================\n// Capabilities\n// =============================================================================\n\n/**\n * File system capabilities supported by the client.\n */\nexport interface ACPFileSystemCapability {\n _meta?: ACPMeta;\n /** Whether the client supports fs/read_text_file. */\n readTextFile?: boolean;\n /** Whether the client supports fs/write_text_file. */\n writeTextFile?: boolean;\n}\n\n/**\n * Capabilities supported by the client.\n */\nexport interface ACPClientCapabilities {\n _meta?: ACPMeta;\n /** File system capabilities. */\n fs?: ACPFileSystemCapability;\n /** Whether the client supports terminal methods. */\n terminal?: boolean;\n}\n\n/**\n * Prompt capabilities supported by the agent.\n */\nexport interface ACPPromptCapabilities {\n _meta?: ACPMeta;\n /** Agent supports audio content. */\n audio?: boolean;\n /** Agent supports embedded resource context. */\n embeddedContext?: boolean;\n /** Agent supports image content. */\n image?: boolean;\n}\n\n/**\n * MCP capabilities supported by the agent.\n */\nexport interface ACPMcpCapabilities {\n _meta?: ACPMeta;\n /** Agent supports HTTP MCP servers. */\n http?: boolean;\n /** Agent supports SSE MCP servers. */\n sse?: boolean;\n}\n\n/**\n * Session capabilities supported by the agent.\n */\nexport interface ACPSessionCapabilities {\n _meta?: ACPMeta;\n /** Whether the agent supports session/fork. */\n fork?: { _meta?: ACPMeta } | null;\n /** Whether the agent supports session/list. */\n list?: { _meta?: ACPMeta } | null;\n /** Whether the agent supports session/resume. */\n resume?: { _meta?: ACPMeta } | null;\n}\n\n/**\n * Capabilities supported by the agent.\n */\nexport interface ACPAgentCapabilities {\n _meta?: ACPMeta;\n /** Whether the agent supports session/load. */\n loadSession?: boolean;\n /** MCP capabilities. */\n mcpCapabilities?: ACPMcpCapabilities;\n /** Prompt capabilities. */\n promptCapabilities?: ACPPromptCapabilities;\n /** Session capabilities. */\n sessionCapabilities?: ACPSessionCapabilities;\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * Describes an available authentication method.\n */\nexport interface ACPAuthMethod {\n _meta?: ACPMeta;\n /** Unique identifier for this auth method. */\n id: string;\n /** Human-readable name. */\n name: string;\n /** Optional description. */\n description?: string | null;\n}\n\n// =============================================================================\n// Initialize\n// =============================================================================\n\n/**\n * Request parameters for the initialize method.\n */\nexport interface ACPInitializeRequest {\n _meta?: ACPMeta;\n /** The latest protocol version supported by the client. */\n protocolVersion: ACPProtocolVersion;\n /** Information about the client implementation. */\n clientInfo?: ACPImplementation | null;\n /** Capabilities supported by the client. */\n clientCapabilities?: ACPClientCapabilities;\n}\n\n/**\n * Response to the initialize method.\n */\nexport interface ACPInitializeResponse {\n _meta?: ACPMeta;\n /** The negotiated protocol version. */\n protocolVersion: ACPProtocolVersion;\n /** Information about the agent implementation. */\n agentInfo?: ACPImplementation | null;\n /** Capabilities supported by the agent. */\n agentCapabilities?: ACPAgentCapabilities;\n /** Available authentication methods. */\n authMethods?: ACPAuthMethod[];\n}\n\n// =============================================================================\n// Authenticate\n// =============================================================================\n\n/**\n * Request parameters for the authenticate method.\n */\nexport interface ACPAuthenticateRequest {\n _meta?: ACPMeta;\n /** The ID of the authentication method to use. */\n methodId: string;\n}\n\n/**\n * Response to the authenticate method.\n */\nexport interface ACPAuthenticateResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// MCP Server Configuration\n// =============================================================================\n\n/**\n * Environment variable for MCP server configuration.\n */\nexport interface ACPEnvVariable {\n _meta?: ACPMeta;\n name: string;\n value: string;\n}\n\n/**\n * HTTP header for MCP server configuration.\n */\nexport interface ACPHttpHeader {\n _meta?: ACPMeta;\n name: string;\n value: string;\n}\n\n/**\n * Stdio transport configuration for MCP.\n */\nexport interface ACPMcpServerStdio {\n _meta?: ACPMeta;\n name: string;\n command: string;\n args: string[];\n env: ACPEnvVariable[];\n}\n\n/**\n * HTTP transport configuration for MCP.\n */\nexport interface ACPMcpServerHttp {\n _meta?: ACPMeta;\n type: \"http\";\n name: string;\n url: string;\n headers: ACPHttpHeader[];\n}\n\n/**\n * SSE transport configuration for MCP.\n */\nexport interface ACPMcpServerSse {\n _meta?: ACPMeta;\n type: \"sse\";\n name: string;\n url: string;\n headers: ACPHttpHeader[];\n}\n\n/**\n * MCP server configuration (union of all transport types).\n */\nexport type ACPMcpServer = ACPMcpServerStdio | ACPMcpServerHttp | ACPMcpServerSse;\n\n// =============================================================================\n// Session Mode\n// =============================================================================\n\n/**\n * A mode the agent can operate in.\n */\nexport interface ACPSessionMode {\n _meta?: ACPMeta;\n id: ACPSessionModeId;\n name: string;\n description?: string | null;\n}\n\n/**\n * The set of modes and the currently active one.\n */\nexport interface ACPSessionModeState {\n _meta?: ACPMeta;\n availableModes: ACPSessionMode[];\n currentModeId: ACPSessionModeId;\n}\n\n// =============================================================================\n// Session Management\n// =============================================================================\n\n/**\n * Request parameters for creating a new session.\n */\nexport interface ACPNewSessionRequest {\n _meta?: ACPMeta;\n /** The working directory for this session. */\n cwd: string;\n /** List of MCP servers to connect to. */\n mcpServers: ACPMcpServer[];\n}\n\n/**\n * Response from creating a new session.\n */\nexport interface ACPNewSessionResponse {\n _meta?: ACPMeta;\n /** Unique identifier for the created session. */\n sessionId: ACPSessionId;\n /** Initial mode state if supported. */\n modes?: ACPSessionModeState | null;\n}\n\n/**\n * Request parameters for loading an existing session.\n */\nexport interface ACPLoadSessionRequest {\n _meta?: ACPMeta;\n /** The ID of the session to load. */\n sessionId: ACPSessionId;\n /** The working directory for this session. */\n cwd: string;\n /** List of MCP servers to connect to. */\n mcpServers: ACPMcpServer[];\n}\n\n/**\n * Response from loading an existing session.\n */\nexport interface ACPLoadSessionResponse {\n _meta?: ACPMeta;\n /** Mode state if supported. */\n modes?: ACPSessionModeState | null;\n}\n\n/**\n * Request parameters for setting a session mode.\n */\nexport interface ACPSetSessionModeRequest {\n _meta?: ACPMeta;\n /** The ID of the session. */\n sessionId: ACPSessionId;\n /** The ID of the mode to set. */\n modeId: ACPSessionModeId;\n}\n\n/**\n * Response to session/set_mode method.\n */\nexport interface ACPSetSessionModeResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// Content Types\n// =============================================================================\n\n/**\n * Optional annotations for content.\n */\nexport interface ACPAnnotations {\n _meta?: ACPMeta;\n audience?: ACPRole[] | null;\n lastModified?: string | null;\n priority?: number | null;\n}\n\n/**\n * Role in a conversation.\n */\nexport type ACPRole = \"assistant\" | \"user\";\n\n/**\n * Text content block.\n */\nexport interface ACPTextContent {\n _meta?: ACPMeta;\n type: \"text\";\n text: string;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Image content block.\n */\nexport interface ACPImageContent {\n _meta?: ACPMeta;\n type: \"image\";\n data: string;\n mimeType: string;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Audio content block.\n */\nexport interface ACPAudioContent {\n _meta?: ACPMeta;\n type: \"audio\";\n data: string;\n mimeType: string;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Resource link content block.\n */\nexport interface ACPResourceLink {\n _meta?: ACPMeta;\n type: \"resource_link\";\n uri: string;\n name: string;\n title?: string | null;\n description?: string | null;\n mimeType?: string | null;\n size?: number | null;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Text resource contents.\n */\nexport interface ACPTextResourceContents {\n _meta?: ACPMeta;\n uri: string;\n text: string;\n mimeType?: string | null;\n}\n\n/**\n * Binary resource contents.\n */\nexport interface ACPBlobResourceContents {\n _meta?: ACPMeta;\n uri: string;\n blob: string;\n mimeType?: string | null;\n}\n\n/**\n * Embedded resource content block.\n */\nexport interface ACPEmbeddedResource {\n _meta?: ACPMeta;\n type: \"resource\";\n resource: ACPTextResourceContents | ACPBlobResourceContents;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Union of all content block types.\n */\nexport type ACPContentBlock =\n | ACPTextContent\n | ACPImageContent\n | ACPAudioContent\n | ACPResourceLink\n | ACPEmbeddedResource;\n\n// =============================================================================\n// Prompt\n// =============================================================================\n\n/**\n * Request parameters for sending a user prompt.\n */\nexport interface ACPPromptRequest {\n _meta?: ACPMeta;\n /** The ID of the session. */\n sessionId: ACPSessionId;\n /** The content blocks of the user's message. */\n prompt: ACPContentBlock[];\n}\n\n/**\n * Reasons why an agent stops processing.\n */\nexport type ACPStopReason =\n | \"end_turn\"\n | \"max_tokens\"\n | \"max_turn_requests\"\n | \"refusal\"\n | \"cancelled\";\n\n/**\n * Response from processing a user prompt.\n */\nexport interface ACPPromptResponse {\n _meta?: ACPMeta;\n /** Why the agent stopped processing. */\n stopReason: ACPStopReason;\n}\n\n// =============================================================================\n// Cancel\n// =============================================================================\n\n/**\n * Notification to cancel ongoing operations for a session.\n */\nexport interface ACPCancelNotification {\n _meta?: ACPMeta;\n /** The ID of the session to cancel operations for. */\n sessionId: ACPSessionId;\n}\n\n// =============================================================================\n// Tool Call Types\n// =============================================================================\n\n/**\n * Categories of tools.\n */\nexport type ACPToolKind =\n | \"read\"\n | \"edit\"\n | \"delete\"\n | \"move\"\n | \"search\"\n | \"execute\"\n | \"think\"\n | \"fetch\"\n | \"switch_mode\"\n | \"other\";\n\n/**\n * Execution status of a tool call.\n */\nexport type ACPToolCallStatus = \"pending\" | \"in_progress\" | \"completed\" | \"failed\";\n\n/**\n * A file location being accessed by a tool.\n */\nexport interface ACPToolCallLocation {\n _meta?: ACPMeta;\n path: string;\n line?: number | null;\n}\n\n/**\n * A diff representing file modifications.\n */\nexport interface ACPDiff {\n _meta?: ACPMeta;\n path: string;\n oldText?: string | null;\n newText: string;\n}\n\n/**\n * Terminal reference.\n */\nexport interface ACPTerminal {\n _meta?: ACPMeta;\n terminalId: string;\n}\n\n/**\n * Standard content wrapper.\n */\nexport interface ACPContent {\n _meta?: ACPMeta;\n content: ACPContentBlock;\n}\n\n/**\n * Tool call content types.\n */\nexport type ACPToolCallContent =\n | (ACPContent & { type: \"content\" })\n | (ACPDiff & { type: \"diff\" })\n | (ACPTerminal & { type: \"terminal\" });\n\n/**\n * A tool call requested by the language model.\n */\nexport interface ACPToolCall {\n _meta?: ACPMeta;\n toolCallId: ACPToolCallId;\n title: string;\n kind?: ACPToolKind;\n status?: ACPToolCallStatus;\n rawInput?: unknown;\n rawOutput?: unknown;\n content?: ACPToolCallContent[];\n locations?: ACPToolCallLocation[];\n}\n\n/**\n * An update to an existing tool call.\n */\nexport interface ACPToolCallUpdate {\n _meta?: ACPMeta;\n toolCallId: ACPToolCallId;\n title?: string | null;\n kind?: ACPToolKind | null;\n status?: ACPToolCallStatus | null;\n rawInput?: unknown;\n rawOutput?: unknown;\n content?: ACPToolCallContent[] | null;\n locations?: ACPToolCallLocation[] | null;\n}\n\n// =============================================================================\n// Plan Types\n// =============================================================================\n\n/**\n * Priority levels for plan entries.\n */\nexport type ACPPlanEntryPriority = \"high\" | \"medium\" | \"low\";\n\n/**\n * Status of a plan entry.\n */\nexport type ACPPlanEntryStatus = \"pending\" | \"in_progress\" | \"completed\";\n\n/**\n * A single entry in the execution plan.\n */\nexport interface ACPPlanEntry {\n _meta?: ACPMeta;\n content: string;\n priority: ACPPlanEntryPriority;\n status: ACPPlanEntryStatus;\n}\n\n/**\n * An execution plan.\n */\nexport interface ACPPlan {\n _meta?: ACPMeta;\n entries: ACPPlanEntry[];\n}\n\n// =============================================================================\n// Session Update Types\n// =============================================================================\n\n/**\n * A streamed chunk of content.\n */\nexport interface ACPContentChunk {\n _meta?: ACPMeta;\n content: ACPContentBlock;\n}\n\n/**\n * Available command input type.\n */\nexport interface ACPUnstructuredCommandInput {\n _meta?: ACPMeta;\n}\n\n/**\n * Available command input.\n */\nexport type ACPAvailableCommandInput = ACPUnstructuredCommandInput;\n\n/**\n * Information about an available command.\n */\nexport interface ACPAvailableCommand {\n _meta?: ACPMeta;\n name: string;\n description: string;\n input?: ACPAvailableCommandInput | null;\n}\n\n/**\n * Available commands update.\n */\nexport interface ACPAvailableCommandsUpdate {\n _meta?: ACPMeta;\n availableCommands: ACPAvailableCommand[];\n}\n\n/**\n * Current mode update.\n */\nexport interface ACPCurrentModeUpdate {\n _meta?: ACPMeta;\n currentModeId: ACPSessionModeId;\n}\n\n/**\n * Session info update.\n */\nexport interface ACPSessionInfoUpdate {\n _meta?: ACPMeta;\n title?: string | null;\n updatedAt?: string | null;\n}\n\n/**\n * All session update types.\n */\nexport type ACPSessionUpdate =\n | (ACPContentChunk & { sessionUpdate: \"user_message_chunk\" })\n | (ACPContentChunk & { sessionUpdate: \"agent_message_chunk\" })\n | (ACPContentChunk & { sessionUpdate: \"agent_thought_chunk\" })\n | (ACPToolCall & { sessionUpdate: \"tool_call\" })\n | (ACPToolCallUpdate & { sessionUpdate: \"tool_call_update\" })\n | (ACPPlan & { sessionUpdate: \"plan\" })\n | (ACPAvailableCommandsUpdate & { sessionUpdate: \"available_commands_update\" })\n | (ACPCurrentModeUpdate & { sessionUpdate: \"current_mode_update\" })\n | (ACPSessionInfoUpdate & { sessionUpdate: \"session_info_update\" });\n\n/**\n * Session notification containing an update.\n */\nexport interface ACPSessionNotification {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n update: ACPSessionUpdate;\n}\n\n// =============================================================================\n// Permission Request\n// =============================================================================\n\n/**\n * Permission option kind.\n */\nexport type ACPPermissionOptionKind =\n | \"allow_once\"\n | \"allow_always\"\n | \"reject_once\"\n | \"reject_always\";\n\n/**\n * A permission option.\n */\nexport interface ACPPermissionOption {\n _meta?: ACPMeta;\n optionId: ACPPermissionOptionId;\n name: string;\n kind: ACPPermissionOptionKind;\n}\n\n/**\n * Request for user permission to execute a tool call.\n */\nexport interface ACPRequestPermissionRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n toolCall: ACPToolCallUpdate;\n options: ACPPermissionOption[];\n}\n\n/**\n * Permission outcome when user selected an option.\n */\nexport interface ACPSelectedPermissionOutcome {\n _meta?: ACPMeta;\n outcome: \"selected\";\n optionId: ACPPermissionOptionId;\n}\n\n/**\n * Permission outcome when cancelled.\n */\nexport interface ACPCancelledPermissionOutcome {\n outcome: \"cancelled\";\n}\n\n/**\n * Permission request outcome.\n */\nexport type ACPRequestPermissionOutcome =\n | ACPSelectedPermissionOutcome\n | ACPCancelledPermissionOutcome;\n\n/**\n * Response to a permission request.\n */\nexport interface ACPRequestPermissionResponse {\n _meta?: ACPMeta;\n outcome: ACPRequestPermissionOutcome;\n}\n\n// =============================================================================\n// File System\n// =============================================================================\n\n/**\n * Request to read content from a text file.\n */\nexport interface ACPReadTextFileRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n path: string;\n line?: number | null;\n limit?: number | null;\n}\n\n/**\n * Response containing file contents.\n */\nexport interface ACPReadTextFileResponse {\n _meta?: ACPMeta;\n content: string;\n}\n\n/**\n * Request to write content to a text file.\n */\nexport interface ACPWriteTextFileRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n path: string;\n content: string;\n}\n\n/**\n * Response to write text file.\n */\nexport interface ACPWriteTextFileResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// Terminal\n// =============================================================================\n\n/**\n * Request to create a new terminal.\n */\nexport interface ACPCreateTerminalRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n command: string;\n args?: string[];\n cwd?: string | null;\n env?: ACPEnvVariable[];\n outputByteLimit?: number | null;\n}\n\n/**\n * Response containing the terminal ID.\n */\nexport interface ACPCreateTerminalResponse {\n _meta?: ACPMeta;\n terminalId: string;\n}\n\n/**\n * Request to get terminal output.\n */\nexport interface ACPTerminalOutputRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Terminal exit status.\n */\nexport interface ACPTerminalExitStatus {\n _meta?: ACPMeta;\n exitCode?: number | null;\n signal?: string | null;\n}\n\n/**\n * Response containing terminal output.\n */\nexport interface ACPTerminalOutputResponse {\n _meta?: ACPMeta;\n output: string;\n truncated: boolean;\n exitStatus?: ACPTerminalExitStatus | null;\n}\n\n/**\n * Request to release a terminal.\n */\nexport interface ACPReleaseTerminalRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Response to release terminal.\n */\nexport interface ACPReleaseTerminalResponse {\n _meta?: ACPMeta;\n}\n\n/**\n * Request to wait for terminal exit.\n */\nexport interface ACPWaitForTerminalExitRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Response with terminal exit status.\n */\nexport interface ACPWaitForTerminalExitResponse {\n _meta?: ACPMeta;\n exitCode?: number | null;\n signal?: string | null;\n}\n\n/**\n * Request to kill a terminal command.\n */\nexport interface ACPKillTerminalCommandRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Response to kill terminal command.\n */\nexport interface ACPKillTerminalCommandResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// ACP-over-MAP Envelope\n// =============================================================================\n\n/**\n * Context for ACP messages tunneled through MAP.\n */\nexport interface ACPContext {\n /** Unique identifier for this virtual ACP stream. */\n streamId: string;\n /** ACP session ID (null before session/new is called). */\n sessionId: ACPSessionId | null;\n /** Direction of message flow. */\n direction: \"client-to-agent\" | \"agent-to-client\";\n /** Information about a pending client request (for agent→client requests). */\n pendingClientRequest?: {\n requestId: ACPRequestId;\n method: string;\n timeout?: number;\n };\n}\n\n/**\n * Envelope wrapping ACP JSON-RPC messages for transport through MAP.\n *\n * This is the payload format used when sending ACP messages via MAP's send().\n */\nexport interface ACPEnvelope {\n /**\n * The original ACP JSON-RPC message.\n */\n acp: {\n jsonrpc: \"2.0\";\n id?: ACPRequestId;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: ACPErrorObject;\n };\n /**\n * ACP-specific routing context.\n */\n acpContext: ACPContext;\n}\n\n// =============================================================================\n// Client Handler Interfaces\n// =============================================================================\n\n/**\n * Handlers that the client provides for agent→client requests.\n */\nexport interface ACPClientHandlers {\n /**\n * Handle permission request from agent.\n */\n requestPermission(\n params: ACPRequestPermissionRequest\n ): Promise<ACPRequestPermissionResponse>;\n\n /**\n * Handle session update notification from agent.\n */\n sessionUpdate(params: ACPSessionNotification): Promise<void>;\n\n /**\n * Handle read text file request (optional, based on capabilities).\n */\n readTextFile?(\n params: ACPReadTextFileRequest\n ): Promise<ACPReadTextFileResponse>;\n\n /**\n * Handle write text file request (optional, based on capabilities).\n */\n writeTextFile?(\n params: ACPWriteTextFileRequest\n ): Promise<ACPWriteTextFileResponse>;\n\n /**\n * Handle create terminal request (optional, based on capabilities).\n */\n createTerminal?(\n params: ACPCreateTerminalRequest\n ): Promise<ACPCreateTerminalResponse>;\n\n /**\n * Handle terminal output request (optional, based on capabilities).\n */\n terminalOutput?(\n params: ACPTerminalOutputRequest\n ): Promise<ACPTerminalOutputResponse>;\n\n /**\n * Handle release terminal request (optional, based on capabilities).\n */\n releaseTerminal?(\n params: ACPReleaseTerminalRequest\n ): Promise<ACPReleaseTerminalResponse>;\n\n /**\n * Handle wait for terminal exit request (optional, based on capabilities).\n */\n waitForTerminalExit?(\n params: ACPWaitForTerminalExitRequest\n ): Promise<ACPWaitForTerminalExitResponse>;\n\n /**\n * Handle kill terminal command request (optional, based on capabilities).\n */\n killTerminal?(\n params: ACPKillTerminalCommandRequest\n ): Promise<ACPKillTerminalCommandResponse>;\n}\n\n// =============================================================================\n// Agent Handler Interfaces\n// =============================================================================\n\n/**\n * Context passed to agent handlers.\n */\nexport interface ACPAgentContext {\n /** The stream ID for this ACP session. */\n streamId: string;\n /** Current ACP session ID (null before newSession). */\n sessionId: ACPSessionId | null;\n /** The MAP participant ID of the client. */\n clientParticipantId: string;\n}\n\n/**\n * Handler interface for agents that support ACP.\n */\nexport interface ACPAgentHandler {\n /**\n * Handle initialize request.\n */\n initialize(\n params: ACPInitializeRequest,\n ctx: ACPAgentContext\n ): Promise<ACPInitializeResponse>;\n\n /**\n * Handle authenticate request (optional).\n */\n authenticate?(\n params: ACPAuthenticateRequest,\n ctx: ACPAgentContext\n ): Promise<ACPAuthenticateResponse>;\n\n /**\n * Handle new session request.\n */\n newSession(\n params: ACPNewSessionRequest,\n ctx: ACPAgentContext\n ): Promise<ACPNewSessionResponse>;\n\n /**\n * Handle load session request (optional).\n */\n loadSession?(\n params: ACPLoadSessionRequest,\n ctx: ACPAgentContext\n ): Promise<ACPLoadSessionResponse>;\n\n /**\n * Handle set session mode request (optional).\n */\n setSessionMode?(\n params: ACPSetSessionModeRequest,\n ctx: ACPAgentContext\n ): Promise<ACPSetSessionModeResponse>;\n\n /**\n * Handle prompt request.\n */\n prompt(\n params: ACPPromptRequest,\n ctx: ACPAgentContext\n ): Promise<ACPPromptResponse>;\n\n /**\n * Handle cancel notification.\n */\n cancel(params: ACPCancelNotification, ctx: ACPAgentContext): Promise<void>;\n}\n\n// =============================================================================\n// ACP Capability Constants\n// =============================================================================\n\n/**\n * Current stable ACP protocol version.\n */\nexport const ACP_PROTOCOL_VERSION = 20241007; // 2024-10-07\n\n/**\n * ACP method names.\n */\nexport const ACP_METHODS = {\n // Lifecycle\n INITIALIZE: \"initialize\",\n AUTHENTICATE: \"authenticate\",\n\n // Session management\n SESSION_NEW: \"session/new\",\n SESSION_LOAD: \"session/load\",\n SESSION_SET_MODE: \"session/set_mode\",\n\n // Prompt\n SESSION_PROMPT: \"session/prompt\",\n SESSION_CANCEL: \"session/cancel\",\n\n // Notifications\n SESSION_UPDATE: \"session/update\",\n\n // Agent→Client requests\n REQUEST_PERMISSION: \"request_permission\",\n FS_READ_TEXT_FILE: \"fs/read_text_file\",\n FS_WRITE_TEXT_FILE: \"fs/write_text_file\",\n TERMINAL_CREATE: \"terminal/create\",\n TERMINAL_OUTPUT: \"terminal/output\",\n TERMINAL_RELEASE: \"terminal/release\",\n TERMINAL_WAIT_FOR_EXIT: \"terminal/wait_for_exit\",\n TERMINAL_KILL: \"terminal/kill\",\n} as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a message is an ACP request.\n */\nexport function isACPRequest(msg: ACPMessage): msg is ACPRequest {\n if (typeof msg !== \"object\" || msg === null) {\n return false;\n }\n return \"method\" in msg && \"id\" in msg && msg.id !== undefined;\n}\n\n/**\n * Check if a message is an ACP notification.\n */\nexport function isACPNotification(msg: ACPMessage): msg is ACPNotification {\n if (typeof msg !== \"object\" || msg === null) {\n return false;\n }\n return \"method\" in msg && !(\"id\" in msg);\n}\n\n/**\n * Check if a message is an ACP response.\n */\nexport function isACPResponse(msg: ACPMessage): msg is ACPResponse {\n if (typeof msg !== \"object\" || msg === null) {\n return false;\n }\n return \"id\" in msg && !(\"method\" in msg);\n}\n\n/**\n * Check if a response is an error response.\n */\nexport function isACPErrorResponse(\n response: ACPResponse\n): response is ACPErrorResponse {\n if (typeof response !== \"object\" || response === null) {\n return false;\n }\n return \"error\" in response;\n}\n\n/**\n * Check if a response is a success response.\n */\nexport function isACPSuccessResponse<T>(\n response: ACPResponse<T>\n): response is ACPSuccessResponse<T> {\n if (typeof response !== \"object\" || response === null) {\n return false;\n }\n return \"result\" in response;\n}\n\n/**\n * Check if a payload is an ACP envelope.\n */\nexport function isACPEnvelope(payload: unknown): payload is ACPEnvelope {\n if (typeof payload !== \"object\" || payload === null) {\n return false;\n }\n const envelope = payload as Record<string, unknown>;\n if (\n typeof envelope.acp !== \"object\" ||\n envelope.acp === null ||\n typeof envelope.acpContext !== \"object\" ||\n envelope.acpContext === null\n ) {\n return false;\n }\n // Validate acpContext has required streamId\n const acpContext = envelope.acpContext as Record<string, unknown>;\n return typeof acpContext.streamId === \"string\";\n}\n","/**\n * ACPStreamConnection - Client-side virtual ACP connection over MAP.\n *\n * Provides a familiar ACP interface while using MAP's send/subscribe\n * primitives for transport. Supports request/response correlation,\n * timeout handling, and session lifecycle management.\n *\n * @module\n */\n\nimport { EventEmitter } from \"events\";\nimport type { ClientConnection } from \"../connection/client\";\nimport type { Subscription } from \"../subscription\";\nimport type { AgentId, Message } from \"../types\";\nimport {\n type ACPSessionId,\n type ACPRequestId,\n type ACPEnvelope,\n type ACPContext,\n type ACPClientHandlers,\n type ACPAgentCapabilities,\n type ACPInitializeRequest,\n type ACPInitializeResponse,\n type ACPAuthenticateRequest,\n type ACPAuthenticateResponse,\n type ACPNewSessionRequest,\n type ACPNewSessionResponse,\n type ACPLoadSessionRequest,\n type ACPLoadSessionResponse,\n type ACPSetSessionModeRequest,\n type ACPSetSessionModeResponse,\n type ACPPromptRequest,\n type ACPPromptResponse,\n type ACPCancelNotification,\n type ACPSessionNotification,\n type ACPRequestPermissionRequest,\n type ACPReadTextFileRequest,\n type ACPWriteTextFileRequest,\n type ACPCreateTerminalRequest,\n type ACPTerminalOutputRequest,\n type ACPReleaseTerminalRequest,\n type ACPWaitForTerminalExitRequest,\n type ACPKillTerminalCommandRequest,\n ACPError,\n ACP_METHODS,\n isACPEnvelope,\n} from \"./types\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for creating an ACP stream connection.\n */\nexport interface ACPStreamOptions {\n /** Target agent that will handle ACP requests */\n targetAgent: AgentId;\n /** Client-side handlers for agent→client requests */\n client: ACPClientHandlers;\n /** Optional: expose MAP events alongside ACP (for observability) */\n exposeMapEvents?: boolean;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Pending request state for correlation.\n */\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n method: string;\n}\n\n/**\n * Events emitted by ACPStreamConnection.\n */\nexport interface ACPStreamEvents {\n /** Emitted when ACP session is lost after reconnection */\n sessionLost: (info: { sessionId: ACPSessionId; reason: string }) => void;\n /** Emitted when the stream successfully reconnects */\n reconnected: () => void;\n /** Emitted when reconnection is in progress */\n reconnecting: () => void;\n /** Emitted when the stream is closed */\n close: () => void;\n /** Emitted on errors */\n error: (error: Error) => void;\n}\n\n// =============================================================================\n// ACPStreamConnection\n// =============================================================================\n\n/**\n * Virtual ACP connection over MAP.\n *\n * Provides the full ACP client interface, routing all requests through\n * the underlying MAP connection to a target agent.\n *\n * @example\n * ```typescript\n * const acp = new ACPStreamConnection(mapClient, {\n * targetAgent: 'coding-agent-1',\n * client: {\n * requestPermission: async (req) => ({ outcome: { outcome: 'selected', optionId: 'allow' } }),\n * sessionUpdate: async (update) => { console.log(update); },\n * }\n * });\n *\n * await acp.initialize({ protocolVersion: 20241007, clientInfo: { name: 'IDE', version: '1.0' } });\n * const { sessionId } = await acp.newSession({ cwd: '/project', mcpServers: [] });\n * const result = await acp.prompt({ sessionId, prompt: [{ type: 'text', text: 'Hello' }] });\n * ```\n */\nexport class ACPStreamConnection extends EventEmitter {\n readonly #mapClient: ClientConnection;\n readonly #options: ACPStreamOptions;\n readonly #streamId: string;\n readonly #pendingRequests: Map<string, PendingRequest> = new Map();\n\n #subscription: Subscription | null = null;\n #sessionId: ACPSessionId | null = null;\n #initialized = false;\n #capabilities: ACPAgentCapabilities | null = null;\n #closed = false;\n #lastEventId: string | null = null;\n #isReconnecting = false;\n #unsubscribeReconnection: (() => void) | null = null;\n\n /**\n * Create a new ACP stream connection.\n *\n * @param mapClient - The underlying MAP client connection\n * @param options - Stream configuration options\n */\n constructor(mapClient: ClientConnection, options: ACPStreamOptions) {\n super();\n this.#mapClient = mapClient;\n this.#options = options;\n this.#streamId = `acp-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Listen for MAP reconnection events\n this.#unsubscribeReconnection = mapClient.onReconnection((event) => {\n void this.#handleReconnectionEvent(event);\n });\n }\n\n // ===========================================================================\n // Public Properties\n // ===========================================================================\n\n /** Unique identifier for this ACP stream */\n get streamId(): string {\n return this.#streamId;\n }\n\n /** Target agent this stream connects to */\n get targetAgent(): AgentId {\n return this.#options.targetAgent;\n }\n\n /** Current ACP session ID (null until newSession called) */\n get sessionId(): ACPSessionId | null {\n return this.#sessionId;\n }\n\n /** Whether initialize() has been called */\n get initialized(): boolean {\n return this.#initialized;\n }\n\n /** Agent capabilities from initialize response */\n get capabilities(): ACPAgentCapabilities | null {\n return this.#capabilities;\n }\n\n /** Whether the stream is closed */\n get isClosed(): boolean {\n return this.#closed;\n }\n\n /** Last processed event ID (for reconnection support) */\n get lastEventId(): string | null {\n return this.#lastEventId;\n }\n\n /** Whether the stream is currently reconnecting */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n // ===========================================================================\n // Reconnection Handling\n // ===========================================================================\n\n /**\n * Handle MAP reconnection events.\n */\n async #handleReconnectionEvent(event: {\n type: string;\n error?: Error;\n }): Promise<void> {\n if (this.#closed) return;\n\n switch (event.type) {\n case \"disconnected\":\n this.#isReconnecting = true;\n this.emit(\"reconnecting\");\n\n // Reject all pending requests during reconnection\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"Connection lost during ACP request\"));\n this.#pendingRequests.delete(id);\n }\n break;\n\n case \"reconnected\":\n await this.#handleReconnected();\n break;\n\n case \"reconnectFailed\":\n this.#isReconnecting = false;\n this.emit(\"error\", event.error ?? new Error(\"MAP reconnection failed\"));\n break;\n }\n }\n\n /**\n * Handle successful MAP reconnection.\n */\n async #handleReconnected(): Promise<void> {\n // Clear old subscription reference (new one will be created)\n this.#subscription = null;\n\n try {\n // Re-establish subscription\n await this.#setupSubscription();\n\n // If we had a session, verify it's still valid\n if (this.#sessionId) {\n const sessionValid = await this.#verifySessionValid();\n\n if (!sessionValid) {\n const lostSessionId = this.#sessionId;\n this.#sessionId = null;\n this.emit(\"sessionLost\", {\n sessionId: lostSessionId,\n reason: \"Session no longer valid after reconnection\",\n });\n }\n }\n\n this.#isReconnecting = false;\n this.emit(\"reconnected\");\n } catch (error) {\n this.#isReconnecting = false;\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Verify that the current ACP session is still valid.\n *\n * Since ACP doesn't have a dedicated status check method, we attempt\n * a lightweight operation (cancel with no effect) to verify the session.\n */\n async #verifySessionValid(): Promise<boolean> {\n if (!this.#sessionId) return false;\n\n try {\n // Try to send a cancel notification - if the session is invalid,\n // the agent will reject it or we'll get an error\n // This is a non-destructive way to verify session validity\n await this.#sendNotification(ACP_METHODS.SESSION_CANCEL, {\n sessionId: this.#sessionId,\n reason: \"session_verification\",\n });\n return true;\n } catch {\n // If we get an error, the session is likely invalid\n return false;\n }\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Set up the subscription for receiving messages from the target agent.\n */\n async #setupSubscription(): Promise<void> {\n if (this.#subscription) return;\n\n this.#subscription = await this.#mapClient.subscribe({\n fromAgents: [this.#options.targetAgent],\n });\n\n // Process incoming events\n void this.#processEvents();\n }\n\n /**\n * Process incoming events from the subscription.\n */\n async #processEvents(): Promise<void> {\n if (!this.#subscription) return;\n\n try {\n for await (const event of this.#subscription) {\n if (this.#closed) break;\n\n // Track last event ID for reconnection\n if (event.id) {\n this.#lastEventId = event.id;\n }\n\n // Handle message events\n if (event.type === \"message_delivered\" && event.data) {\n const message = (event.data as { message?: Message }).message;\n if (message?.payload) {\n await this.#handleIncomingMessage(message);\n }\n }\n }\n } catch (error) {\n if (!this.#closed) {\n this.emit(\"error\", error);\n }\n }\n }\n\n /**\n * Handle an incoming message from the target agent.\n */\n async #handleIncomingMessage(message: Message): Promise<void> {\n const payload = message.payload;\n if (!isACPEnvelope(payload)) return;\n\n const envelope = payload as ACPEnvelope;\n const { acp, acpContext } = envelope;\n\n // Check if this message is for our stream\n if (acpContext.streamId !== this.#streamId) return;\n\n // Handle response to a pending request\n if (acp.id !== undefined && !acp.method) {\n const requestId = String(acp.id);\n const pending = this.#pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.#pendingRequests.delete(requestId);\n\n if (acp.error) {\n pending.reject(ACPError.fromResponse(acp.error));\n } else {\n pending.resolve(acp.result);\n }\n }\n return;\n }\n\n // Handle notification (no id, has method)\n if (acp.method && acp.id === undefined) {\n await this.#handleNotification(acp.method, acp.params, acpContext);\n return;\n }\n\n // Handle agent→client request (has id and method)\n if (acp.method && acp.id !== undefined) {\n await this.#handleAgentRequest(acp.id, acp.method, acp.params, acpContext, message);\n }\n }\n\n /**\n * Handle an ACP notification from the agent.\n */\n async #handleNotification(\n method: string,\n params: unknown,\n _acpContext: unknown\n ): Promise<void> {\n if (method === ACP_METHODS.SESSION_UPDATE) {\n await this.#options.client.sessionUpdate(params as ACPSessionNotification);\n }\n }\n\n /**\n * Handle an agent→client request.\n */\n async #handleAgentRequest(\n requestId: ACPRequestId,\n method: string,\n params: unknown,\n _ctx: ACPContext,\n originalMessage: Message\n ): Promise<void> {\n let result: unknown;\n let error: ACPError | undefined;\n\n try {\n switch (method) {\n case ACP_METHODS.REQUEST_PERMISSION:\n result = await this.#options.client.requestPermission(\n params as ACPRequestPermissionRequest\n );\n break;\n case ACP_METHODS.FS_READ_TEXT_FILE:\n if (!this.#options.client.readTextFile) {\n throw new ACPError(-32601, \"Method not supported: fs/read_text_file\");\n }\n result = await this.#options.client.readTextFile(\n params as ACPReadTextFileRequest\n );\n break;\n case ACP_METHODS.FS_WRITE_TEXT_FILE:\n if (!this.#options.client.writeTextFile) {\n throw new ACPError(-32601, \"Method not supported: fs/write_text_file\");\n }\n result = await this.#options.client.writeTextFile(\n params as ACPWriteTextFileRequest\n );\n break;\n case ACP_METHODS.TERMINAL_CREATE:\n if (!this.#options.client.createTerminal) {\n throw new ACPError(-32601, \"Method not supported: terminal/create\");\n }\n result = await this.#options.client.createTerminal(\n params as ACPCreateTerminalRequest\n );\n break;\n case ACP_METHODS.TERMINAL_OUTPUT:\n if (!this.#options.client.terminalOutput) {\n throw new ACPError(-32601, \"Method not supported: terminal/output\");\n }\n result = await this.#options.client.terminalOutput(\n params as ACPTerminalOutputRequest\n );\n break;\n case ACP_METHODS.TERMINAL_RELEASE:\n if (!this.#options.client.releaseTerminal) {\n throw new ACPError(-32601, \"Method not supported: terminal/release\");\n }\n result = await this.#options.client.releaseTerminal(\n params as ACPReleaseTerminalRequest\n );\n break;\n case ACP_METHODS.TERMINAL_WAIT_FOR_EXIT:\n if (!this.#options.client.waitForTerminalExit) {\n throw new ACPError(-32601, \"Method not supported: terminal/wait_for_exit\");\n }\n result = await this.#options.client.waitForTerminalExit(\n params as ACPWaitForTerminalExitRequest\n );\n break;\n case ACP_METHODS.TERMINAL_KILL:\n if (!this.#options.client.killTerminal) {\n throw new ACPError(-32601, \"Method not supported: terminal/kill\");\n }\n result = await this.#options.client.killTerminal(\n params as ACPKillTerminalCommandRequest\n );\n break;\n default:\n throw new ACPError(-32601, `Unknown method: ${method}`);\n }\n } catch (e) {\n if (e instanceof ACPError) {\n error = e;\n } else {\n error = new ACPError(-32603, (e as Error).message);\n }\n }\n\n // Send response back to agent\n const responseEnvelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: requestId,\n ...(error ? { error: error.toErrorObject() } : { result }),\n },\n acpContext: {\n streamId: this.#streamId,\n sessionId: this.#sessionId,\n direction: \"client-to-agent\",\n },\n };\n\n await this.#mapClient.send(\n { agent: this.#options.targetAgent },\n responseEnvelope,\n {\n protocol: \"acp\",\n correlationId: originalMessage.id,\n }\n );\n }\n\n /**\n * Send an ACP request and wait for response.\n */\n async #sendRequest<TParams, TResult>(\n method: string,\n params?: TParams\n ): Promise<TResult> {\n if (this.#closed) {\n throw new Error(\"ACP stream is closed\");\n }\n\n // Ensure subscription is set up\n await this.#setupSubscription();\n\n // Check again after await - close() may have been called\n if (this.#closed) {\n throw new Error(\"ACP stream closed\");\n }\n\n const correlationId = `${this.#streamId}-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const timeout = this.#options.timeout ?? 30000;\n\n // Create the envelope\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: correlationId,\n method,\n ...(params !== undefined && { params }),\n },\n acpContext: {\n streamId: this.#streamId,\n sessionId: this.#sessionId,\n direction: \"client-to-agent\",\n },\n };\n\n // Register the pending request BEFORE sending, so that close() can cancel it\n // even if close() is called while we're awaiting the send\n const resultPromise = new Promise<TResult>((resolve, reject) => {\n const timeoutHandle = setTimeout(() => {\n this.#pendingRequests.delete(correlationId);\n reject(new Error(`ACP request timed out after ${timeout}ms: ${method}`));\n }, timeout);\n\n this.#pendingRequests.set(correlationId, {\n resolve: resolve as (result: unknown) => void,\n reject,\n timeout: timeoutHandle,\n method,\n });\n });\n\n // Send via MAP\n try {\n await this.#mapClient.send({ agent: this.#options.targetAgent }, envelope, {\n protocol: \"acp\",\n correlationId,\n });\n } catch (err) {\n // If send fails, clean up the pending request\n const pending = this.#pendingRequests.get(correlationId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.#pendingRequests.delete(correlationId);\n }\n throw err;\n }\n\n // Check again after send - close() may have been called and already rejected\n // the pending request, in which case resultPromise will reject\n if (this.#closed && !this.#pendingRequests.has(correlationId)) {\n throw new Error(\"ACP stream closed\");\n }\n\n return resultPromise;\n }\n\n /**\n * Send an ACP notification (no response expected).\n */\n async #sendNotification<TParams>(method: string, params?: TParams): Promise<void> {\n if (this.#closed) {\n throw new Error(\"ACP stream is closed\");\n }\n\n await this.#setupSubscription();\n\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n method,\n ...(params !== undefined && { params }),\n },\n acpContext: {\n streamId: this.#streamId,\n sessionId: this.#sessionId,\n direction: \"client-to-agent\",\n },\n };\n\n await this.#mapClient.send({ agent: this.#options.targetAgent }, envelope, {\n protocol: \"acp\",\n });\n }\n\n // ===========================================================================\n // ACP Lifecycle Methods\n // ===========================================================================\n\n /**\n * Initialize the ACP connection with the target agent.\n */\n async initialize(params: ACPInitializeRequest): Promise<ACPInitializeResponse> {\n if (this.#initialized) {\n throw new Error(\"ACP stream already initialized\");\n }\n\n const result = await this.#sendRequest<ACPInitializeRequest, ACPInitializeResponse>(\n ACP_METHODS.INITIALIZE,\n params\n );\n\n this.#initialized = true;\n this.#capabilities = result.agentCapabilities ?? null;\n\n return result;\n }\n\n /**\n * Authenticate with the agent.\n */\n async authenticate(params: ACPAuthenticateRequest): Promise<ACPAuthenticateResponse> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before authenticate()\");\n }\n\n return this.#sendRequest<ACPAuthenticateRequest, ACPAuthenticateResponse>(\n ACP_METHODS.AUTHENTICATE,\n params\n );\n }\n\n // ===========================================================================\n // ACP Session Methods\n // ===========================================================================\n\n /**\n * Create a new ACP session.\n */\n async newSession(params: ACPNewSessionRequest): Promise<ACPNewSessionResponse> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before newSession()\");\n }\n\n const result = await this.#sendRequest<ACPNewSessionRequest, ACPNewSessionResponse>(\n ACP_METHODS.SESSION_NEW,\n params\n );\n\n this.#sessionId = result.sessionId;\n return result;\n }\n\n /**\n * Load an existing ACP session.\n */\n async loadSession(params: ACPLoadSessionRequest): Promise<ACPLoadSessionResponse> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before loadSession()\");\n }\n\n const result = await this.#sendRequest<ACPLoadSessionRequest, ACPLoadSessionResponse>(\n ACP_METHODS.SESSION_LOAD,\n params\n );\n\n this.#sessionId = params.sessionId;\n return result;\n }\n\n /**\n * Set the session mode.\n */\n async setSessionMode(params: ACPSetSessionModeRequest): Promise<ACPSetSessionModeResponse> {\n return this.#sendRequest<ACPSetSessionModeRequest, ACPSetSessionModeResponse>(\n ACP_METHODS.SESSION_SET_MODE,\n params\n );\n }\n\n // ===========================================================================\n // ACP Prompt Methods\n // ===========================================================================\n\n /**\n * Send a prompt to the agent.\n * Updates are received via the sessionUpdate handler.\n */\n async prompt(params: ACPPromptRequest): Promise<ACPPromptResponse> {\n if (!this.#sessionId) {\n throw new Error(\"Must call newSession() or loadSession() before prompt()\");\n }\n\n return this.#sendRequest<ACPPromptRequest, ACPPromptResponse>(\n ACP_METHODS.SESSION_PROMPT,\n params\n );\n }\n\n /**\n * Cancel ongoing operations for the current session.\n */\n async cancel(params?: Partial<ACPCancelNotification>): Promise<void> {\n if (!this.#sessionId) {\n throw new Error(\"No active session to cancel\");\n }\n\n await this.#sendNotification<ACPCancelNotification>(ACP_METHODS.SESSION_CANCEL, {\n sessionId: this.#sessionId,\n ...params,\n });\n }\n\n // ===========================================================================\n // Extension Methods\n // ===========================================================================\n\n /**\n * Call an ACP extension method on the target agent.\n *\n * Extension methods are prefixed with \"_\" (e.g., \"_macro/spawnAgent\").\n * The agent must support the extension for this to succeed.\n *\n * @param method - The extension method name (e.g., \"_macro/spawnAgent\")\n * @param params - Parameters to pass to the extension method\n * @returns The result from the extension method\n *\n * @example\n * ```typescript\n * const result = await acp.callExtension(\"_macro/spawnAgent\", {\n * task: \"Implement feature X\",\n * cwd: \"/project\"\n * });\n * ```\n */\n async callExtension<TParams = unknown, TResult = unknown>(\n method: string,\n params?: TParams\n ): Promise<TResult> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before callExtension()\");\n }\n\n return this.#sendRequest<TParams, TResult>(method, params);\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Close this ACP stream and clean up resources.\n */\n async close(): Promise<void> {\n if (this.#closed) return;\n\n this.#closed = true;\n\n // Unsubscribe from reconnection events\n if (this.#unsubscribeReconnection) {\n this.#unsubscribeReconnection();\n this.#unsubscribeReconnection = null;\n }\n\n // Cancel all pending requests\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"ACP stream closed\"));\n this.#pendingRequests.delete(id);\n }\n\n // Unsubscribe from events\n if (this.#subscription) {\n await this.#subscription.unsubscribe();\n this.#subscription = null;\n }\n\n this.emit(\"close\");\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create an ACP stream connection from a MAP client.\n *\n * @param mapClient - The underlying MAP client connection\n * @param options - Stream configuration options\n * @returns A new ACPStreamConnection instance\n */\nexport function createACPStream(\n mapClient: ClientConnection,\n options: ACPStreamOptions\n): ACPStreamConnection {\n return new ACPStreamConnection(mapClient, options);\n}\n","/**\n * Client connection for MAP protocol\n *\n * Used by clients to connect to a MAP system, query agents,\n * subscribe to events, and send messages.\n */\n\nimport { type Stream, websocketStream, waitForOpen } from '../stream';\nimport type {\n AgenticMeshStreamConfig,\n MeshPeerEndpoint,\n MeshTransportAdapter,\n} from '../stream/agentic-mesh';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { Subscription, createSubscription, type EventHandler } from '../subscription';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport {\n ACPStreamConnection,\n type ACPStreamOptions,\n} from '../acp/stream';\nimport {\n CORE_METHODS,\n OBSERVATION_METHODS,\n STATE_METHODS,\n STEERING_METHODS,\n SESSION_METHODS,\n AUTH_METHODS,\n NOTIFICATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type AgentId,\n type ScopeId,\n type SubscriptionId,\n type Address,\n type Agent,\n type Scope,\n type Message,\n type MessageMeta,\n type SubscriptionFilter,\n type EventNotificationParams,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type SessionListResponseResult,\n type SessionLoadResponseResult,\n type SessionCloseResponseResult,\n type AgentsListRequestParams,\n type AgentsListResponseResult,\n type AgentsGetResponseResult,\n type AgentsGetRequestParams,\n type SendRequestParams,\n type SendResponseResult,\n type SubscribeRequestParams,\n type SubscribeResponseResult,\n type UnsubscribeResponseResult,\n type StructureGraphRequestParams,\n type StructureGraphResponseResult,\n type ScopesListRequestParams,\n type ScopesListResponseResult,\n type ScopesGetResponseResult,\n type ScopesMembersRequestParams,\n type ScopesMembersResponseResult,\n type InjectRequestParams,\n type InjectResponseResult,\n type ReplayRequestParams,\n type ReplayResponseResult,\n type ReplayedEvent,\n type SubscriptionAckParams,\n type AuthenticateRequestParams,\n type AuthenticateResponseResult,\n type AuthPrincipal,\n} from '../types';\n\n/**\n * Options for automatic reconnection\n */\nexport interface ReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n /** Restore subscriptions after reconnect (default: true) */\n restoreSubscriptions?: boolean;\n /** Replay missed events on restore (default: true) */\n replayOnRestore?: boolean;\n /** Maximum events to replay per subscription (default: 1000) */\n maxReplayEventsPerSubscription?: number;\n}\n\n/**\n * State tracked for subscription restoration\n */\ninterface SubscriptionState {\n filter?: SubscriptionFilter;\n lastEventId?: string;\n handlers: Set<EventHandler>;\n}\n\n/**\n * Reconnection event types\n */\nexport type ReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed'\n | 'subscriptionRestored'\n | 'subscriptionRestoreFailed';\n\n/**\n * Handler for reconnection events\n */\nexport type ReconnectionEventHandler = (event: {\n type: ReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n subscriptionId?: SubscriptionId;\n newSubscriptionId?: SubscriptionId;\n}) => void;\n\n/**\n * Options for client connection\n */\nexport interface ClientConnectionOptions extends BaseConnectionOptions {\n /** Client name for identification */\n name?: string;\n /** Client capabilities */\n capabilities?: ParticipantCapabilities;\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: ReconnectionOptions;\n}\n\n/**\n * Options for ClientConnection.connect() static method\n */\nexport interface ClientConnectOptions {\n /** Client name for identification */\n name?: string;\n /** Client capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `ReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | ReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n}\n\n/**\n * Options for ClientConnection.connectMesh() static method\n */\nexport interface MeshConnectOptions {\n /** The agentic-mesh transport adapter (Nebula, Tailscale, etc.) */\n transport: MeshTransportAdapter;\n /** Remote peer to connect to */\n peer: MeshPeerEndpoint;\n /** Local peer ID for identification */\n localPeerId: string;\n /** Client name for identification */\n name?: string;\n /** Client capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `ReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | ReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n timeout?: number;\n}\n\n/**\n * Client connection to a MAP system.\n *\n * Provides methods for:\n * - Querying agents and structure\n * - Subscribing to events\n * - Sending messages to agents\n * - (With permissions) Steering agents\n *\n * ## Response Shape Patterns\n *\n * Methods follow consistent response shape conventions:\n *\n * **Create Operations** return the full entity that was created:\n * - `registerAgent()` → `{ agent: Agent }`\n * - `createScope()` → `{ scope: Scope }`\n * - `subscribe()` → `Subscription` (full subscription object)\n *\n * **Query Operations** return the requested data:\n * - `listAgents()` → `{ agents: Agent[] }`\n * - `getAgent()` → `{ agent: Agent, children?: Agent[] }`\n * - `getScope()` → `Scope`\n * - `listScopes()` → `{ scopes: Scope[] }`\n *\n * **Action Operations** return confirmation with reference ID:\n * - `send()` → `{ messageId: string }`\n * - `inject()` → `{ accepted: boolean }`\n *\n * **Lifecycle Operations** return status:\n * - `connect()` → `ConnectResponseResult` (session info, capabilities, auth status)\n * - `disconnect()` → `string | undefined` (resume token)\n * - `authenticate()` → `{ success: boolean, principal?: AuthPrincipal }`\n */\nexport class ClientConnection {\n #connection: BaseConnection;\n readonly #subscriptions: Map<SubscriptionId, Subscription> = new Map();\n readonly #subscriptionStates: Map<SubscriptionId, SubscriptionState> = new Map();\n readonly #reconnectionHandlers: Set<ReconnectionEventHandler> = new Set();\n readonly #acpStreams: Map<string, ACPStreamConnection> = new Map();\n readonly #options: ClientConnectionOptions;\n\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #connected = false;\n #lastConnectOptions?: {\n sessionId?: SessionId;\n resumeToken?: string;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; credential?: string };\n };\n #isReconnecting = false;\n #lastResumeToken?: string;\n #onTokenExpiring?: (expiresAt: number) => Promise<{ method: string; credential: string } | void>;\n\n constructor(stream: Stream, options: ClientConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Set up notification handler for events\n this.#connection.setNotificationHandler(this.#handleNotification.bind(this));\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Static Factory Methods\n // ===========================================================================\n\n /**\n * Connect to a MAP server via WebSocket URL.\n *\n * Handles:\n * - WebSocket creation and connection\n * - Stream wrapping\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n *\n * @param url - WebSocket URL (ws:// or wss://)\n * @param options - Connection options\n * @returns Connected ClientConnection instance\n *\n * @example\n * ```typescript\n * const client = await ClientConnection.connect('ws://localhost:8080', {\n * name: 'MyClient',\n * reconnection: true\n * });\n *\n * // Already connected, ready to use\n * const agents = await client.listAgents();\n * ```\n */\n static async connect(\n url: string,\n options?: ClientConnectOptions\n ): Promise<ClientConnection> {\n // Validate URL\n const parsedUrl = new URL(url);\n if (!['ws:', 'wss:'].includes(parsedUrl.protocol)) {\n throw new Error(\n `Unsupported protocol: ${parsedUrl.protocol}. Use ws: or wss:`\n );\n }\n\n const timeout = options?.connectTimeout ?? 10000;\n\n // Create and connect WebSocket\n const ws = new WebSocket(url);\n await waitForOpen(ws, timeout);\n const stream = websocketStream(ws);\n\n // Configure createStream for reconnection\n const createStream = async () => {\n const newWs = new WebSocket(url);\n await waitForOpen(newWs, timeout);\n return websocketStream(newWs);\n };\n\n // Normalize reconnection option\n const reconnection =\n options?.reconnection === true\n ? { enabled: true }\n : typeof options?.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const client = new ClientConnection(stream, {\n name: options?.name,\n capabilities: options?.capabilities,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake\n await client.connect({ auth: options?.auth });\n\n return client;\n }\n\n /**\n * Connect to a MAP server via agentic-mesh transport.\n *\n * Handles:\n * - Dynamic import of agentic-mesh (optional peer dependency)\n * - Stream creation over encrypted mesh tunnel\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param options - Mesh connection options\n * @returns Connected ClientConnection instance\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n *\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * const client = await ClientConnection.connectMesh({\n * transport,\n * peer: { peerId: 'server', address: '10.0.0.1', port: 4242 },\n * localPeerId: 'my-client',\n * name: 'MeshClient',\n * reconnection: true\n * });\n *\n * const agents = await client.listAgents();\n * ```\n */\n static async connectMesh(options: MeshConnectOptions): Promise<ClientConnection> {\n // Dynamic import for optional peer dependency\n const { agenticMeshStream } = await import('../stream/agentic-mesh');\n\n const streamConfig: AgenticMeshStreamConfig = {\n transport: options.transport,\n peer: options.peer,\n localPeerId: options.localPeerId,\n timeout: options.timeout,\n };\n\n // Create initial stream\n const stream = await agenticMeshStream(streamConfig);\n\n // Configure createStream for reconnection\n const createStream = async () => agenticMeshStream(streamConfig);\n\n // Normalize reconnection option\n const reconnection =\n options.reconnection === true\n ? { enabled: true }\n : typeof options.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const client = new ClientConnection(stream, {\n name: options.name,\n capabilities: options.capabilities,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake\n await client.connect({ auth: options.auth });\n\n return client;\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the MAP system\n *\n * @param options - Connection options\n * @param options.sessionId - Specific session ID to use\n * @param options.resumeToken - Token to resume a previously disconnected session\n * @param options.auth - Authentication credentials\n * @param options.onTokenExpiring - Callback invoked before token expires for proactive refresh\n */\n async connect(options?: {\n sessionId?: SessionId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n /** Authentication credentials */\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; credential?: string };\n /** Callback invoked when token is about to expire. Return new credentials to refresh. */\n onTokenExpiring?: (expiresAt: number) => Promise<{ method: string; credential: string } | void>;\n }): Promise<ConnectResponseResult> {\n const params: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'client',\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n sessionId: options?.sessionId,\n resumeToken: options?.resumeToken,\n auth: options?.auth,\n };\n\n const result = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, params);\n\n this.#sessionId = result.sessionId;\n this.#serverCapabilities = result.capabilities;\n this.#connected = true;\n\n // Store resume token if provided in response\n if (result.resumeToken) {\n this.#lastResumeToken = result.resumeToken;\n }\n\n // Store token expiring callback\n if (options?.onTokenExpiring) {\n this.#onTokenExpiring = options.onTokenExpiring;\n this.#setupTokenExpiryMonitoring(result);\n }\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n return result;\n }\n\n /**\n * Get the resume token for this session.\n * Can be used to reconnect and restore session state after disconnection.\n *\n * @returns The resume token, or undefined if not available\n */\n getResumeToken(): string | undefined {\n return this.#lastResumeToken;\n }\n\n /**\n * Reconnect to the server, optionally using a resume token to restore session.\n *\n * @param resumeToken - Token to resume previous session. If not provided, uses the last known token.\n * @returns Connect response result\n *\n * @example\n * ```typescript\n * // Save token before disconnect\n * const token = await client.disconnect();\n *\n * // Later, reconnect with the token\n * const result = await client.reconnect(token);\n * console.log('Reconnected:', result.reconnected);\n * ```\n */\n async reconnect(resumeToken?: string): Promise<ConnectResponseResult> {\n const tokenToUse = resumeToken ?? this.#lastResumeToken;\n\n return this.connect({\n ...this.#lastConnectOptions,\n resumeToken: tokenToUse,\n });\n }\n\n /**\n * Set up monitoring for token expiration\n */\n #setupTokenExpiryMonitoring(connectResult: ConnectResponseResult): void {\n const principal = connectResult.principal;\n if (!principal?.expiresAt || !this.#onTokenExpiring) {\n return;\n }\n\n const expiresAt = principal.expiresAt;\n const now = Date.now();\n\n // Trigger callback 60 seconds before expiration\n const warningTime = expiresAt - 60000;\n const delay = warningTime - now;\n\n if (delay > 0) {\n setTimeout(async () => {\n if (!this.#connected || !this.#onTokenExpiring) return;\n\n try {\n const newCredentials = await this.#onTokenExpiring(expiresAt);\n if (newCredentials) {\n const refreshResult = await this.refreshAuth({\n method: newCredentials.method as 'bearer' | 'api-key' | 'mtls' | 'none',\n credential: newCredentials.credential,\n });\n\n // If refresh succeeded and we got a new expiry, set up monitoring again\n if (refreshResult.success && refreshResult.principal?.expiresAt) {\n this.#setupTokenExpiryMonitoring({\n ...connectResult,\n principal: refreshResult.principal\n } as ConnectResponseResult);\n }\n }\n } catch {\n // Token refresh failed - let the connection handle expiration naturally\n }\n }, delay);\n }\n }\n\n /**\n * Authenticate with the server after connection.\n *\n * Use this when the server returns `authRequired` in the connect response,\n * indicating that authentication is needed before accessing protected resources.\n *\n * @param auth - Authentication credentials\n * @returns Authentication result with principal if successful\n *\n * @example\n * ```typescript\n * const connectResult = await client.connect();\n *\n * if (connectResult.authRequired) {\n * const authResult = await client.authenticate({\n * method: 'api-key',\n * credential: process.env.API_KEY,\n * });\n *\n * if (authResult.success) {\n * console.log('Authenticated as:', authResult.principal?.id);\n * }\n * }\n * ```\n */\n async authenticate(auth: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n credential?: string;\n }): Promise<AuthenticateResponseResult> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.credential,\n };\n\n const result = await this.#connection.sendRequest<\n AuthenticateRequestParams,\n AuthenticateResponseResult\n >(AUTH_METHODS.AUTHENTICATE, params);\n\n // Update session info if auth succeeded\n if (result.success && result.sessionId) {\n this.#sessionId = result.sessionId;\n }\n\n return result;\n }\n\n /**\n * Refresh authentication credentials.\n *\n * Use this to update credentials before they expire for long-lived connections.\n *\n * @param auth - New authentication credentials\n * @returns Updated principal information\n */\n async refreshAuth(auth: {\n method: \"bearer\" | \"api-key\" | \"mtls\" | \"none\";\n credential?: string;\n }): Promise<{\n success: boolean;\n principal?: AuthPrincipal;\n error?: { code: string; message: string };\n }> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.credential,\n };\n\n return this.#connection.sendRequest(AUTH_METHODS.AUTH_REFRESH, params);\n }\n\n /**\n * Disconnect from the MAP system\n * @param reason - Optional reason for disconnecting\n * @returns Resume token that can be used to resume this session later\n */\n async disconnect(reason?: string): Promise<string | undefined> {\n if (!this.#connected) return undefined;\n\n let resumeToken: string | undefined;\n try {\n const result = await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n resumeToken = result.resumeToken;\n\n // Store resume token for potential reconnection\n if (resumeToken) {\n this.#lastResumeToken = resumeToken;\n }\n } finally {\n // Close all ACP streams\n for (const stream of this.#acpStreams.values()) {\n await stream.close();\n }\n this.#acpStreams.clear();\n\n // Close all subscriptions\n for (const subscription of this.#subscriptions.values()) {\n subscription._close();\n }\n this.#subscriptions.clear();\n\n await this.#connection.close();\n this.#connected = false;\n }\n return resumeToken;\n }\n\n /**\n * Whether the client is connected\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Session Management\n // ===========================================================================\n\n /**\n * List available sessions\n */\n async listSessions(): Promise<SessionListResponseResult> {\n return this.#connection.sendRequest(SESSION_METHODS.SESSION_LIST);\n }\n\n /**\n * Load an existing session\n */\n async loadSession(sessionId: SessionId): Promise<SessionLoadResponseResult> {\n return this.#connection.sendRequest(SESSION_METHODS.SESSION_LOAD, { sessionId });\n }\n\n /**\n * Close the current session\n */\n async closeSession(sessionId?: SessionId): Promise<SessionCloseResponseResult> {\n return this.#connection.sendRequest(SESSION_METHODS.SESSION_CLOSE, { sessionId });\n }\n\n // ===========================================================================\n // Agent Queries\n // ===========================================================================\n\n /**\n * List agents with optional filters\n */\n async listAgents(options?: AgentsListRequestParams): Promise<AgentsListResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.AGENTS_LIST, options);\n }\n\n /**\n * Get a single agent by ID\n */\n async getAgent(\n agentId: AgentId,\n options?: { include?: { children?: boolean; descendants?: boolean } }\n ): Promise<AgentsGetResponseResult> {\n const params: AgentsGetRequestParams = { agentId, ...options };\n return this.#connection.sendRequest<AgentsGetRequestParams, AgentsGetResponseResult>(\n OBSERVATION_METHODS.AGENTS_GET,\n params\n );\n }\n\n /**\n * Get the agent structure/hierarchy graph\n */\n async getStructureGraph(\n options?: StructureGraphRequestParams\n ): Promise<StructureGraphResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.STRUCTURE_GRAPH, options);\n }\n\n // ===========================================================================\n // Scope Queries\n // ===========================================================================\n\n /**\n * List scopes\n */\n async listScopes(options?: ScopesListRequestParams): Promise<ScopesListResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.SCOPES_LIST, options);\n }\n\n /**\n * Get a single scope by ID\n */\n async getScope(scopeId: ScopeId): Promise<Scope> {\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId },\n ScopesGetResponseResult\n >(OBSERVATION_METHODS.SCOPES_GET, { scopeId });\n return result.scope;\n }\n\n /**\n * List members of a scope\n */\n async getScopeMembers(\n scopeId: ScopeId,\n options?: Omit<ScopesMembersRequestParams, 'scopeId'>\n ): Promise<ScopesMembersResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.SCOPES_MEMBERS, {\n scopeId,\n ...options,\n });\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send a message to an address\n */\n async send(\n to: Address,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n const params: SendRequestParams = { to };\n if (payload !== undefined) params.payload = payload;\n if (meta) params.meta = meta;\n\n return this.#connection.sendRequest(CORE_METHODS.SEND, params);\n }\n\n /**\n * Send a message to a specific agent\n */\n async sendToAgent(\n agentId: AgentId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: agentId }, payload, meta);\n }\n\n /**\n * Send a message to all agents in a scope\n */\n async sendToScope(\n scopeId: ScopeId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ scope: scopeId }, payload, meta);\n }\n\n /**\n * Send a message to agents with a specific role\n */\n async sendToRole(\n role: string,\n payload?: unknown,\n meta?: MessageMeta,\n withinScope?: ScopeId\n ): Promise<SendResponseResult> {\n return this.send({ role, within: withinScope }, payload, meta);\n }\n\n /**\n * Broadcast a message to all agents\n */\n async broadcast(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ broadcast: true }, payload, meta);\n }\n\n /**\n * Send a request and wait for a correlated response\n *\n * This is a higher-level pattern for request/response messaging.\n * A correlationId is automatically generated.\n */\n async request<T = unknown>(\n to: Address,\n payload?: unknown,\n options?: { timeout?: number; meta?: MessageMeta }\n ): Promise<Message<T>> {\n const correlationId = `req-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Subscribe to responses with this correlation ID\n const responseSub = await this.subscribe({\n // We'll filter in the handler since subscription filters don't support correlationId\n });\n\n try {\n // Send the request\n await this.send(to, payload, {\n ...options?.meta,\n expectsResponse: true,\n correlationId,\n });\n\n // Wait for response with matching correlationId\n const timeout = options?.timeout ?? 30000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Request timed out after ${timeout}ms`)), timeout);\n });\n\n const responsePromise = (async () => {\n for await (const event of responseSub) {\n if (\n event.type === 'message_delivered' &&\n event.data &&\n (event.data as { correlationId?: string }).correlationId === correlationId\n ) {\n return (event.data as { message: Message<T> }).message;\n }\n }\n throw new Error('Subscription closed before response received');\n })();\n\n return await Promise.race([responsePromise, timeoutPromise]);\n } finally {\n await responseSub.unsubscribe();\n }\n }\n\n // ===========================================================================\n // ACP Streams\n // ===========================================================================\n\n /**\n * Create a virtual ACP stream connection to an agent.\n *\n * This allows clients to interact with ACP-compatible agents using the\n * familiar ACP interface while routing all messages through MAP.\n *\n * @param options - Stream configuration options\n * @returns ACPStreamConnection instance ready for initialize()\n *\n * @example\n * ```typescript\n * const acp = client.createACPStream({\n * targetAgent: 'coding-agent-1',\n * client: {\n * requestPermission: async (req) => ({\n * outcome: { outcome: 'selected', optionId: 'allow' }\n * }),\n * sessionUpdate: async (update) => {\n * console.log('Agent update:', update);\n * }\n * }\n * });\n *\n * await acp.initialize({\n * protocolVersion: 20241007,\n * clientInfo: { name: 'IDE', version: '1.0' }\n * });\n * const { sessionId } = await acp.newSession({ cwd: '/project', mcpServers: [] });\n * const result = await acp.prompt({\n * sessionId,\n * prompt: [{ type: 'text', text: 'Hello' }]\n * });\n *\n * await acp.close();\n * ```\n */\n createACPStream(options: Omit<ACPStreamOptions, 'mapClient'>): ACPStreamConnection {\n const stream = new ACPStreamConnection(this, options);\n\n // Track the stream\n this.#acpStreams.set(stream.streamId, stream);\n\n // Remove from tracking when closed\n stream.on('close', () => {\n this.#acpStreams.delete(stream.streamId);\n });\n\n return stream;\n }\n\n /**\n * Get an active ACP stream by ID.\n */\n getACPStream(streamId: string): ACPStreamConnection | undefined {\n return this.#acpStreams.get(streamId);\n }\n\n /**\n * Get all active ACP streams.\n */\n get acpStreams(): ReadonlyMap<string, ACPStreamConnection> {\n return this.#acpStreams;\n }\n\n // ===========================================================================\n // Subscriptions\n // ===========================================================================\n\n /**\n * Subscribe to events\n */\n async subscribe(filter?: SubscriptionFilter): Promise<Subscription> {\n const params: SubscribeRequestParams = {};\n if (filter) params.filter = filter;\n\n const result = await this.#connection.sendRequest<\n SubscribeRequestParams,\n SubscribeResponseResult\n >(CORE_METHODS.SUBSCRIBE, params);\n\n // Create sendAck callback if server supports it\n const serverSupportsAck = this.#serverCapabilities?.streaming?.supportsAck === true;\n const sendAck = serverSupportsAck\n ? (ackParams: SubscriptionAckParams) => {\n this.#connection.sendNotification(NOTIFICATION_METHODS.SUBSCRIBE_ACK, ackParams);\n }\n : undefined;\n\n const subscription = createSubscription(\n result.subscriptionId,\n () => this.unsubscribe(result.subscriptionId),\n { filter },\n sendAck\n );\n\n // Set server support flag on the subscription\n if (serverSupportsAck) {\n subscription._setServerSupportsAck(true);\n }\n\n this.#subscriptions.set(result.subscriptionId, subscription);\n\n // Track subscription state for potential restoration\n if (this.#options.reconnection?.restoreSubscriptions !== false) {\n this.#subscriptionStates.set(result.subscriptionId, {\n filter,\n handlers: new Set(),\n });\n\n // Update lastEventId when events are received\n const originalPushEvent = subscription._pushEvent.bind(subscription);\n subscription._pushEvent = (event: EventNotificationParams) => {\n const state = this.#subscriptionStates.get(result.subscriptionId);\n if (state && event.eventId) {\n state.lastEventId = event.eventId;\n }\n originalPushEvent(event);\n };\n }\n\n return subscription;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(subscriptionId: SubscriptionId): Promise<void> {\n const subscription = this.#subscriptions.get(subscriptionId);\n if (subscription) {\n subscription._close();\n this.#subscriptions.delete(subscriptionId);\n }\n\n // Clean up subscription state\n this.#subscriptionStates.delete(subscriptionId);\n\n await this.#connection.sendRequest<\n { subscriptionId: SubscriptionId },\n UnsubscribeResponseResult\n >(CORE_METHODS.UNSUBSCRIBE, { subscriptionId });\n }\n\n // ===========================================================================\n // Event Replay\n // ===========================================================================\n\n /**\n * Replay historical events.\n *\n * Uses keyset pagination - pass the last eventId from the previous\n * response to get the next page.\n *\n * @example\n * ```typescript\n * // Replay all events from the last hour\n * const result = await client.replay({\n * fromTimestamp: Date.now() - 3600000,\n * filter: { eventTypes: ['agent.registered'] },\n * limit: 100\n * });\n *\n * // Paginate through results\n * let afterEventId: string | undefined;\n * do {\n * const page = await client.replay({ afterEventId, limit: 100 });\n * for (const item of page.events) {\n * console.log(item.eventId, item.event);\n * }\n * afterEventId = page.events.at(-1)?.eventId;\n * } while (page.hasMore);\n * ```\n */\n async replay(params: ReplayRequestParams = {}): Promise<ReplayResponseResult> {\n // Validate and cap limit\n const limit = Math.min(params.limit ?? 100, 1000);\n\n return this.#connection.sendRequest<ReplayRequestParams, ReplayResponseResult>(\n CORE_METHODS.REPLAY,\n { ...params, limit }\n );\n }\n\n /**\n * Replay all events matching filter, handling pagination automatically.\n *\n * Returns an async generator for streaming through all results.\n *\n * @example\n * ```typescript\n * for await (const item of client.replayAll({\n * filter: { eventTypes: ['agent.registered'] }\n * })) {\n * console.log(item.eventId, item.event);\n * }\n * ```\n */\n async *replayAll(\n params: Omit<ReplayRequestParams, 'afterEventId'> = {}\n ): AsyncGenerator<ReplayedEvent> {\n let afterEventId: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const result = await this.replay({ ...params, afterEventId });\n\n for (const item of result.events) {\n yield item;\n }\n\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: if no events returned but hasMore is true, break to avoid infinite loop\n if (result.events.length === 0) {\n break;\n }\n }\n }\n\n // ===========================================================================\n // Steering (requires canSteer capability)\n // ===========================================================================\n\n /**\n * Inject context into a running agent\n */\n async inject(\n agentId: AgentId,\n content: unknown,\n delivery?: 'interrupt' | 'queue' | 'best-effort'\n ): Promise<InjectResponseResult> {\n const params: InjectRequestParams = { agentId, content };\n if (delivery) params.delivery = delivery;\n\n return this.#connection.sendRequest(STEERING_METHODS.INJECT, params);\n }\n\n // ===========================================================================\n // Lifecycle Control (requires canStop capability)\n // ===========================================================================\n\n /**\n * Request an agent to stop\n */\n async stopAgent(\n agentId: AgentId,\n options?: { reason?: string; force?: boolean }\n ): Promise<{ stopping: boolean; agent?: Agent }> {\n return this.#connection.sendRequest(STATE_METHODS.AGENTS_STOP, {\n agentId,\n ...options,\n });\n }\n\n /**\n * Suspend an agent\n */\n async suspendAgent(\n agentId: AgentId,\n reason?: string\n ): Promise<{ suspended: boolean; agent?: Agent }> {\n return this.#connection.sendRequest(STATE_METHODS.AGENTS_SUSPEND, {\n agentId,\n reason,\n });\n }\n\n /**\n * Resume a suspended agent\n */\n async resumeAgent(agentId: AgentId): Promise<{ resumed: boolean; agent?: Agent }> {\n return this.#connection.sendRequest(STATE_METHODS.AGENTS_RESUME, { agentId });\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n *\n * @example\n * ```typescript\n * const unsubscribe = client.onReconnection((event) => {\n * switch (event.type) {\n * case 'disconnected':\n * console.log('Connection lost');\n * break;\n * case 'reconnecting':\n * console.log(`Reconnecting, attempt ${event.attempt}`);\n * break;\n * case 'reconnected':\n * console.log('Reconnected successfully');\n * break;\n * case 'reconnectFailed':\n * console.log('Failed to reconnect:', event.error);\n * break;\n * }\n * });\n * ```\n */\n onReconnection(handler: ReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Handle incoming notifications\n */\n async #handleNotification(method: string, params: unknown): Promise<void> {\n switch (method) {\n case NOTIFICATION_METHODS.EVENT: {\n const eventParams = params as EventNotificationParams;\n const subscription = this.#subscriptions.get(eventParams.subscriptionId);\n if (subscription) {\n subscription._pushEvent(eventParams);\n } else {\n console.warn('MAP: Event for unknown subscription:', eventParams.subscriptionId);\n }\n break;\n }\n\n case NOTIFICATION_METHODS.MESSAGE: {\n // Message notifications could be handled here if needed\n // For now, they're delivered through event subscriptions\n break;\n }\n\n default:\n console.warn('MAP: Unknown notification:', method);\n }\n }\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<ReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-authenticate\n const connectResult = await this.connect(this.#lastConnectOptions);\n\n // Update stored values\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Restore subscriptions if enabled\n if (options.restoreSubscriptions !== false) {\n await this.#restoreSubscriptions();\n }\n }\n\n /**\n * Restore subscriptions after reconnection\n */\n async #restoreSubscriptions(): Promise<void> {\n const options = this.#options.reconnection!;\n const subscriptionEntries = Array.from(this.#subscriptionStates.entries());\n\n // Clear old subscription tracking (IDs will change)\n this.#subscriptions.clear();\n this.#subscriptionStates.clear();\n\n for (const [oldId, state] of subscriptionEntries) {\n try {\n // Create new subscription with same filter\n const newSubscription = await this.subscribe(state.filter);\n const newId = newSubscription.id;\n\n // Replay missed events if enabled\n if (options.replayOnRestore !== false && state.lastEventId) {\n const maxEvents = options.maxReplayEventsPerSubscription ?? 1000;\n\n try {\n let replayedCount = 0;\n let afterEventId: string | undefined = state.lastEventId;\n let hasMore = true;\n\n // Paginate through replayed events\n while (hasMore && replayedCount < maxEvents) {\n const result = await this.replay({\n afterEventId,\n filter: state.filter,\n limit: Math.min(100, maxEvents - replayedCount),\n });\n\n for (const replayedEvent of result.events) {\n if (replayedCount >= maxEvents) break;\n\n // Push replayed event to the new subscription\n newSubscription._pushEvent({\n subscriptionId: newId,\n sequenceNumber: replayedCount + 1,\n eventId: replayedEvent.eventId,\n timestamp: replayedEvent.timestamp,\n event: replayedEvent.event,\n });\n\n replayedCount++;\n }\n\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: if no events returned but hasMore is true, break\n if (result.events.length === 0) {\n break;\n }\n }\n } catch (replayError) {\n // Replay is best-effort, log but don't fail restoration\n console.warn('MAP: Failed to replay events for subscription:', oldId, replayError);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'subscriptionRestored',\n subscriptionId: oldId,\n newSubscriptionId: newId,\n });\n } catch (error) {\n this.#emitReconnectionEvent({\n type: 'subscriptionRestoreFailed',\n subscriptionId: oldId,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n }\n}\n","/**\n * Agent connection for MAP protocol\n *\n * Used by agents to connect to a MAP system, receive messages,\n * update state, spawn children, and communicate with peers.\n */\n\nimport { type Stream, websocketStream, waitForOpen } from '../stream';\nimport type {\n AgenticMeshStreamConfig,\n MeshPeerEndpoint,\n MeshTransportAdapter,\n} from '../stream/agentic-mesh';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport { Subscription, createSubscription } from '../subscription';\nimport {\n CORE_METHODS,\n LIFECYCLE_METHODS,\n STATE_METHODS,\n SCOPE_METHODS,\n AUTH_METHODS,\n NOTIFICATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type AgentId,\n type ScopeId,\n type SubscriptionId,\n type Address,\n type Agent,\n type AgentState,\n type AgentVisibility,\n type Scope,\n type Message,\n type MessageMeta,\n type SubscriptionFilter,\n type EventNotificationParams,\n type MessageNotificationParams,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type AgentsRegisterRequestParams,\n type AgentsRegisterResponseResult,\n type AgentsSpawnRequestParams,\n type AgentsSpawnResponseResult,\n type AgentsUpdateResponseResult,\n type AgentsUnregisterResponseResult,\n type SendRequestParams,\n type SendResponseResult,\n type SubscribeRequestParams,\n type SubscribeResponseResult,\n type UnsubscribeResponseResult,\n type ScopesCreateRequestParams,\n type ScopesCreateResponseResult,\n type ScopesJoinResponseResult,\n type ScopesLeaveResponseResult,\n type AuthenticateRequestParams,\n type AuthenticateResponseResult,\n type AuthPrincipal,\n} from '../types';\n\n/**\n * Handler for incoming messages addressed to this agent\n */\nexport type MessageHandler = (message: Message) => void | Promise<void>;\n\n/**\n * Options for automatic reconnection\n */\nexport interface AgentReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n /** Restore scope memberships after reconnect (default: true) */\n restoreScopeMemberships?: boolean;\n}\n\n/**\n * Agent reconnection event types\n */\nexport type AgentReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed';\n\n/**\n * Handler for reconnection events\n */\nexport type AgentReconnectionEventHandler = (event: {\n type: AgentReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n}) => void;\n\n/**\n * Options for agent connection\n */\nexport interface AgentConnectionOptions extends BaseConnectionOptions {\n /** Agent name */\n name?: string;\n /** Agent role */\n role?: string;\n /** Agent capabilities */\n capabilities?: ParticipantCapabilities;\n /** Agent visibility */\n visibility?: AgentVisibility;\n /** Parent agent ID (if this is a child agent) */\n parent?: AgentId;\n /** Initial scopes to join */\n scopes?: ScopeId[];\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: AgentReconnectionOptions;\n}\n\n/**\n * Options for AgentConnection.connect() static method\n */\nexport interface AgentConnectOptions {\n /** Agent name */\n name?: string;\n /** Agent role */\n role?: string;\n /** Agent capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Agent visibility settings */\n visibility?: AgentVisibility;\n /** Parent agent ID (for child agents) */\n parent?: AgentId;\n /** Initial scopes to join */\n scopes?: ScopeId[];\n /** Initial metadata */\n metadata?: Record<string, unknown>;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `AgentReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | AgentReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n}\n\n/**\n * Options for AgentConnection.connectMesh() static method\n */\nexport interface AgentMeshConnectOptions {\n /** The agentic-mesh transport adapter (Nebula, Tailscale, etc.) */\n transport: MeshTransportAdapter;\n /** Remote peer to connect to */\n peer: MeshPeerEndpoint;\n /** Local peer ID for identification */\n localPeerId: string;\n /** Agent name */\n name?: string;\n /** Agent role */\n role?: string;\n /** Agent capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Agent visibility settings */\n visibility?: AgentVisibility;\n /** Parent agent ID (for child agents) */\n parent?: AgentId;\n /** Initial scopes to join */\n scopes?: ScopeId[];\n /** Initial metadata */\n metadata?: Record<string, unknown>;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `AgentReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | AgentReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n timeout?: number;\n}\n\n/**\n * Agent connection to a MAP system.\n *\n * Provides methods for:\n * - Registering self with the system\n * - Receiving and handling messages\n * - Sending messages to other agents\n * - Spawning child agents\n * - Updating own state\n * - Managing scope memberships\n */\nexport class AgentConnection {\n #connection: BaseConnection;\n readonly #subscriptions: Map<SubscriptionId, Subscription> = new Map();\n readonly #options: AgentConnectionOptions;\n readonly #messageHandlers: Set<MessageHandler> = new Set();\n readonly #reconnectionHandlers: Set<AgentReconnectionEventHandler> = new Set();\n readonly #scopeMemberships: Set<ScopeId> = new Set();\n\n #agentId: AgentId | null = null;\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #currentState: AgentState = 'registered';\n #connected = false;\n #lastConnectOptions?: {\n agentId?: AgentId;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n #isReconnecting = false;\n\n constructor(stream: Stream, options: AgentConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Set up notification handler for events and messages\n this.#connection.setNotificationHandler(this.#handleNotification.bind(this));\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Static Factory Methods\n // ===========================================================================\n\n /**\n * Connect and register an agent via WebSocket URL.\n *\n * Handles:\n * - WebSocket creation and connection\n * - Stream wrapping\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n * - Agent registration\n *\n * @param url - WebSocket URL (ws:// or wss://)\n * @param options - Connection and agent options\n * @returns Connected and registered AgentConnection instance\n *\n * @example\n * ```typescript\n * const agent = await AgentConnection.connect('ws://localhost:8080', {\n * name: 'Worker',\n * role: 'processor',\n * reconnection: true\n * });\n *\n * // Already registered, ready to work\n * agent.onMessage(handleMessage);\n * await agent.busy();\n * ```\n */\n static async connect(\n url: string,\n options?: AgentConnectOptions\n ): Promise<AgentConnection> {\n // Validate URL\n const parsedUrl = new URL(url);\n if (!['ws:', 'wss:'].includes(parsedUrl.protocol)) {\n throw new Error(\n `Unsupported protocol: ${parsedUrl.protocol}. Use ws: or wss:`\n );\n }\n\n const timeout = options?.connectTimeout ?? 10000;\n\n // Create and connect WebSocket\n const ws = new WebSocket(url);\n await waitForOpen(ws, timeout);\n const stream = websocketStream(ws);\n\n // Configure createStream for reconnection\n const createStream = async () => {\n const newWs = new WebSocket(url);\n await waitForOpen(newWs, timeout);\n return websocketStream(newWs);\n };\n\n // Normalize reconnection option\n const reconnection =\n options?.reconnection === true\n ? { enabled: true }\n : typeof options?.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const agent = new AgentConnection(stream, {\n name: options?.name,\n role: options?.role,\n capabilities: options?.capabilities,\n visibility: options?.visibility,\n parent: options?.parent,\n scopes: options?.scopes,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake and registration\n await agent.connect({ auth: options?.auth });\n\n return agent;\n }\n\n /**\n * Connect and register an agent via agentic-mesh transport.\n *\n * Handles:\n * - Dynamic import of agentic-mesh (optional peer dependency)\n * - Stream creation over encrypted mesh tunnel\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n * - Agent registration\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param options - Mesh connection and agent options\n * @returns Connected and registered AgentConnection instance\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n *\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * const agent = await AgentConnection.connectMesh({\n * transport,\n * peer: { peerId: 'server', address: '10.0.0.1', port: 4242 },\n * localPeerId: 'my-agent',\n * name: 'MeshWorker',\n * role: 'processor',\n * reconnection: true\n * });\n *\n * agent.onMessage(handleMessage);\n * await agent.busy();\n * ```\n */\n static async connectMesh(options: AgentMeshConnectOptions): Promise<AgentConnection> {\n // Dynamic import for optional peer dependency\n const { agenticMeshStream } = await import('../stream/agentic-mesh');\n\n const streamConfig: AgenticMeshStreamConfig = {\n transport: options.transport,\n peer: options.peer,\n localPeerId: options.localPeerId,\n timeout: options.timeout,\n };\n\n // Create initial stream\n const stream = await agenticMeshStream(streamConfig);\n\n // Configure createStream for reconnection\n const createStream = async () => agenticMeshStream(streamConfig);\n\n // Normalize reconnection option\n const reconnection =\n options.reconnection === true\n ? { enabled: true }\n : typeof options.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const agent = new AgentConnection(stream, {\n name: options.name,\n role: options.role,\n capabilities: options.capabilities,\n visibility: options.visibility,\n parent: options.parent,\n scopes: options.scopes,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake and registration\n await agent.connect({ auth: options.auth });\n\n return agent;\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect and register with the MAP system\n */\n async connect(options?: {\n agentId?: AgentId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n }): Promise<{ connection: ConnectResponseResult; agent: Agent }> {\n // First, establish the connection\n const connectParams: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'agent',\n participantId: options?.agentId,\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n resumeToken: options?.resumeToken,\n auth: options?.auth,\n };\n\n const connectResult = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, connectParams);\n\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n this.#connected = true;\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n // Then register as an agent\n const registerParams: AgentsRegisterRequestParams = {\n agentId: options?.agentId,\n name: this.#options.name,\n role: this.#options.role,\n parent: this.#options.parent,\n scopes: this.#options.scopes,\n visibility: this.#options.visibility,\n capabilities: this.#options.capabilities,\n };\n\n const registerResult = await this.#connection.sendRequest<\n AgentsRegisterRequestParams,\n AgentsRegisterResponseResult\n >(LIFECYCLE_METHODS.AGENTS_REGISTER, registerParams);\n\n this.#agentId = registerResult.agent.id;\n this.#currentState = registerResult.agent.state;\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n return { connection: connectResult, agent: registerResult.agent };\n }\n\n /**\n * Authenticate with the server after connection.\n *\n * Use this when the server returns `authRequired` in the connect response,\n * indicating that authentication is needed before registering or accessing\n * protected resources.\n *\n * @param auth - Authentication credentials\n * @returns Authentication result with principal if successful\n *\n * @example\n * ```typescript\n * const agent = new AgentConnection(stream, { name: 'MyAgent' });\n *\n * // First connect to get auth requirements\n * const connectResult = await agent.connectOnly();\n *\n * if (connectResult.authRequired) {\n * const authResult = await agent.authenticate({\n * method: 'api-key',\n * token: process.env.AGENT_API_KEY,\n * });\n *\n * if (authResult.success) {\n * // Now register the agent\n * await agent.register({ name: 'MyAgent', role: 'worker' });\n * }\n * }\n * ```\n */\n async authenticate(auth: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n }): Promise<AuthenticateResponseResult> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.token,\n };\n\n const result = await this.#connection.sendRequest<\n AuthenticateRequestParams,\n AuthenticateResponseResult\n >(AUTH_METHODS.AUTHENTICATE, params);\n\n // Update session info if auth succeeded\n if (result.success && result.sessionId) {\n this.#sessionId = result.sessionId;\n }\n\n return result;\n }\n\n /**\n * Refresh authentication credentials.\n *\n * Use this to update credentials before they expire for long-lived connections.\n *\n * @param auth - New authentication credentials\n * @returns Updated principal information\n */\n async refreshAuth(auth: {\n method: \"bearer\" | \"api-key\" | \"mtls\" | \"none\";\n token?: string;\n }): Promise<{\n success: boolean;\n principal?: AuthPrincipal;\n error?: { code: string; message: string };\n }> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.token,\n };\n\n return this.#connection.sendRequest(AUTH_METHODS.AUTH_REFRESH, params);\n }\n\n /**\n * Disconnect from the MAP system\n * @param reason - Optional reason for disconnecting\n * @returns Resume token that can be used to resume this session later\n */\n async disconnect(reason?: string): Promise<string | undefined> {\n if (!this.#connected) return undefined;\n\n let resumeToken: string | undefined;\n try {\n // Unregister the agent first\n if (this.#agentId) {\n await this.#connection.sendRequest<\n { agentId: AgentId; reason?: string },\n AgentsUnregisterResponseResult\n >(LIFECYCLE_METHODS.AGENTS_UNREGISTER, {\n agentId: this.#agentId,\n reason,\n });\n }\n\n // Then disconnect\n const result = await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n resumeToken = result.resumeToken;\n } finally {\n // Close all subscriptions\n for (const subscription of this.#subscriptions.values()) {\n subscription._close();\n }\n this.#subscriptions.clear();\n\n await this.#connection.close();\n this.#connected = false;\n }\n return resumeToken;\n }\n\n /**\n * Whether the agent is connected\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * This agent's ID\n */\n get agentId(): AgentId | null {\n return this.#agentId;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * Current agent state\n */\n get state(): AgentState {\n return this.#currentState;\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Message Handling\n // ===========================================================================\n\n /**\n * Register a handler for incoming messages\n */\n onMessage(handler: MessageHandler): this {\n this.#messageHandlers.add(handler);\n return this;\n }\n\n /**\n * Remove a message handler\n */\n offMessage(handler: MessageHandler): this {\n this.#messageHandlers.delete(handler);\n return this;\n }\n\n // ===========================================================================\n // State Management\n // ===========================================================================\n\n /**\n * Update this agent's state\n */\n async updateState(state: AgentState): Promise<Agent> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { agentId: AgentId; state: AgentState },\n AgentsUpdateResponseResult\n >(STATE_METHODS.AGENTS_UPDATE, {\n agentId: this.#agentId,\n state,\n });\n\n this.#currentState = result.agent.state;\n return result.agent;\n }\n\n /**\n * Update this agent's metadata\n */\n async updateMetadata(metadata: Record<string, unknown>): Promise<Agent> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { agentId: AgentId; metadata: Record<string, unknown> },\n AgentsUpdateResponseResult\n >(STATE_METHODS.AGENTS_UPDATE, {\n agentId: this.#agentId,\n metadata,\n });\n\n return result.agent;\n }\n\n /**\n * Mark this agent as busy\n */\n async busy(): Promise<Agent> {\n return this.updateState('busy');\n }\n\n /**\n * Mark this agent as idle\n */\n async idle(): Promise<Agent> {\n return this.updateState('idle');\n }\n\n /**\n * Mark this agent as done/stopped\n */\n async done(result?: { exitCode?: number; exitReason?: string }): Promise<void> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n await this.updateState('stopped');\n\n // Optionally update metadata with result\n if (result) {\n await this.updateMetadata({\n exitCode: result.exitCode,\n exitReason: result.exitReason,\n });\n }\n }\n\n // ===========================================================================\n // Child Agent Management\n // ===========================================================================\n\n /**\n * Spawn a child agent\n */\n async spawn(options: {\n agentId?: AgentId;\n name?: string;\n role?: string;\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n scopes?: ScopeId[];\n initialMessage?: Message;\n metadata?: Record<string, unknown>;\n }): Promise<AgentsSpawnResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const params: AgentsSpawnRequestParams = {\n ...options,\n parent: this.#agentId,\n };\n\n return this.#connection.sendRequest<\n AgentsSpawnRequestParams,\n AgentsSpawnResponseResult\n >(LIFECYCLE_METHODS.AGENTS_SPAWN, params);\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send a message to an address\n */\n async send(\n to: Address,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n const params: SendRequestParams = { to };\n if (payload !== undefined) params.payload = payload;\n if (meta) params.meta = meta;\n\n return this.#connection.sendRequest(CORE_METHODS.SEND, params);\n }\n\n /**\n * Send a message to the parent agent\n */\n async sendToParent(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ parent: true }, payload, {\n ...meta,\n relationship: 'child-to-parent',\n });\n }\n\n /**\n * Send a message to child agents\n */\n async sendToChildren(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ children: true }, payload, {\n ...meta,\n relationship: 'parent-to-child',\n });\n }\n\n /**\n * Send a message to a specific agent\n */\n async sendToAgent(\n agentId: AgentId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: agentId }, payload, meta);\n }\n\n /**\n * Send a message to all agents in a scope\n */\n async sendToScope(\n scopeId: ScopeId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ scope: scopeId }, payload, meta);\n }\n\n /**\n * Send a message to sibling agents\n */\n async sendToSiblings(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ siblings: true }, payload, {\n ...meta,\n relationship: 'peer',\n });\n }\n\n /**\n * Reply to a message (uses correlationId from original)\n */\n async reply(\n originalMessage: Message,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: originalMessage.from as AgentId }, payload, {\n ...meta,\n correlationId: originalMessage.meta?.correlationId ?? originalMessage.id,\n isResult: true,\n });\n }\n\n // ===========================================================================\n // Scope Management\n // ===========================================================================\n\n /**\n * Create a new scope\n */\n async createScope(options: ScopesCreateRequestParams): Promise<Scope> {\n const result = await this.#connection.sendRequest<\n ScopesCreateRequestParams,\n ScopesCreateResponseResult\n >(SCOPE_METHODS.SCOPES_CREATE, options);\n return result.scope;\n }\n\n /**\n * Join a scope\n */\n async joinScope(scopeId: ScopeId): Promise<ScopesJoinResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId; agentId: AgentId },\n ScopesJoinResponseResult\n >(SCOPE_METHODS.SCOPES_JOIN, {\n scopeId,\n agentId: this.#agentId,\n });\n\n // Track scope membership for potential restoration\n this.#scopeMemberships.add(scopeId);\n\n return result;\n }\n\n /**\n * Leave a scope\n */\n async leaveScope(scopeId: ScopeId): Promise<ScopesLeaveResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId; agentId: AgentId },\n ScopesLeaveResponseResult\n >(SCOPE_METHODS.SCOPES_LEAVE, {\n scopeId,\n agentId: this.#agentId,\n });\n\n // Remove from tracked scope memberships\n this.#scopeMemberships.delete(scopeId);\n\n return result;\n }\n\n // ===========================================================================\n // Subscriptions\n // ===========================================================================\n\n /**\n * Subscribe to events\n */\n async subscribe(filter?: SubscriptionFilter): Promise<Subscription> {\n const params: SubscribeRequestParams = {};\n if (filter) params.filter = filter;\n\n const result = await this.#connection.sendRequest<\n SubscribeRequestParams,\n SubscribeResponseResult\n >(CORE_METHODS.SUBSCRIBE, params);\n\n const subscription = createSubscription(\n result.subscriptionId,\n () => this.unsubscribe(result.subscriptionId),\n { filter }\n );\n\n this.#subscriptions.set(result.subscriptionId, subscription);\n\n return subscription;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(subscriptionId: SubscriptionId): Promise<void> {\n const subscription = this.#subscriptions.get(subscriptionId);\n if (subscription) {\n subscription._close();\n this.#subscriptions.delete(subscriptionId);\n }\n\n await this.#connection.sendRequest<\n { subscriptionId: SubscriptionId },\n UnsubscribeResponseResult\n >(CORE_METHODS.UNSUBSCRIBE, { subscriptionId });\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get connectionState(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n */\n onReconnection(handler: AgentReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Handle incoming notifications\n */\n async #handleNotification(method: string, params: unknown): Promise<void> {\n switch (method) {\n case NOTIFICATION_METHODS.EVENT: {\n const eventParams = params as EventNotificationParams;\n const subscription = this.#subscriptions.get(eventParams.subscriptionId);\n if (subscription) {\n subscription._pushEvent(eventParams);\n }\n break;\n }\n\n case NOTIFICATION_METHODS.MESSAGE: {\n const messageParams = params as MessageNotificationParams;\n // Deliver to message handlers\n for (const handler of this.#messageHandlers) {\n try {\n await handler(messageParams.message);\n } catch (error) {\n console.error('MAP: Message handler error:', error);\n }\n }\n break;\n }\n\n default:\n console.warn('MAP: Unknown notification:', method);\n }\n }\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<AgentReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n // Store current scopes for restoration\n const scopesToRestore = Array.from(this.#scopeMemberships);\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-establish connection and registration\n // Use the stored agentId to try to reclaim the same identity\n const result = await this.connect({\n agentId: this.#agentId ?? this.#lastConnectOptions?.agentId,\n auth: this.#lastConnectOptions?.auth,\n });\n\n // Update stored values\n this.#agentId = result.agent.id;\n this.#sessionId = result.connection.sessionId;\n this.#serverCapabilities = result.connection.capabilities;\n this.#currentState = result.agent.state;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Restore scope memberships if enabled\n if (options.restoreScopeMemberships !== false) {\n await this.#restoreScopeMemberships(scopesToRestore);\n }\n }\n\n /**\n * Restore scope memberships after reconnection\n */\n async #restoreScopeMemberships(scopes: ScopeId[]): Promise<void> {\n // Clear tracked memberships (will be re-added by joinScope)\n this.#scopeMemberships.clear();\n\n for (const scopeId of scopes) {\n try {\n await this.joinScope(scopeId);\n } catch (error) {\n console.warn('MAP: Failed to restore scope membership:', scopeId, error);\n }\n }\n }\n}\n","/**\n * Federation Envelope Utilities\n *\n * Provides functions for creating and processing federation envelopes\n * for routing messages between federated MAP systems.\n */\n\nimport type { FederationEnvelope, FederationRoutingConfig } from '../types';\nimport { ERROR_CODES } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for creating a federation envelope.\n */\nexport interface CreateEnvelopeOptions {\n /** Correlation ID for cross-system tracing */\n correlationId?: string;\n /** Maximum number of hops before rejection */\n maxHops?: number;\n /** Whether to track the full routing path */\n trackPath?: boolean;\n}\n\n/**\n * Result of processing a federation envelope.\n */\nexport type ProcessEnvelopeResult<T> =\n | {\n success: true;\n envelope: FederationEnvelope<T>;\n }\n | {\n success: false;\n errorCode: number;\n errorMessage: string;\n };\n\n// =============================================================================\n// Envelope Creation\n// =============================================================================\n\n/**\n * Create a new federation envelope for outbound messages.\n *\n * @param payload - The payload to wrap (typically a Message)\n * @param sourceSystem - ID of the originating system\n * @param targetSystem - ID of the destination system\n * @param options - Optional envelope options\n * @returns A new federation envelope\n *\n * @example\n * ```typescript\n * const envelope = createFederationEnvelope(\n * message,\n * 'system-alpha',\n * 'system-beta',\n * { trackPath: true, correlationId: 'req-123' }\n * );\n * ```\n */\nexport function createFederationEnvelope<T>(\n payload: T,\n sourceSystem: string,\n targetSystem: string,\n options?: CreateEnvelopeOptions\n): FederationEnvelope<T> {\n return {\n payload,\n federation: {\n sourceSystem,\n targetSystem,\n hopCount: 0,\n maxHops: options?.maxHops,\n path: options?.trackPath ? [sourceSystem] : undefined,\n originTimestamp: Date.now(),\n correlationId: options?.correlationId,\n },\n };\n}\n\n// =============================================================================\n// Envelope Processing\n// =============================================================================\n\n/**\n * Process an incoming federation envelope for forwarding.\n *\n * Validates the envelope against routing configuration and returns\n * an updated envelope ready for forwarding, or an error if routing\n * should be rejected.\n *\n * Checks performed:\n * 1. Hop count hasn't exceeded maximum\n * 2. No routing loops (if path tracking enabled)\n * 3. Source system is in allowed sources (if configured)\n * 4. Target system is in allowed targets (if configured)\n *\n * @param envelope - The incoming envelope\n * @param config - Routing configuration for this system\n * @returns Updated envelope or error result\n *\n * @example\n * ```typescript\n * const result = processFederationEnvelope(envelope, {\n * systemId: 'system-gamma',\n * maxHops: 5,\n * trackPath: true,\n * });\n *\n * if (result.success) {\n * forwardToNext(result.envelope);\n * } else {\n * rejectWithError(result.errorCode, result.errorMessage);\n * }\n * ```\n */\nexport function processFederationEnvelope<T>(\n envelope: FederationEnvelope<T>,\n config: FederationRoutingConfig\n): ProcessEnvelopeResult<T> {\n const { federation } = envelope;\n const maxHops = federation.maxHops ?? config.maxHops ?? 10;\n\n // Check hop count\n if (federation.hopCount >= maxHops) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_MAX_HOPS_EXCEEDED,\n errorMessage: `Message exceeded maximum hop count of ${maxHops}`,\n };\n }\n\n // Check for loops (if path tracking enabled)\n if (federation.path?.includes(config.systemId)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_LOOP_DETECTED,\n errorMessage: `Loop detected: message already visited ${config.systemId}`,\n };\n }\n\n // Check source allowlist\n if (config.allowedSources && !config.allowedSources.includes(federation.sourceSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Source system ${federation.sourceSystem} not in allowed sources`,\n };\n }\n\n // Check target allowlist\n if (config.allowedTargets && !config.allowedTargets.includes(federation.targetSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Target system ${federation.targetSystem} not in allowed targets`,\n };\n }\n\n // Update for forwarding\n return {\n success: true,\n envelope: {\n payload: envelope.payload,\n federation: {\n ...federation,\n hopCount: federation.hopCount + 1,\n path: config.trackPath ? [...(federation.path ?? []), config.systemId] : federation.path,\n },\n },\n };\n}\n\n// =============================================================================\n// Envelope Utilities\n// =============================================================================\n\n/**\n * Check if an envelope has reached its final destination.\n *\n * @param envelope - The envelope to check\n * @param currentSystemId - ID of the current system\n * @returns true if this is the target system\n */\nexport function isEnvelopeAtDestination(\n envelope: FederationEnvelope<unknown>,\n currentSystemId: string\n): boolean {\n return envelope.federation.targetSystem === currentSystemId;\n}\n\n/**\n * Extract the payload from a federation envelope.\n *\n * @param envelope - The envelope to unwrap\n * @returns The payload\n */\nexport function unwrapEnvelope<T>(envelope: FederationEnvelope<T>): T {\n return envelope.payload;\n}\n\n/**\n * Get routing metadata for logging/debugging.\n *\n * @param envelope - The envelope to inspect\n * @returns Routing information\n */\nexport function getEnvelopeRoutingInfo(envelope: FederationEnvelope<unknown>): {\n source: string;\n target: string;\n hops: number;\n path?: string[];\n age: number;\n correlationId?: string;\n} {\n const { federation } = envelope;\n return {\n source: federation.sourceSystem,\n target: federation.targetSystem,\n hops: federation.hopCount,\n path: federation.path,\n age: Date.now() - federation.originTimestamp,\n correlationId: federation.correlationId,\n };\n}\n\n/**\n * Validate that an object is a valid federation envelope.\n *\n * @param obj - Object to validate\n * @returns true if valid envelope structure\n */\nexport function isValidEnvelope(obj: unknown): obj is FederationEnvelope<unknown> {\n if (!obj || typeof obj !== 'object') return false;\n\n const envelope = obj as Record<string, unknown>;\n if (!('payload' in envelope) || !('federation' in envelope)) return false;\n\n const federation = envelope.federation as Record<string, unknown>;\n if (!federation || typeof federation !== 'object') return false;\n\n return (\n typeof federation.sourceSystem === 'string' &&\n typeof federation.targetSystem === 'string' &&\n typeof federation.hopCount === 'number' &&\n typeof federation.originTimestamp === 'number'\n );\n}\n\n/**\n * Create an updated envelope with a new payload (for transformations).\n *\n * @param envelope - Original envelope\n * @param newPayload - New payload\n * @returns New envelope with same metadata but new payload\n */\nexport function withPayload<T, U>(\n envelope: FederationEnvelope<T>,\n newPayload: U\n): FederationEnvelope<U> {\n return {\n payload: newPayload,\n federation: envelope.federation,\n };\n}\n","/**\n * Federation Outage Buffer\n *\n * Buffers outbound messages during federation outages for later delivery\n * when the peer reconnects.\n */\n\nimport type {\n FederationEnvelope,\n FederationBufferConfig,\n Message,\n Timestamp,\n} from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * A buffered message with metadata.\n */\ninterface BufferedMessage {\n envelope: FederationEnvelope<Message>;\n enqueuedAt: Timestamp;\n size: number;\n}\n\n/**\n * Per-peer buffer state.\n */\ninterface PeerBuffer {\n messages: BufferedMessage[];\n totalEnqueued: number;\n totalDropped: number;\n totalBytes: number;\n}\n\n/**\n * Buffer statistics for a peer.\n */\nexport interface PeerBufferStats {\n /** Number of messages currently buffered */\n count: number;\n /** Age of oldest message in milliseconds */\n oldestAge: number;\n /** Total messages ever enqueued */\n totalEnqueued: number;\n /** Total messages dropped due to overflow/expiry */\n totalDropped: number;\n /** Current buffer size in bytes */\n totalBytes: number;\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nconst DEFAULT_CONFIG: Required<FederationBufferConfig> = {\n enabled: true,\n maxMessages: 1000,\n maxBytes: 10 * 1024 * 1024, // 10MB\n retentionMs: 60 * 60 * 1000, // 1 hour\n overflowStrategy: 'drop-oldest',\n};\n\n// =============================================================================\n// Buffer Implementation\n// =============================================================================\n\n/**\n * Buffer for storing outbound messages during federation outages.\n *\n * Messages are stored per-peer and drained on reconnection.\n * Supports configurable size limits, retention, and overflow strategies.\n *\n * @example\n * ```typescript\n * const buffer = new FederationOutageBuffer({\n * maxMessages: 500,\n * retentionMs: 30000,\n * overflowStrategy: 'drop-oldest',\n * });\n *\n * // Buffer messages during outage\n * buffer.enqueue('peer-1', envelope);\n *\n * // On reconnect, drain and send\n * const messages = buffer.drain('peer-1');\n * for (const msg of messages) {\n * await send(msg);\n * }\n * ```\n */\nexport class FederationOutageBuffer {\n readonly #config: Required<FederationBufferConfig>;\n readonly #buffers: Map<string, PeerBuffer> = new Map();\n\n constructor(config?: FederationBufferConfig) {\n this.#config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Whether buffering is enabled.\n */\n get enabled(): boolean {\n return this.#config.enabled;\n }\n\n /**\n * Get the configuration.\n */\n get config(): Readonly<Required<FederationBufferConfig>> {\n return this.#config;\n }\n\n /**\n * Enqueue a message for a peer.\n *\n * @param peerId - Target peer system ID\n * @param envelope - Message envelope to buffer\n * @returns true if message was buffered, false if rejected\n */\n enqueue(peerId: string, envelope: FederationEnvelope<Message>): boolean {\n if (!this.#config.enabled) return false;\n\n let buffer = this.#buffers.get(peerId);\n if (!buffer) {\n buffer = { messages: [], totalEnqueued: 0, totalDropped: 0, totalBytes: 0 };\n this.#buffers.set(peerId, buffer);\n }\n\n // Evict expired messages first\n this.#evictExpired(buffer);\n\n // Estimate message size\n const messageSize = this.#estimateSize(envelope);\n\n // Check byte limit\n while (buffer.totalBytes + messageSize > this.#config.maxBytes && buffer.messages.length > 0) {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n }\n\n // Check message count limit\n if (buffer.messages.length >= this.#config.maxMessages) {\n switch (this.#config.overflowStrategy) {\n case 'drop-oldest': {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n break;\n }\n case 'drop-newest':\n buffer.totalDropped++;\n return false;\n case 'reject':\n return false;\n }\n }\n\n buffer.messages.push({\n envelope,\n enqueuedAt: Date.now(),\n size: messageSize,\n });\n buffer.totalEnqueued++;\n buffer.totalBytes += messageSize;\n\n return true;\n }\n\n /**\n * Drain all buffered messages for a peer.\n *\n * Returns messages in FIFO order and clears the buffer.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes\n */\n drain(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired before draining\n this.#evictExpired(buffer);\n\n const messages = buffer.messages.map((m) => m.envelope);\n buffer.messages = [];\n buffer.totalBytes = 0;\n\n return messages;\n }\n\n /**\n * Peek at buffered messages without removing them.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes (still in buffer)\n */\n peek(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired\n this.#evictExpired(buffer);\n\n return buffer.messages.map((m) => m.envelope);\n }\n\n /**\n * Get statistics for all peer buffers.\n *\n * @returns Map of peer ID to buffer stats\n */\n stats(): Map<string, PeerBufferStats> {\n const result = new Map<string, PeerBufferStats>();\n const now = Date.now();\n\n for (const [peerId, buffer] of this.#buffers) {\n // Evict expired for accurate stats\n this.#evictExpired(buffer);\n\n const oldestAge =\n buffer.messages.length > 0 ? now - buffer.messages[0].enqueuedAt : 0;\n\n result.set(peerId, {\n count: buffer.messages.length,\n oldestAge,\n totalEnqueued: buffer.totalEnqueued,\n totalDropped: buffer.totalDropped,\n totalBytes: buffer.totalBytes,\n });\n }\n\n return result;\n }\n\n /**\n * Get count for a specific peer.\n *\n * @param peerId - Target peer system ID\n * @returns Number of buffered messages\n */\n count(peerId: string): number {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return 0;\n\n this.#evictExpired(buffer);\n return buffer.messages.length;\n }\n\n /**\n * Check if buffer has messages for a peer.\n *\n * @param peerId - Target peer system ID\n * @returns true if there are buffered messages\n */\n has(peerId: string): boolean {\n return this.count(peerId) > 0;\n }\n\n /**\n * Clear buffer for a specific peer.\n *\n * @param peerId - Target peer system ID\n */\n clear(peerId: string): void {\n this.#buffers.delete(peerId);\n }\n\n /**\n * Clear all buffers.\n */\n clearAll(): void {\n this.#buffers.clear();\n }\n\n /**\n * Get list of peers with buffered messages.\n *\n * @returns Array of peer IDs\n */\n peers(): string[] {\n const result: string[] = [];\n for (const [peerId, buffer] of this.#buffers) {\n this.#evictExpired(buffer);\n if (buffer.messages.length > 0) {\n result.push(peerId);\n }\n }\n return result;\n }\n\n /**\n * Evict expired messages from a buffer.\n */\n #evictExpired(buffer: PeerBuffer): void {\n const cutoff = Date.now() - this.#config.retentionMs;\n let removed = 0;\n let bytesRemoved = 0;\n\n while (buffer.messages.length > 0 && buffer.messages[0].enqueuedAt < cutoff) {\n const msg = buffer.messages.shift()!;\n bytesRemoved += msg.size;\n removed++;\n }\n\n buffer.totalDropped += removed;\n buffer.totalBytes -= bytesRemoved;\n }\n\n /**\n * Estimate the size of an envelope in bytes.\n */\n #estimateSize(envelope: FederationEnvelope<Message>): number {\n // Simple estimation using JSON serialization\n try {\n return JSON.stringify(envelope).length * 2; // UTF-16\n } catch {\n return 1024; // Default estimate if serialization fails\n }\n }\n}\n","/**\n * Gateway connection for MAP protocol federation\n *\n * Used by gateways to connect two MAP systems together,\n * routing messages between them.\n */\n\nimport type { Stream } from '../stream';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport {\n CORE_METHODS,\n FEDERATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type Message,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type FederationConnectRequestParams,\n type FederationConnectResponseResult,\n type FederationRouteRequestParams,\n type FederationRouteResponseResult,\n type FederationRoutingConfig,\n type FederationBufferConfig,\n type FederationEnvelope,\n type ReplayRequestParams,\n type ReplayResponseResult,\n type EventType,\n} from '../types';\nimport { createFederationEnvelope } from '../federation/envelope';\nimport { FederationOutageBuffer } from '../federation/buffer';\n\n/**\n * Options for automatic gateway reconnection\n */\nexport interface GatewayReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n}\n\n/**\n * Options for event replay on gateway reconnection\n */\nexport interface GatewayReplayOptions {\n /** Enable replay on reconnection (default: false) */\n enabled: boolean;\n /** Event types to replay (default: all) */\n eventTypes?: EventType[];\n /** Maximum events to replay per peer (default: 1000) */\n maxEvents?: number;\n /** Maximum age of events to replay in ms (default: 1 hour) */\n maxAgeMs?: number;\n}\n\n/**\n * Reconnection event types for gateway\n */\nexport type GatewayReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed'\n | 'bufferOverflow'\n | 'bufferDrained'\n | 'replayStarted'\n | 'replayCompleted';\n\n/**\n * Handler for gateway reconnection events\n */\nexport type GatewayReconnectionEventHandler = (event: {\n type: GatewayReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n peerId?: string;\n messagesBuffered?: number;\n messagesDrained?: number;\n eventsReplayed?: number;\n}) => void;\n\n/**\n * Options for gateway connection\n */\nexport interface GatewayConnectionOptions extends BaseConnectionOptions {\n /** Gateway name */\n name?: string;\n /** Gateway capabilities */\n capabilities?: ParticipantCapabilities;\n /** Federation routing configuration */\n routing?: FederationRoutingConfig;\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: GatewayReconnectionOptions;\n /** Outage buffer configuration */\n buffer?: FederationBufferConfig;\n /** Replay options for reconnection */\n replay?: GatewayReplayOptions;\n}\n\n/**\n * Gateway connection for MAP federation.\n *\n * Provides methods for:\n * - Connecting to peer MAP systems\n * - Routing messages between systems\n * - Automatic reconnection with message buffering\n */\nexport class GatewayConnection {\n #connection: BaseConnection;\n readonly #options: GatewayConnectionOptions;\n readonly #connectedSystems: Map<string, { name?: string; version?: string }> = new Map();\n readonly #reconnectionHandlers: Set<GatewayReconnectionEventHandler> = new Set();\n readonly #outageBuffer: FederationOutageBuffer | null;\n readonly #lastSyncTimestamps: Map<string, number> = new Map();\n\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #connected = false;\n #isReconnecting = false;\n #lastConnectOptions?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n\n constructor(stream: Stream, options: GatewayConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Initialize outage buffer if configured\n this.#outageBuffer = options.buffer?.enabled\n ? new FederationOutageBuffer(options.buffer)\n : null;\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the local MAP system\n */\n async connect(options?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n }): Promise<ConnectResponseResult> {\n const params: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'gateway',\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n auth: options?.auth,\n };\n\n const result = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, params);\n\n this.#sessionId = result.sessionId;\n this.#serverCapabilities = result.capabilities;\n this.#connected = true;\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n return result;\n }\n\n /**\n * Disconnect from the local MAP system\n */\n async disconnect(reason?: string): Promise<void> {\n if (!this.#connected) return;\n\n try {\n await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n } finally {\n await this.#connection.close();\n this.#connected = false;\n }\n }\n\n /**\n * Whether the gateway is connected to the local system\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * List of connected remote systems\n */\n get connectedSystems(): Map<string, { name?: string; version?: string }> {\n return new Map(this.#connectedSystems);\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Federation\n // ===========================================================================\n\n /**\n * Connect to a remote MAP system\n */\n async connectToSystem(\n systemId: string,\n endpoint: string,\n auth?: { method: 'bearer' | 'api-key' | 'mtls'; credentials?: string }\n ): Promise<FederationConnectResponseResult> {\n const params: FederationConnectRequestParams = {\n systemId,\n endpoint,\n auth,\n };\n\n const result = await this.#connection.sendRequest<\n FederationConnectRequestParams,\n FederationConnectResponseResult\n >(FEDERATION_METHODS.FEDERATION_CONNECT, params);\n\n if (result.connected && result.systemInfo) {\n this.#connectedSystems.set(systemId, {\n name: result.systemInfo.name,\n version: result.systemInfo.version,\n });\n }\n\n return result;\n }\n\n /**\n * Route a message to a remote system.\n *\n * If routing config is provided, wraps the message in a federation envelope\n * with proper metadata for multi-hop routing. Otherwise, sends raw message\n * for backwards compatibility.\n *\n * During reconnection, messages are buffered if buffer is configured.\n */\n async routeToSystem(\n systemId: string,\n message: Message\n ): Promise<FederationRouteResponseResult> {\n // Create envelope if routing config available\n let envelope: FederationEnvelope<Message> | undefined;\n if (this.#options.routing) {\n envelope = createFederationEnvelope(\n message,\n this.#options.routing.systemId,\n systemId,\n {\n maxHops: this.#options.routing.maxHops,\n trackPath: this.#options.routing.trackPath,\n }\n );\n }\n\n // If reconnecting and buffer is available, buffer the message\n if (this.#isReconnecting && this.#outageBuffer && envelope) {\n const buffered = this.#outageBuffer.enqueue(systemId, envelope);\n if (!buffered) {\n this.#emitReconnectionEvent({\n type: 'bufferOverflow',\n peerId: systemId,\n messagesBuffered: this.#outageBuffer.count(systemId),\n });\n }\n // Return a \"pending\" response - message will be sent on reconnect\n return { routed: false };\n }\n\n const params: FederationRouteRequestParams = { systemId };\n if (envelope) {\n params.envelope = envelope;\n } else {\n // Legacy: send raw message for backwards compatibility\n params.message = message;\n }\n\n const result = await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n\n // Update sync timestamp on successful route\n if (result.routed) {\n this.#lastSyncTimestamps.set(systemId, Date.now());\n }\n\n return result;\n }\n\n /**\n * Check if a remote system is connected\n */\n isSystemConnected(systemId: string): boolean {\n return this.#connectedSystems.has(systemId);\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Get the outage buffer (for advanced use)\n */\n get outageBuffer(): FederationOutageBuffer | null {\n return this.#outageBuffer;\n }\n\n /**\n * Get last sync timestamp for a peer\n */\n getLastSyncTimestamp(peerId: string): number | undefined {\n return this.#lastSyncTimestamps.get(peerId);\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n */\n onReconnection(handler: GatewayReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<GatewayReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Gateway reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-authenticate\n const connectResult = await this.connect(this.#lastConnectOptions);\n\n // Update stored values\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Drain buffered messages immediately on reconnect\n await this.#drainBufferedMessages();\n\n // Replay missed events from peers\n await this.#replayFromPeers();\n }\n\n /**\n * Drain buffered messages after reconnection\n */\n async #drainBufferedMessages(): Promise<void> {\n if (!this.#outageBuffer) return;\n\n const peers = this.#outageBuffer.peers();\n for (const peerId of peers) {\n const messages = this.#outageBuffer.drain(peerId);\n if (messages.length === 0) continue;\n\n // Send each buffered message\n for (const envelope of messages) {\n try {\n const params: FederationRouteRequestParams = {\n systemId: peerId,\n envelope,\n };\n\n await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n } catch (error) {\n // Log but continue draining - we don't want to lose other messages\n console.warn('MAP: Failed to send buffered message to', peerId, error);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'bufferDrained',\n peerId,\n messagesDrained: messages.length,\n });\n }\n }\n\n /**\n * Replay missed events from peers after reconnection\n */\n async #replayFromPeers(): Promise<void> {\n const replayOptions = this.#options.replay;\n if (!replayOptions?.enabled) return;\n\n // Get peers that have sync timestamps (peers we've communicated with)\n const peersToReplay = Array.from(this.#lastSyncTimestamps.entries());\n if (peersToReplay.length === 0) return;\n\n for (const [peerId, lastSync] of peersToReplay) {\n try {\n await this.#replayFromPeer(peerId, lastSync);\n } catch (error) {\n // Log but continue with other peers\n console.warn('MAP: Failed to replay events from peer', peerId, error);\n }\n }\n }\n\n /**\n * Replay missed events from a single peer\n */\n async #replayFromPeer(peerId: string, lastSyncTimestamp: number): Promise<void> {\n const replayOptions = this.#options.replay!;\n\n // Check max age\n const maxAge = replayOptions.maxAgeMs ?? 60 * 60 * 1000; // 1 hour default\n const cutoff = Date.now() - maxAge;\n if (lastSyncTimestamp < cutoff) {\n // Too old, skip replay for this peer\n return;\n }\n\n this.#emitReconnectionEvent({ type: 'replayStarted', peerId });\n\n let totalReplayed = 0;\n const maxEvents = replayOptions.maxEvents ?? 1000;\n let afterEventId: string | undefined;\n let hasMore = true;\n\n // Paginate through replay results\n while (hasMore && totalReplayed < maxEvents) {\n const params: ReplayRequestParams = {\n limit: Math.min(100, maxEvents - totalReplayed),\n };\n\n // Use eventId for pagination, or timestamp for first request\n if (afterEventId) {\n params.afterEventId = afterEventId;\n } else {\n params.fromTimestamp = lastSyncTimestamp;\n }\n\n // Filter by event types if specified\n if (replayOptions.eventTypes) {\n params.filter = { eventTypes: replayOptions.eventTypes };\n }\n\n const result = await this.#connection.sendRequest<\n ReplayRequestParams,\n ReplayResponseResult\n >(CORE_METHODS.REPLAY, params);\n\n totalReplayed += result.events.length;\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: break if no events returned\n if (result.events.length === 0) {\n break;\n }\n\n // Update sync timestamp to latest replayed event\n const lastEvent = result.events.at(-1);\n if (lastEvent) {\n this.#lastSyncTimestamps.set(peerId, lastEvent.timestamp);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'replayCompleted',\n peerId,\n eventsReplayed: totalReplayed,\n });\n }\n}\n","/**\n * Zod validators for MAP protocol types\n *\n * These validators provide runtime validation for protocol messages.\n * They are generated based on the JSON schema but hand-tuned for proper Zod compatibility.\n */\n\nimport { z } from 'zod';\n\n// ===========================================================================\n// Primitives\n// ===========================================================================\n\nexport const JsonRpcVersionSchema = z.literal('2.0');\nexport const RequestIdSchema = z.union([z.string(), z.number().int()]);\nexport const ProtocolVersionSchema = z.literal(1);\nexport const TimestampSchema = z.number().int();\nexport const MetaSchema = z.record(z.unknown()).optional();\n\n// ===========================================================================\n// Identifiers\n// ===========================================================================\n\nexport const ParticipantIdSchema = z.string();\nexport const AgentIdSchema = z.string();\nexport const ScopeIdSchema = z.string();\nexport const SessionIdSchema = z.string();\nexport const MessageIdSchema = z.string();\nexport const SubscriptionIdSchema = z.string();\nexport const CorrelationIdSchema = z.string();\n\n// ===========================================================================\n// Enums\n// ===========================================================================\n\nexport const ParticipantTypeSchema = z.enum(['agent', 'client', 'system', 'gateway']);\nexport const TransportTypeSchema = z.enum(['websocket', 'stdio', 'inprocess', 'http-sse']);\nexport const ErrorCategorySchema = z.enum([\n 'protocol',\n 'auth',\n 'routing',\n 'agent',\n 'resource',\n 'federation',\n 'internal',\n]);\n\nexport const AgentVisibilitySchema = z.enum(['public', 'parent-only', 'scope', 'system']);\n\n// Agent state: standard states + custom x-* states\nexport const AgentStateSchema = z.union([\n z.enum(['registered', 'idle', 'busy', 'waiting', 'stopping', 'stopped', 'error']),\n z.string().regex(/^x-/),\n]);\n\nexport const MessagePrioritySchema = z.enum(['low', 'normal', 'high', 'urgent']);\nexport const DeliverySemanticsSchema = z.enum(['at-most-once', 'at-least-once', 'exactly-once']);\nexport const MessageRelationshipSchema = z.enum([\n 'peer',\n 'parent-to-child',\n 'child-to-parent',\n 'supervisor-to-supervised',\n 'broadcast',\n]);\n\nexport const EventTypeSchema = z.enum([\n 'agent.registered',\n 'agent.unregistered',\n 'agent.state-changed',\n 'agent.spawned',\n 'scope.created',\n 'scope.deleted',\n 'scope.joined',\n 'scope.left',\n 'message.sent',\n 'message.delivered',\n 'session.started',\n 'session.ended',\n 'system.error',\n 'system.shutdown',\n]);\n\nexport const ScopeJoinPolicySchema = z.enum(['open', 'approval', 'invite']);\nexport const ScopeVisibilitySchema = z.enum(['public', 'private', 'unlisted']);\nexport const MessageVisibilitySchema = z.enum(['members', 'public']);\nexport const ScopeSendPolicySchema = z.enum(['anyone', 'members']);\n\n// ===========================================================================\n// Capabilities\n// ===========================================================================\n\nexport const ParticipantCapabilitiesSchema = z\n .object({\n observation: z\n .object({\n canObserve: z.boolean().optional(),\n canQuery: z.boolean().optional(),\n })\n .strict()\n .optional(),\n messaging: z\n .object({\n canSend: z.boolean().optional(),\n canReceive: z.boolean().optional(),\n canBroadcast: z.boolean().optional(),\n })\n .strict()\n .optional(),\n lifecycle: z\n .object({\n canSpawn: z.boolean().optional(),\n canRegister: z.boolean().optional(),\n canUnregister: z.boolean().optional(),\n canSteer: z.boolean().optional(),\n canStop: z.boolean().optional(),\n })\n .strict()\n .optional(),\n scopes: z\n .object({\n canCreateScopes: z.boolean().optional(),\n canManageScopes: z.boolean().optional(),\n })\n .strict()\n .optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Addresses\n// ===========================================================================\n\nexport const DirectAddressSchema = z.object({ agent: AgentIdSchema }).strict();\nexport const MultiAddressSchema = z.object({ agents: z.array(AgentIdSchema).min(1) }).strict();\nexport const ScopeAddressSchema = z.object({ scope: ScopeIdSchema }).strict();\nexport const RoleAddressSchema = z\n .object({\n role: z.string(),\n scope: ScopeIdSchema.optional(),\n })\n .strict();\nexport const HierarchicalAddressSchema = z\n .object({\n parent: z.literal(true).optional(),\n children: z.literal(true).optional(),\n siblings: z.literal(true).optional(),\n ancestors: z.literal(true).optional(),\n descendants: z.literal(true).optional(),\n })\n .strict();\nexport const BroadcastAddressSchema = z.object({ broadcast: z.literal(true) }).strict();\nexport const SystemAddressSchema = z.object({ system: z.literal(true) }).strict();\nexport const ParticipantAddressSchema = z\n .object({ participant: ParticipantIdSchema })\n .strict();\nexport const FederatedAddressSchema = z\n .object({\n system: z.string(),\n address: z.lazy(() => AddressSchema),\n })\n .strict();\n\nexport const AddressSchema: z.ZodType<unknown> = z.union([\n DirectAddressSchema,\n MultiAddressSchema,\n ScopeAddressSchema,\n RoleAddressSchema,\n HierarchicalAddressSchema,\n BroadcastAddressSchema,\n SystemAddressSchema,\n ParticipantAddressSchema,\n FederatedAddressSchema,\n]);\n\n// ===========================================================================\n// Core Structures\n// ===========================================================================\n\nexport const AgentRelationshipSchema = z\n .object({\n type: z.enum(['peer', 'supervisor', 'supervised', 'collaborator']),\n agentId: AgentIdSchema,\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentLifecycleSchema = z\n .object({\n createdAt: TimestampSchema.optional(),\n startedAt: TimestampSchema.optional(),\n stoppedAt: TimestampSchema.optional(),\n lastActiveAt: TimestampSchema.optional(),\n exitCode: z.number().int().optional(),\n exitReason: z.string().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentSchema = z\n .object({\n id: AgentIdSchema,\n name: z.string().optional(),\n description: z.string().optional(),\n parent: AgentIdSchema.optional(),\n relationships: z.array(AgentRelationshipSchema).optional(),\n state: AgentStateSchema,\n role: z.string().optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n visibility: AgentVisibilitySchema.optional(),\n lifecycle: AgentLifecycleSchema.optional(),\n capabilities: ParticipantCapabilitiesSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const ScopeSchema = z\n .object({\n id: ScopeIdSchema,\n name: z.string().optional(),\n parent: ScopeIdSchema.optional(),\n children: z.array(ScopeIdSchema).optional(),\n joinPolicy: ScopeJoinPolicySchema.optional(),\n visibility: ScopeVisibilitySchema.optional(),\n messageVisibility: MessageVisibilitySchema.optional(),\n sendPolicy: ScopeSendPolicySchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageMetaSchema = z\n .object({\n correlationId: CorrelationIdSchema.optional(),\n causationId: MessageIdSchema.optional(),\n traceId: z.string().optional(),\n spanId: z.string().optional(),\n priority: MessagePrioritySchema.optional(),\n delivery: DeliverySemanticsSchema.optional(),\n relationship: MessageRelationshipSchema.optional(),\n expiresAt: TimestampSchema.optional(),\n isResult: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageSchema = z\n .object({\n id: MessageIdSchema,\n from: ParticipantIdSchema,\n to: AddressSchema,\n timestamp: TimestampSchema,\n payload: z.unknown().optional(),\n meta: MessageMetaSchema.optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const EventSchema = z\n .object({\n type: EventTypeSchema,\n timestamp: TimestampSchema,\n data: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const SubscriptionFilterSchema = z\n .object({\n eventTypes: z.array(EventTypeSchema).optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n fromAgents: z.array(AgentIdSchema).optional(),\n includeChildren: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Error\n// ===========================================================================\n\nexport const MAPErrorDataSchema = z\n .object({\n category: ErrorCategorySchema.optional(),\n retryable: z.boolean().optional(),\n retryAfterMs: z.number().int().optional(),\n details: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .passthrough();\n\nexport const MAPErrorSchema = z\n .object({\n code: z.number().int(),\n message: z.string(),\n data: MAPErrorDataSchema.optional(),\n })\n .strict();\n\n// ===========================================================================\n// JSON-RPC Messages\n// ===========================================================================\n\nexport const MAPRequestSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const MAPResponseSuccessSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n result: z.unknown(),\n })\n .strict();\n\nexport const MAPResponseErrorSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n error: MAPErrorSchema,\n })\n .strict();\n\nexport const MAPResponseSchema = z.union([MAPResponseSuccessSchema, MAPResponseErrorSchema]);\n\nexport const MAPNotificationSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\n// ===========================================================================\n// Inferred Types (for convenience)\n// ===========================================================================\n\nexport type ParticipantIdValidated = z.infer<typeof ParticipantIdSchema>;\nexport type AgentIdValidated = z.infer<typeof AgentIdSchema>;\nexport type ScopeIdValidated = z.infer<typeof ScopeIdSchema>;\nexport type SessionIdValidated = z.infer<typeof SessionIdSchema>;\nexport type MessageIdValidated = z.infer<typeof MessageIdSchema>;\nexport type ParticipantTypeValidated = z.infer<typeof ParticipantTypeSchema>;\nexport type AgentStateValidated = z.infer<typeof AgentStateSchema>;\nexport type AgentValidated = z.infer<typeof AgentSchema>;\nexport type ScopeValidated = z.infer<typeof ScopeSchema>;\nexport type MessageValidated = z.infer<typeof MessageSchema>;\nexport type EventValidated = z.infer<typeof EventSchema>;\nexport type AddressValidated = z.infer<typeof AddressSchema>;\nexport type MAPRequestValidated = z.infer<typeof MAPRequestSchema>;\nexport type MAPResponseValidated = z.infer<typeof MAPResponseSchema>;\nexport type MAPNotificationValidated = z.infer<typeof MAPNotificationSchema>;\nexport type MAPErrorValidated = z.infer<typeof MAPErrorSchema>;\nexport type ParticipantCapabilitiesValidated = z.infer<typeof ParticipantCapabilitiesSchema>;\nexport type SubscriptionFilterValidated = z.infer<typeof SubscriptionFilterSchema>;\n","/**\n * Protocol utilities for MAP SDK\n *\n * Provides:\n * - METHOD_REGISTRY: Single source of truth for all methods with metadata\n * - Response builders: Type-safe response construction\n * - Helper functions for method capability checking\n */\n\nimport type {\n Agent,\n Scope,\n ParticipantCapabilities,\n ConnectResponseResult,\n DisconnectResponseResult,\n SendResponseResult,\n AgentsRegisterResponseResult,\n AgentsUnregisterResponseResult,\n AgentsListResponseResult,\n AgentsGetResponseResult,\n AgentsUpdateResponseResult,\n AgentsSpawnResponseResult,\n ScopesCreateResponseResult,\n ScopesListResponseResult,\n ScopesJoinResponseResult,\n ScopesLeaveResponseResult,\n SubscribeResponseResult,\n UnsubscribeResponseResult,\n SessionInfo,\n SubscriptionId,\n MessageId,\n ParticipantId,\n ProtocolVersion,\n SessionId,\n} from '../types';\n\n// =============================================================================\n// Method Registry\n// =============================================================================\n\n/** Method category for organization */\nexport type MethodCategory =\n | 'core'\n | 'observation'\n | 'lifecycle'\n | 'state'\n | 'steering'\n | 'scope'\n | 'session'\n | 'auth'\n | 'federation'\n | 'notification';\n\n/** Capability path like 'observation.canQuery' */\nexport type CapabilityPath = string;\n\n/** Method metadata */\nexport interface MethodInfo {\n /** The wire method name */\n method: string;\n /** Category for organization */\n category: MethodCategory;\n /** Required capabilities (empty = no special capabilities needed) */\n capabilities: CapabilityPath[];\n /** Human-readable description */\n description: string;\n}\n\n/**\n * Method Registry - Single source of truth for all MAP methods\n *\n * Use this instead of individual method constants for:\n * - Capability checking\n * - Method validation\n * - Documentation generation\n */\nexport const METHOD_REGISTRY: Record<string, MethodInfo> = {\n // Core methods\n 'connect': {\n method: 'map/connect',\n category: 'core',\n capabilities: [],\n description: 'Establish connection to MAP system',\n },\n 'disconnect': {\n method: 'map/disconnect',\n category: 'core',\n capabilities: [],\n description: 'Disconnect from MAP system',\n },\n 'send': {\n method: 'map/send',\n category: 'core',\n capabilities: ['messaging.canSend'],\n description: 'Send a message to an address',\n },\n 'subscribe': {\n method: 'map/subscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Subscribe to event stream',\n },\n 'unsubscribe': {\n method: 'map/unsubscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Unsubscribe from event stream',\n },\n 'replay': {\n method: 'map/replay',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Replay historical events with filtering and pagination',\n },\n\n // Observation methods\n 'agents/list': {\n method: 'map/agents/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List agents with optional filters',\n },\n 'agents/get': {\n method: 'map/agents/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent by ID with optional hierarchy',\n },\n 'scopes/list': {\n method: 'map/scopes/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List all scopes',\n },\n 'scopes/get': {\n method: 'map/scopes/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get scope by ID',\n },\n 'scopes/members': {\n method: 'map/scopes/members',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List scope members',\n },\n 'structure/graph': {\n method: 'map/structure/graph',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent hierarchy graph',\n },\n\n // Lifecycle methods\n 'agents/register': {\n method: 'map/agents/register',\n category: 'lifecycle',\n capabilities: ['lifecycle.canRegister'],\n description: 'Register a new agent',\n },\n 'agents/unregister': {\n method: 'map/agents/unregister',\n category: 'lifecycle',\n capabilities: ['lifecycle.canUnregister'],\n description: 'Unregister an agent',\n },\n 'agents/spawn': {\n method: 'map/agents/spawn',\n category: 'lifecycle',\n capabilities: ['lifecycle.canSpawn'],\n description: 'Spawn a child agent',\n },\n\n // State methods\n 'agents/update': {\n method: 'map/agents/update',\n category: 'state',\n capabilities: ['lifecycle.canRegister'],\n description: 'Update agent state or metadata',\n },\n 'agents/suspend': {\n method: 'map/agents/suspend',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Suspend an agent',\n },\n 'agents/resume': {\n method: 'map/agents/resume',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Resume a suspended agent',\n },\n 'agents/stop': {\n method: 'map/agents/stop',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Stop an agent',\n },\n\n // Steering methods\n 'inject': {\n method: 'map/inject',\n category: 'steering',\n capabilities: ['lifecycle.canSteer'],\n description: 'Inject context into an agent',\n },\n\n // Scope methods\n 'scopes/create': {\n method: 'map/scopes/create',\n category: 'scope',\n capabilities: ['scopes.canCreateScopes'],\n description: 'Create a new scope',\n },\n 'scopes/delete': {\n method: 'map/scopes/delete',\n category: 'scope',\n capabilities: ['scopes.canManageScopes'],\n description: 'Delete a scope',\n },\n 'scopes/join': {\n method: 'map/scopes/join',\n category: 'scope',\n capabilities: [],\n description: 'Join a scope',\n },\n 'scopes/leave': {\n method: 'map/scopes/leave',\n category: 'scope',\n capabilities: [],\n description: 'Leave a scope',\n },\n\n // Session methods\n 'session/list': {\n method: 'map/session/list',\n category: 'session',\n capabilities: [],\n description: 'List sessions',\n },\n 'session/load': {\n method: 'map/session/load',\n category: 'session',\n capabilities: [],\n description: 'Load a session',\n },\n 'session/close': {\n method: 'map/session/close',\n category: 'session',\n capabilities: [],\n description: 'Close a session',\n },\n\n // Auth methods\n 'auth/refresh': {\n method: 'map/auth/refresh',\n category: 'auth',\n capabilities: [],\n description: 'Refresh authentication token',\n },\n\n // Federation methods\n 'federation/connect': {\n method: 'map/federation/connect',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Connect to federated system',\n },\n 'federation/route': {\n method: 'map/federation/route',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Route message to federated system',\n },\n\n // Notification methods (client → server)\n 'subscription/ack': {\n method: 'map/subscribe.ack',\n category: 'notification',\n capabilities: [],\n description: 'Acknowledge received events for backpressure flow control',\n },\n} as const;\n\n/**\n * Get methods by category\n */\nexport function getMethodsByCategory(category: MethodCategory): MethodInfo[] {\n return Object.values(METHOD_REGISTRY).filter((m) => m.category === category);\n}\n\n/**\n * Get required capabilities for a method\n */\nexport function getRequiredCapabilities(methodName: string): CapabilityPath[] {\n // Try direct lookup first\n const info = METHOD_REGISTRY[methodName];\n if (info) return info.capabilities;\n\n // Try finding by wire method name\n const byWire = Object.values(METHOD_REGISTRY).find((m) => m.method === methodName);\n return byWire?.capabilities ?? [];\n}\n\n/**\n * Check if capabilities satisfy method requirements\n */\nexport function hasRequiredCapabilities(\n methodName: string,\n capabilities: ParticipantCapabilities\n): boolean {\n const required = getRequiredCapabilities(methodName);\n if (required.length === 0) return true;\n\n for (const path of required) {\n const [category, capability] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n if (!categoryCapabilities?.[capability]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get method info by wire method name (e.g., 'map/agents/list')\n */\nexport function getMethodInfo(wireMethod: string): MethodInfo | undefined {\n return Object.values(METHOD_REGISTRY).find((m) => m.method === wireMethod);\n}\n\n// =============================================================================\n// Response Builders\n// =============================================================================\n\n/**\n * Build connect response\n */\nexport function buildConnectResponse(params: {\n protocolVersion: ProtocolVersion;\n sessionId: SessionId;\n participantId: ParticipantId;\n capabilities: ParticipantCapabilities;\n systemInfo?: { name?: string; version?: string };\n reconnected?: boolean;\n reclaimedAgents?: Agent[];\n ownedAgents?: string[];\n}): ConnectResponseResult {\n return {\n protocolVersion: params.protocolVersion,\n sessionId: params.sessionId,\n participantId: params.participantId,\n capabilities: params.capabilities,\n systemInfo: params.systemInfo,\n reconnected: params.reconnected,\n reclaimedAgents: params.reclaimedAgents,\n ownedAgents: params.ownedAgents,\n };\n}\n\n/**\n * Build disconnect response\n */\nexport function buildDisconnectResponse(session: SessionInfo): DisconnectResponseResult {\n return { session };\n}\n\n/**\n * Build send response\n */\nexport function buildSendResponse(\n messageId: MessageId,\n delivered: ParticipantId[]\n): SendResponseResult {\n return { messageId, delivered };\n}\n\n/**\n * Build agents/register response\n */\nexport function buildAgentsRegisterResponse(agent: Agent): AgentsRegisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/unregister response\n */\nexport function buildAgentsUnregisterResponse(agent: Agent): AgentsUnregisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/list response\n */\nexport function buildAgentsListResponse(agents: Agent[]): AgentsListResponseResult {\n return { agents };\n}\n\n/**\n * Build agents/get response\n */\nexport function buildAgentsGetResponse(\n agent: Agent,\n children?: Agent[],\n descendants?: Agent[]\n): AgentsGetResponseResult {\n const result: AgentsGetResponseResult = { agent };\n if (children) result.children = children;\n if (descendants) result.descendants = descendants;\n return result;\n}\n\n/**\n * Build agents/update response\n */\nexport function buildAgentsUpdateResponse(agent: Agent): AgentsUpdateResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/spawn response\n */\nexport function buildAgentsSpawnResponse(agent: Agent): AgentsSpawnResponseResult {\n return { agent };\n}\n\n/**\n * Build scopes/create response\n */\nexport function buildScopesCreateResponse(scope: Scope): ScopesCreateResponseResult {\n return { scope };\n}\n\n/**\n * Build scopes/list response\n */\nexport function buildScopesListResponse(scopes: Scope[]): ScopesListResponseResult {\n return { scopes };\n}\n\n/**\n * Build scopes/join response\n */\nexport function buildScopesJoinResponse(scope: Scope, agent: Agent): ScopesJoinResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build scopes/leave response\n */\nexport function buildScopesLeaveResponse(scope: Scope, agent: Agent): ScopesLeaveResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build subscribe response\n */\nexport function buildSubscribeResponse(subscriptionId: SubscriptionId): SubscribeResponseResult {\n return { subscriptionId };\n}\n\n/**\n * Build unsubscribe response\n */\nexport function buildUnsubscribeResponse(\n subscriptionId: SubscriptionId,\n closedAt: number = Date.now()\n): UnsubscribeResponseResult {\n return {\n subscription: {\n id: subscriptionId,\n closedAt,\n },\n };\n}\n","/**\n * Permission utilities for MAP SDK\n *\n * Provides building blocks for implementing the 4-layer permission model:\n * - Layer 1: System configuration (what's exposed at all)\n * - Layer 2: Client permissions (what can this client do)\n * - Layer 3: Scope permissions (what's allowed in this scope)\n * - Layer 4: Agent permissions (what can this agent do)\n *\n * These utilities are opt-in building blocks for router implementations.\n * They provide the logic for permission checks but don't enforce them.\n */\n\nimport type {\n Agent,\n AgentId,\n AgentPermissions,\n AgentPermissionConfig,\n AgentVisibilityRule,\n AgentVisibility,\n AgentAcceptanceRule,\n ClientAcceptanceRule,\n SystemAcceptanceRule,\n Scope,\n ScopeId,\n Event,\n EventType,\n ParticipantCapabilities,\n ParticipantId,\n ParticipantType,\n} from '../types';\nimport { getRequiredCapabilities, hasRequiredCapabilities } from '../protocol';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * System-level exposure configuration.\n * Controls what entities are visible to participants at all.\n */\nexport interface SystemExposure {\n agents?: {\n /** Whether agents are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for agents that are always public */\n publicAgents?: string[];\n /** Glob patterns for agents that are always hidden (takes precedence) */\n hiddenAgents?: string[];\n };\n events?: {\n /** Event types that are exposed (whitelist, if provided) */\n exposedTypes?: EventType[];\n /** Event types that are always hidden (blacklist) */\n hiddenTypes?: EventType[];\n };\n scopes?: {\n /** Whether scopes are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for scopes that are always public */\n publicScopes?: string[];\n /** Glob patterns for scopes that are always hidden (takes precedence) */\n hiddenScopes?: string[];\n };\n}\n\n/**\n * Full system configuration for permissions\n */\nexport interface PermissionSystemConfig {\n /** What entities are exposed to participants */\n exposure?: SystemExposure;\n /** Resource limits */\n limits?: {\n maxConnections?: number;\n maxConnectionsPerClient?: number;\n maxSubscriptionsPerConnection?: number;\n maxAgentsPerClient?: number;\n };\n}\n\n/**\n * Represents a connected participant for permission checks\n */\nexport interface PermissionParticipant {\n /** Participant ID */\n id: string;\n /** Participant type */\n type: ParticipantType;\n /** Granted capabilities */\n capabilities: ParticipantCapabilities;\n}\n\n/**\n * Context for permission checks\n */\nexport interface PermissionContext {\n /** System-wide configuration */\n system: PermissionSystemConfig;\n /** The participant performing the action */\n participant: PermissionParticipant;\n /** Agent IDs owned by this participant */\n ownedAgentIds?: AgentId[];\n /** Scope membership: scopeId -> agent IDs that are members */\n scopeMembership?: Map<ScopeId, AgentId[]>;\n}\n\n/**\n * Action being performed for permission checking\n */\nexport interface PermissionAction {\n /** Action category */\n type: 'query' | 'message' | 'lifecycle' | 'scope' | 'subscribe';\n /** Wire method name (e.g., 'map/agents/list') */\n method: string;\n /** Target of the action */\n target?: {\n agentId?: AgentId;\n scopeId?: ScopeId;\n eventTypes?: EventType[];\n };\n}\n\n/**\n * Result of a permission check\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** Reason for denial (if denied) */\n reason?: string;\n /** Which layer denied the action (if denied) */\n layer?: 1 | 2 | 3 | 4;\n}\n\n// =============================================================================\n// Layer 1: System Exposure Checks\n// =============================================================================\n\n/**\n * Check if an agent is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n * If no configuration, agents are exposed by default.\n *\n * @param exposure - System exposure configuration\n * @param agentId - Agent ID to check\n * @returns true if the agent is exposed\n */\nexport function isAgentExposed(\n exposure: SystemExposure | undefined,\n agentId: AgentId\n): boolean {\n if (!exposure?.agents) return true; // Default: exposed\n\n const {\n publicByDefault = true,\n publicAgents = [],\n hiddenAgents = [],\n } = exposure.agents;\n\n // Hidden takes precedence\n if (matchesPatterns(agentId, hiddenAgents)) return false;\n\n // Check public list\n if (matchesPatterns(agentId, publicAgents)) return true;\n\n return publicByDefault;\n}\n\n/**\n * Check if an event type is exposed by system configuration.\n *\n * Hidden types take precedence. If a whitelist is provided,\n * only those types are exposed.\n *\n * @param exposure - System exposure configuration\n * @param eventType - Event type to check\n * @returns true if the event type is exposed\n */\nexport function isEventTypeExposed(\n exposure: SystemExposure | undefined,\n eventType: EventType\n): boolean {\n if (!exposure?.events) return true;\n\n const { exposedTypes, hiddenTypes = [] } = exposure.events;\n\n // Hidden takes precedence\n if (hiddenTypes.includes(eventType)) return false;\n\n // If whitelist exists, must be in it\n if (exposedTypes && !exposedTypes.includes(eventType)) return false;\n\n return true;\n}\n\n/**\n * Check if a scope is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n *\n * @param exposure - System exposure configuration\n * @param scopeId - Scope ID to check\n * @returns true if the scope is exposed\n */\nexport function isScopeExposed(\n exposure: SystemExposure | undefined,\n scopeId: ScopeId\n): boolean {\n if (!exposure?.scopes) return true;\n\n const {\n publicByDefault = true,\n publicScopes = [],\n hiddenScopes = [],\n } = exposure.scopes;\n\n // Hidden takes precedence\n if (matchesPatterns(scopeId, hiddenScopes)) return false;\n\n // Check public list\n if (matchesPatterns(scopeId, publicScopes)) return true;\n\n return publicByDefault;\n}\n\n// =============================================================================\n// Layer 2: Client/Participant Capability Checks\n// =============================================================================\n\n/**\n * Check if a participant has a specific capability.\n *\n * @param capabilities - Participant's capabilities\n * @param path - Capability path like 'observation.canQuery'\n * @returns true if the capability is granted\n *\n * @example\n * ```typescript\n * if (hasCapability(participant.capabilities, 'lifecycle.canSpawn')) {\n * // Can spawn agents\n * }\n * ```\n */\nexport function hasCapability(\n capabilities: ParticipantCapabilities,\n path: string\n): boolean {\n const [category, cap] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n return categoryCapabilities?.[cap] ?? false;\n}\n\n/**\n * Check if a participant can perform a method based on capabilities.\n *\n * @param method - Wire method name (e.g., 'map/agents/list')\n * @param capabilities - Participant's capabilities\n * @returns true if all required capabilities are present\n */\nexport function canPerformMethod(\n method: string,\n capabilities: ParticipantCapabilities\n): boolean {\n return hasRequiredCapabilities(method, capabilities);\n}\n\n/**\n * Get the capabilities required for a method.\n *\n * @param method - Wire method name or registry key\n * @returns Array of capability paths\n */\nexport { getRequiredCapabilities };\n\n// =============================================================================\n// Layer 3: Scope Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can see the scope\n */\nexport function canSeeScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n const visibility = scope.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can send to the scope\n */\nexport function canSendToScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n // System can always send\n if (participant.type === 'system') return true;\n\n const sendPolicy = scope.sendPolicy ?? 'members';\n\n switch (sendPolicy) {\n case 'any':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can join a scope.\n *\n * @param scope - The scope to check\n * @param participantType - Type of the participant\n * @param agentRole - Role of the agent trying to join (for role-based policies)\n * @returns true if the participant can join the scope\n */\nexport function canJoinScope(\n scope: Scope,\n participantType: ParticipantType,\n agentRole?: string\n): boolean {\n const joinPolicy = scope.joinPolicy ?? 'open';\n\n switch (joinPolicy) {\n case 'open':\n return true;\n case 'invite':\n // Would need invitation tracking - simplified to false\n return false;\n case 'role':\n // Check if agent role matches auto-join roles\n if (!agentRole || !scope.autoJoinRoles) return false;\n return scope.autoJoinRoles.includes(agentRole);\n case 'system':\n return participantType === 'system';\n default:\n return false;\n }\n}\n\n// =============================================================================\n// Layer 4: Agent Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see an agent.\n *\n * @param agent - The agent to check\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can see the agent\n */\nexport function canSeeAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n const visibility = agent.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'parent-only':\n // Can see if we own the parent or the agent itself\n if (ownedAgentIds.includes(agent.id)) return true;\n return agent.parent ? ownedAgentIds.includes(agent.parent) : false;\n case 'scope':\n // Would need scope membership check - simplified to true\n // In practice, would check if participant has agent in same scope\n return true;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to an agent.\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can message the agent\n */\nexport function canMessageAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // Must be able to see the agent first\n if (!canSeeAgent(agent, participant, ownedAgentIds)) {\n return false;\n }\n\n // Additional messaging restrictions could be added here\n // For now, if you can see it, you can message it\n return true;\n}\n\n/**\n * Check if a participant can control an agent (stop, suspend, etc.).\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can control the agent\n */\nexport function canControlAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // System can control any agent\n if (participant.type === 'system') return true;\n\n // Must own the agent or its ancestor\n if (ownedAgentIds.includes(agent.id)) return true;\n\n // Check if we own an ancestor (parent chain)\n // This would need the full agent registry in practice\n // Simplified: just check direct parent\n if (agent.parent && ownedAgentIds.includes(agent.parent)) return true;\n\n return false;\n}\n\n// =============================================================================\n// High-Level Resolution\n// =============================================================================\n\n/**\n * Check if an action is permitted across all 4 layers.\n *\n * This is the main entry point for comprehensive permission checking.\n * It evaluates each layer in order and returns the first denial or success.\n *\n * @param context - Permission context with system config and participant info\n * @param action - The action to check\n * @returns Permission result with allowed status, reason, and layer\n *\n * @example\n * ```typescript\n * const result = canPerformAction(\n * {\n * system: { exposure: { agents: { hiddenAgents: ['internal-*'] } } },\n * participant: { id: 'client-1', type: 'client', capabilities },\n * ownedAgentIds: ['agent-1'],\n * },\n * {\n * type: 'query',\n * method: 'map/agents/get',\n * target: { agentId: 'internal-worker' },\n * }\n * );\n *\n * if (!result.allowed) {\n * console.log(`Denied at layer ${result.layer}: ${result.reason}`);\n * }\n * ```\n */\nexport function canPerformAction(\n context: PermissionContext,\n action: PermissionAction\n): PermissionResult {\n // Layer 1: System exposure\n if (action.target?.agentId) {\n if (!isAgentExposed(context.system.exposure, action.target.agentId)) {\n return {\n allowed: false,\n reason: 'Agent not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.scopeId) {\n if (!isScopeExposed(context.system.exposure, action.target.scopeId)) {\n return {\n allowed: false,\n reason: 'Scope not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.eventTypes) {\n for (const eventType of action.target.eventTypes) {\n if (!isEventTypeExposed(context.system.exposure, eventType)) {\n return {\n allowed: false,\n reason: `Event type '${eventType}' not exposed by system configuration`,\n layer: 1,\n };\n }\n }\n }\n\n // Layer 2: Participant capabilities\n const requiredCaps = getRequiredCapabilities(action.method);\n for (const cap of requiredCaps) {\n if (!hasCapability(context.participant.capabilities, cap)) {\n return {\n allowed: false,\n reason: `Missing required capability: ${cap}`,\n layer: 2,\n };\n }\n }\n\n // Layer 3 and 4 would require actual entity lookups\n // These are handled by the filtering utilities below\n\n return { allowed: true };\n}\n\n// =============================================================================\n// Filtering Utilities\n// =============================================================================\n\n/**\n * Filter agents to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 4 (agent visibility).\n *\n * @param agents - Agents to filter\n * @param context - Permission context\n * @returns Filtered list of visible agents\n */\nexport function filterVisibleAgents(\n agents: Agent[],\n context: PermissionContext\n): Agent[] {\n const ownedAgentIds = context.ownedAgentIds ?? [];\n\n return agents.filter((agent) => {\n // Layer 1: System exposure\n if (!isAgentExposed(context.system.exposure, agent.id)) {\n return false;\n }\n\n // Layer 4: Agent visibility\n if (!canSeeAgent(agent, context.participant, ownedAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter scopes to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 3 (scope visibility).\n *\n * @param scopes - Scopes to filter\n * @param context - Permission context\n * @returns Filtered list of visible scopes\n */\nexport function filterVisibleScopes(\n scopes: Scope[],\n context: PermissionContext\n): Scope[] {\n const scopeMembership = context.scopeMembership ?? new Map();\n\n return scopes.filter((scope) => {\n // Layer 1: System exposure\n if (!isScopeExposed(context.system.exposure, scope.id)) {\n return false;\n }\n\n // Layer 3: Scope visibility\n const memberAgentIds = scopeMembership.get(scope.id) ?? [];\n if (!canSeeScope(scope, context.participant, memberAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter events to only those visible to the participant.\n *\n * Applies Layer 1 (system exposure) for event types.\n *\n * @param events - Events to filter\n * @param context - Permission context\n * @returns Filtered list of visible events\n */\nexport function filterVisibleEvents(\n events: Event[],\n context: PermissionContext\n): Event[] {\n return events.filter((event) => {\n // Layer 1: Event type exposure\n if (!isEventTypeExposed(context.system.exposure, event.type)) {\n return false;\n }\n\n // Additional filtering based on event source could be added here\n // e.g., filter out events from hidden agents\n\n return true;\n });\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Check if a value matches any of the glob patterns.\n *\n * @param value - Value to check\n * @param patterns - Glob patterns (supports * and ? wildcards)\n * @returns true if value matches any pattern\n */\nfunction matchesPatterns(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => matchGlob(value, pattern));\n}\n\n/**\n * Simple glob matching supporting * and ? wildcards.\n *\n * @param value - Value to match\n * @param pattern - Glob pattern\n * @returns true if value matches pattern\n */\nfunction matchGlob(value: string, pattern: string): boolean {\n // Escape special regex characters except * and ?\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(value);\n}\n\n// =============================================================================\n// Agent Permission Resolution (Hybrid Model)\n// =============================================================================\n\n/**\n * Deep clone an object (simple implementation for permission objects)\n */\nfunction deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Deep merge two permission objects.\n * Second object's fields override first at the leaf level.\n *\n * @param base - Base permissions\n * @param override - Override permissions (partial)\n * @returns Merged permissions\n */\nexport function deepMergePermissions(\n base: AgentPermissions,\n override: Partial<AgentPermissions>\n): AgentPermissions {\n const result: AgentPermissions = { ...base };\n\n if (override.canSee) {\n result.canSee = { ...base.canSee, ...override.canSee };\n }\n if (override.canMessage) {\n result.canMessage = { ...base.canMessage, ...override.canMessage };\n }\n if (override.acceptsFrom) {\n result.acceptsFrom = { ...base.acceptsFrom, ...override.acceptsFrom };\n }\n\n return result;\n}\n\n/**\n * Map legacy AgentVisibility to AgentVisibilityRule.\n *\n * @param visibility - Legacy visibility value\n * @returns Equivalent visibility rule\n */\nexport function mapVisibilityToRule(visibility: AgentVisibility): AgentVisibilityRule {\n switch (visibility) {\n case 'public':\n return 'all';\n case 'parent-only':\n return 'hierarchy';\n case 'scope':\n return 'scoped';\n case 'system':\n return 'direct';\n default:\n return 'all';\n }\n}\n\n/**\n * Default agent permission configuration.\n * Used when no configuration is provided.\n */\nexport const DEFAULT_AGENT_PERMISSION_CONFIG: AgentPermissionConfig = {\n defaultPermissions: {\n canSee: {\n agents: 'all',\n scopes: 'all',\n structure: 'full',\n },\n canMessage: {\n agents: 'all',\n scopes: 'all',\n },\n acceptsFrom: {\n agents: 'all',\n clients: 'all',\n systems: 'all',\n },\n },\n rolePermissions: {},\n};\n\n/**\n * Resolve effective permissions for an agent.\n *\n * Resolution order:\n * 1. Start with system default permissions\n * 2. If agent has a role, deep merge role permissions\n * 3. Deep merge agent's permissionOverrides\n * 4. (Backwards compat) Map legacy visibility field if no override\n *\n * @param agent - The agent to resolve permissions for\n * @param config - System permission configuration\n * @returns Resolved effective permissions\n *\n * @example\n * ```typescript\n * const config: AgentPermissionConfig = {\n * defaultPermissions: { canSee: { agents: 'all' } },\n * rolePermissions: {\n * worker: { canSee: { agents: 'hierarchy' } },\n * },\n * };\n *\n * const agent = { id: 'a1', role: 'worker', ownerId: 'c1', state: 'active' };\n * const perms = resolveAgentPermissions(agent, config);\n * // perms.canSee.agents === 'hierarchy'\n * ```\n */\nexport function resolveAgentPermissions(\n agent: Agent,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): AgentPermissions {\n // Start with defaults\n let permissions = deepClone(config.defaultPermissions);\n\n // Apply role permissions\n if (agent.role && config.rolePermissions[agent.role]) {\n permissions = deepMergePermissions(permissions, config.rolePermissions[agent.role]);\n }\n\n // Apply agent overrides\n if (agent.permissionOverrides) {\n permissions = deepMergePermissions(permissions, agent.permissionOverrides);\n }\n\n // Backwards compatibility: map legacy visibility\n if (agent.visibility && !agent.permissionOverrides?.canSee?.agents) {\n permissions.canSee = permissions.canSee ?? {};\n permissions.canSee.agents = mapVisibilityToRule(agent.visibility);\n }\n\n return permissions;\n}\n\n// =============================================================================\n// Agent Acceptance Checks\n// =============================================================================\n\n/**\n * Context for checking if an agent accepts messages from a sender.\n */\nexport interface AcceptanceContext {\n /** Type of the sender */\n senderType: ParticipantType;\n /** Participant ID of the sender */\n senderId: ParticipantId;\n /** If sender is an agent, its agent ID */\n senderAgentId?: AgentId;\n /** If sender is from a federated system, its system ID */\n senderSystemId?: string;\n\n // Hierarchy info for 'hierarchy' rules\n /** Whether sender is the parent of target */\n isParent?: boolean;\n /** Whether sender is a child of target */\n isChild?: boolean;\n /** Whether sender is an ancestor of target */\n isAncestor?: boolean;\n /** Whether sender is a descendant of target */\n isDescendant?: boolean;\n\n // Scope info for 'scoped' rules\n /** Scope IDs that both sender and target are members of */\n sharedScopes?: ScopeId[];\n}\n\n/**\n * Check if an agent acceptance rule allows the sender.\n */\nfunction checkAgentAcceptance(\n rule: AgentAcceptanceRule | undefined,\n context: AcceptanceContext\n): boolean {\n if (!rule || rule === 'all') return true;\n\n if (rule === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (rule === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof rule === 'object' && 'include' in rule) {\n return context.senderAgentId !== undefined && rule.include.includes(context.senderAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if a client acceptance rule allows the sender.\n */\nfunction checkClientAcceptance(\n rule: ClientAcceptanceRule | undefined,\n senderId: ParticipantId\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return rule.include.includes(senderId);\n }\n\n return false;\n}\n\n/**\n * Check if a system acceptance rule allows the sender.\n */\nfunction checkSystemAcceptance(\n rule: SystemAcceptanceRule | undefined,\n senderSystemId: string | undefined\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return senderSystemId !== undefined && rule.include.includes(senderSystemId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent accepts messages from the given sender.\n *\n * Uses the agent's resolved permissions to determine if the sender\n * is allowed based on sender type and acceptance rules.\n *\n * @param targetAgent - The agent that would receive the message\n * @param context - Information about the sender\n * @param config - System permission configuration\n * @returns true if the agent accepts messages from this sender\n *\n * @example\n * ```typescript\n * const accepts = canAgentAcceptMessage(\n * targetAgent,\n * {\n * senderType: 'agent',\n * senderId: 'client-1',\n * senderAgentId: 'agent-2',\n * isParent: true,\n * },\n * config\n * );\n * ```\n */\nexport function canAgentAcceptMessage(\n targetAgent: Agent,\n context: AcceptanceContext,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(targetAgent, config);\n const acceptsFrom = permissions.acceptsFrom;\n\n // No restrictions = accept all\n if (!acceptsFrom) return true;\n\n // Check based on sender type\n switch (context.senderType) {\n case 'agent':\n return checkAgentAcceptance(acceptsFrom.agents, context);\n case 'client':\n return checkClientAcceptance(acceptsFrom.clients, context.senderId);\n case 'system':\n case 'gateway':\n return checkSystemAcceptance(acceptsFrom.systems, context.senderSystemId);\n default:\n return false;\n }\n}\n\n/**\n * Check if an agent can see another agent based on permissions.\n *\n * @param viewerAgent - The agent trying to see\n * @param targetAgentId - ID of the agent being viewed\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if viewer can see target\n */\nexport function canAgentSeeAgent(\n viewerAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(viewerAgent, config);\n const canSee = permissions.canSee?.agents;\n\n if (!canSee || canSee === 'all') return true;\n\n if (canSee === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canSee === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (canSee === 'direct') {\n // Direct means explicit allowlist only\n return false;\n }\n\n if (typeof canSee === 'object' && 'include' in canSee) {\n return canSee.include.includes(targetAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent can message another agent based on permissions.\n *\n * @param senderAgent - The agent sending the message\n * @param targetAgentId - ID of the target agent\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if sender can message target\n */\nexport function canAgentMessageAgent(\n senderAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(senderAgent, config);\n const canMessage = permissions.canMessage?.agents;\n\n if (!canMessage || canMessage === 'all') return true;\n\n if (canMessage === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canMessage === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof canMessage === 'object' && 'include' in canMessage) {\n return canMessage.include.includes(targetAgentId);\n }\n\n return false;\n}\n","/**\n * Address utilities for recipient disambiguation\n *\n * Provides utilities for parsing and formatting message addresses\n * with type prefixes to distinguish between agent and scope recipients.\n *\n * Format: \"{type}:{id}\"\n * - agent:abc123 -> agent recipient\n * - scope:room-1 -> scope recipient\n */\n\n/** Valid address types */\nexport type AddressType = \"agent\" | \"scope\";\n\n/** Parsed address components */\nexport interface AddressComponents {\n type: AddressType;\n id: string;\n}\n\n/** The separator used in address format */\nconst SEPARATOR = \":\";\n\n/** Valid address types for validation */\nconst VALID_ADDRESS_TYPES: readonly AddressType[] = [\"agent\", \"scope\"];\n\n/**\n * Error thrown when an address format is invalid.\n */\nexport class InvalidAddressError extends Error {\n constructor(address: string, reason: string) {\n super(`Invalid address \"${address}\": ${reason}`);\n this.name = \"InvalidAddressError\";\n }\n}\n\n/**\n * Format an address with type prefix.\n *\n * @param type - The address type (agent or scope)\n * @param id - The entity ID\n * @returns Formatted address string\n * @throws InvalidAddressError if parameters are invalid\n *\n * @example\n * formatAddress(\"agent\", \"abc123\") // \"agent:abc123\"\n * formatAddress(\"scope\", \"room-1\") // \"scope:room-1\"\n */\nexport function formatAddress(type: AddressType, id: string): string {\n if (!id) {\n throw new InvalidAddressError(\"\", \"ID cannot be empty\");\n }\n\n if (id.includes(SEPARATOR)) {\n throw new InvalidAddressError(id, \"ID cannot contain colon separator\");\n }\n\n return `${type}${SEPARATOR}${id}`;\n}\n\n/**\n * Parse an address string into its components.\n *\n * @param address - The address string to parse\n * @returns Parsed address components\n * @throws InvalidAddressError if format is invalid\n *\n * @example\n * parseAddress(\"agent:abc123\") // { type: \"agent\", id: \"abc123\" }\n * parseAddress(\"scope:room-1\") // { type: \"scope\", id: \"room-1\" }\n */\nexport function parseAddress(address: string): AddressComponents {\n const separatorIndex = address.indexOf(SEPARATOR);\n\n if (separatorIndex === -1) {\n throw new InvalidAddressError(address, \"missing type prefix\");\n }\n\n const type = address.slice(0, separatorIndex);\n const id = address.slice(separatorIndex + 1);\n\n if (!VALID_ADDRESS_TYPES.includes(type as AddressType)) {\n throw new InvalidAddressError(address, `invalid type \"${type}\", must be agent or scope`);\n }\n\n if (!id) {\n throw new InvalidAddressError(address, \"ID cannot be empty\");\n }\n\n // Check for extra colons (could be a federated ID embedded)\n // Allow federated IDs in the id portion: agent:system-a:agent:abc123\n // This means the id would be \"system-a:agent:abc123\" which is fine\n\n return {\n type: type as AddressType,\n id,\n };\n}\n\n/**\n * Check if a string is a valid prefixed address.\n *\n * @param address - The string to check\n * @returns true if valid prefixed address format\n *\n * @example\n * isAddress(\"agent:abc123\") // true\n * isAddress(\"scope:room-1\") // true\n * isAddress(\"abc123\") // false (no prefix)\n * isAddress(\"invalid:abc\") // false (invalid type)\n */\nexport function isAddress(address: string): boolean {\n try {\n parseAddress(address);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for an agent.\n *\n * @param address - The address string to check\n * @returns true if address is for an agent\n */\nexport function isAgentAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"agent\";\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for a scope.\n *\n * @param address - The address string to check\n * @returns true if address is for a scope\n */\nexport function isScopeAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"scope\";\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the ID from an address, or return the original if not prefixed.\n *\n * Useful for backward compatibility when handling both prefixed and unprefixed addresses.\n *\n * @param address - The address string\n * @returns The extracted ID or the original string\n */\nexport function extractId(address: string): string {\n try {\n const parsed = parseAddress(address);\n return parsed.id;\n } catch {\n return address;\n }\n}\n\n/**\n * Extract the type from an address, or return undefined if not prefixed.\n *\n * @param address - The address string\n * @returns The address type or undefined\n */\nexport function extractType(address: string): AddressType | undefined {\n try {\n const parsed = parseAddress(address);\n return parsed.type;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Convenience function to create an agent address.\n *\n * @param agentId - The agent ID\n * @returns Formatted agent address\n */\nexport function toAgent(agentId: string): string {\n return formatAddress(\"agent\", agentId);\n}\n\n/**\n * Convenience function to create a scope address.\n *\n * @param scopeId - The scope ID\n * @returns Formatted scope address\n */\nexport function toScope(scopeId: string): string {\n return formatAddress(\"scope\", scopeId);\n}\n","/**\n * MAPMeshPeer - Decentralized P2P mesh peer\n *\n * Wraps agentic-mesh's MeshPeer to provide a unified interface for\n * decentralized MAP networks where each peer runs its own MapServer.\n *\n * @module\n */\n\nimport type {\n AgentId,\n ScopeId,\n AgentState,\n Agent,\n Scope,\n Address,\n Message,\n MessageMeta,\n SubscriptionFilter,\n} from '../types';\n\nimport type {\n MAPMeshPeerConfig,\n PeerEndpoint,\n CreateAgentConfig,\n CreateScopeConfig,\n LocalAgent,\n SendResult,\n GitSyncService,\n GitSyncClient,\n SyncOptions,\n SyncResult,\n PullOptions,\n PushOptions,\n CloneOptions,\n MeshEventSubscription,\n MAPMeshPeerEvents,\n} from './types';\n\n// Import agentic-mesh (peer dependency)\nimport { createMeshPeer as agenticMeshCreateMeshPeer } from 'agentic-mesh';\n\n/**\n * Internal MeshPeer type from agentic-mesh.\n * We use a minimal interface to avoid tight coupling.\n */\ninterface MeshPeerLike {\n readonly peerId: string;\n readonly peerName: string;\n readonly isRunning: boolean;\n readonly connectedPeers: string[];\n readonly git: GitTransportServiceLike | null;\n\n start(transport?: unknown): Promise<void>;\n stop(): Promise<void>;\n connectToPeer(endpoint: PeerEndpoint): Promise<unknown>;\n disconnectFromPeer(peerId: string, reason?: string): Promise<void>;\n createAgent(config: CreateAgentConfig): Promise<AgentConnectionLike>;\n getAgentConnection(agentId: AgentId): AgentConnectionLike | undefined;\n getLocalAgents(): Agent[];\n getAllAgents(): Agent[];\n createScope(config: CreateScopeConfig): Scope;\n getScope(scopeId: ScopeId): Scope | undefined;\n listScopes(): Scope[];\n send(from: AgentId, to: Address, payload: unknown, meta?: MessageMeta): Promise<SendResult>;\n subscribe(participantId: string, filter?: SubscriptionFilter): MeshEventSubscription;\n\n on<K extends keyof MAPMeshPeerEvents>(event: K, handler: MAPMeshPeerEvents[K]): void;\n off<K extends keyof MAPMeshPeerEvents>(event: K, handler: MAPMeshPeerEvents[K]): void;\n emit<K extends keyof MAPMeshPeerEvents>(event: K, ...args: Parameters<MAPMeshPeerEvents[K]>): boolean;\n}\n\n/**\n * Internal AgentConnection type from agentic-mesh.\n * Uses EventEmitter pattern for message handling.\n */\ninterface AgentConnectionLike {\n readonly agentId: AgentId;\n readonly name: string;\n readonly role?: string;\n readonly state: string;\n readonly isRegistered: boolean;\n\n register(): Promise<void>;\n unregister(reason?: string): Promise<void>;\n updateState(state: string): Promise<void>;\n updateMetadata(metadata: Record<string, unknown>): Promise<void>;\n send(to: Address, payload: unknown, meta?: MessageMeta): Promise<SendResult>;\n // EventEmitter methods for message handling\n on(event: 'message', handler: (message: unknown) => void): this;\n off(event: 'message', handler: (message: unknown) => void): this;\n}\n\n/**\n * Internal GitTransportService type from agentic-mesh.\n */\ninterface GitTransportServiceLike {\n readonly httpPort: number;\n start(): Promise<void>;\n stop(): Promise<void>;\n createSyncClient(repoPath: string): GitSyncClientLike;\n}\n\n/**\n * Internal GitSyncClient type from agentic-mesh.\n */\ninterface GitSyncClientLike {\n sync(peerId: string, options?: SyncOptions): Promise<SyncResult>;\n fetch(peerId: string, branch?: string): Promise<SyncResult>;\n pull(peerId: string, branch?: string, options?: PullOptions): Promise<SyncResult>;\n push(peerId: string, branch?: string, options?: PushOptions): Promise<SyncResult>;\n clone(peerId: string, destPath: string, options?: CloneOptions): Promise<SyncResult>;\n listRemoteRefs(peerId: string): Promise<Array<{ ref: string; sha: string }>>;\n}\n\n/**\n * Decentralized P2P mesh peer with MAP protocol support.\n *\n * Each MAPMeshPeer runs its own MapServer and can connect to other peers\n * for agent discovery, messaging, and git synchronization.\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n * import { MAPMeshPeer } from '@multi-agent-protocol/sdk';\n *\n * // Create transport\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * // Create mesh peer\n * const peer = await MAPMeshPeer.create({\n * peerId: 'worker-1',\n * peerName: 'Worker Node 1',\n * transport,\n * git: {\n * enabled: true,\n * repoPath: '/workspace/project',\n * },\n * peers: [\n * { peerId: 'coordinator', address: '10.0.0.1', port: 4242 },\n * ],\n * });\n *\n * // Start the peer\n * await peer.start();\n *\n * // Create a local agent\n * const agent = await peer.createAgent({\n * name: 'DataProcessor',\n * role: 'processor',\n * });\n *\n * // Connect to another peer\n * await peer.connectToPeer({ peerId: 'worker-2', address: '10.0.0.3' });\n *\n * // Sync code with connected peer\n * await peer.git?.sync('worker-2', { branch: 'main' });\n *\n * // Clean shutdown\n * await peer.stop();\n * ```\n */\nexport class MAPMeshPeer {\n readonly #meshPeer: MeshPeerLike;\n readonly #config: MAPMeshPeerConfig;\n readonly #gitService: GitSyncServiceImpl | null;\n\n private constructor(meshPeer: MeshPeerLike, config: MAPMeshPeerConfig) {\n this.#meshPeer = meshPeer;\n this.#config = config;\n this.#gitService = meshPeer.git\n ? new GitSyncServiceImpl(meshPeer.git, config.git?.repoPath ?? process.cwd())\n : null;\n }\n\n // ===========================================================================\n // Static Factory\n // ===========================================================================\n\n /**\n * Create a new MAPMeshPeer.\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param config - Peer configuration\n * @returns Promise resolving to the created peer (not yet started)\n */\n static async create(config: MAPMeshPeerConfig): Promise<MAPMeshPeer> {\n const meshPeer = agenticMeshCreateMeshPeer({\n peerId: config.peerId,\n peerName: config.peerName,\n transport: config.transport as any,\n git: config.git as any,\n peers: config.peers as any,\n map: config.map,\n }) as unknown as MeshPeerLike;\n\n return new MAPMeshPeer(meshPeer, config);\n }\n\n // ===========================================================================\n // Properties\n // ===========================================================================\n\n /** Unique peer identifier */\n get peerId(): string {\n return this.#meshPeer.peerId;\n }\n\n /** Display name for this peer */\n get peerName(): string {\n return this.#meshPeer.peerName;\n }\n\n /** Whether the peer is currently running */\n get isRunning(): boolean {\n return this.#meshPeer.isRunning;\n }\n\n /** List of connected peer IDs */\n get connectedPeers(): string[] {\n return this.#meshPeer.connectedPeers;\n }\n\n /** Git sync service (null if git not enabled) */\n get git(): GitSyncService | null {\n return this.#gitService;\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Start the mesh peer.\n *\n * This starts the transport, MAP server, and git service (if enabled),\n * then connects to any initial peers specified in the config.\n */\n async start(): Promise<void> {\n await this.#meshPeer.start(this.#config.transport);\n }\n\n /**\n * Stop the mesh peer.\n *\n * This disconnects from all peers, unregisters all agents,\n * stops the git service, MAP server, and transport.\n */\n async stop(): Promise<void> {\n await this.#meshPeer.stop();\n }\n\n // ===========================================================================\n // Peer Connections\n // ===========================================================================\n\n /**\n * Connect to a remote peer.\n *\n * After connecting, agents on both peers will be discoverable\n * and messages can be routed between them.\n *\n * @param endpoint - Peer endpoint to connect to\n */\n async connectToPeer(endpoint: PeerEndpoint): Promise<void> {\n await this.#meshPeer.connectToPeer(endpoint);\n }\n\n /**\n * Disconnect from a peer.\n *\n * @param peerId - ID of peer to disconnect from\n * @param reason - Optional reason for disconnecting\n */\n async disconnectFromPeer(peerId: string, reason?: string): Promise<void> {\n await this.#meshPeer.disconnectFromPeer(peerId, reason);\n }\n\n /**\n * Check if connected to a specific peer.\n *\n * @param peerId - Peer ID to check\n * @returns true if connected\n */\n isConnectedTo(peerId: string): boolean {\n return this.connectedPeers.includes(peerId);\n }\n\n // ===========================================================================\n // Agent Management\n // ===========================================================================\n\n /**\n * Create and register a local agent on this peer's MapServer.\n *\n * @param config - Agent configuration\n * @returns The created agent\n */\n async createAgent(config: CreateAgentConfig): Promise<LocalAgent> {\n const agentConn = await this.#meshPeer.createAgent(config);\n return new LocalAgentImpl(agentConn);\n }\n\n /**\n * Get a local agent by ID.\n *\n * @param agentId - Agent ID to look up\n * @returns The agent, or undefined if not found\n */\n getAgent(agentId: AgentId): LocalAgent | undefined {\n const conn = this.#meshPeer.getAgentConnection(agentId);\n return conn ? new LocalAgentImpl(conn) : undefined;\n }\n\n /**\n * Get all local agents on this peer.\n */\n getLocalAgents(): Agent[] {\n return this.#meshPeer.getLocalAgents();\n }\n\n /**\n * Get all known agents (local and discovered from connected peers).\n */\n getAllAgents(): Agent[] {\n return this.#meshPeer.getAllAgents();\n }\n\n // ===========================================================================\n // Scope Management\n // ===========================================================================\n\n /**\n * Create a scope on this peer's MapServer.\n *\n * @param config - Scope configuration\n * @returns The created scope\n */\n createScope(config: CreateScopeConfig): Scope {\n return this.#meshPeer.createScope(config);\n }\n\n /**\n * Get a scope by ID.\n *\n * @param scopeId - Scope ID to look up\n * @returns The scope, or undefined if not found\n */\n getScope(scopeId: ScopeId): Scope | undefined {\n return this.#meshPeer.getScope(scopeId);\n }\n\n /**\n * List all scopes on this peer.\n */\n listScopes(): Scope[] {\n return this.#meshPeer.listScopes();\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send a message from an agent to an address.\n *\n * Messages are routed to local agents or forwarded to connected peers.\n *\n * @param from - Sending agent ID\n * @param to - Destination address\n * @param payload - Message payload\n * @param meta - Optional message metadata\n * @returns Send result with delivery status\n */\n async send(\n from: AgentId,\n to: Address,\n payload: unknown,\n meta?: MessageMeta\n ): Promise<SendResult> {\n return this.#meshPeer.send(from, to, payload, meta);\n }\n\n // ===========================================================================\n // Events\n // ===========================================================================\n\n /**\n * Subscribe to events from this peer's MapServer.\n *\n * @param filter - Optional filter for event types\n * @returns Event subscription\n */\n subscribe(filter?: SubscriptionFilter): MeshEventSubscription {\n // Use the peer ID as participant for subscriptions\n return this.#meshPeer.subscribe(this.peerId, filter);\n }\n\n /**\n * Register a handler for peer connection events.\n *\n * @param handler - Function called when a peer connects\n * @returns Unsubscribe function\n */\n onPeerConnected(handler: (peerId: string, endpoint: PeerEndpoint) => void): () => void {\n this.#meshPeer.on('peer:connected', handler);\n return () => this.#meshPeer.off('peer:connected', handler);\n }\n\n /**\n * Register a handler for peer disconnection events.\n *\n * @param handler - Function called when a peer disconnects\n * @returns Unsubscribe function\n */\n onPeerDisconnected(handler: (peerId: string, reason?: string) => void): () => void {\n this.#meshPeer.on('peer:disconnected', handler);\n return () => this.#meshPeer.off('peer:disconnected', handler);\n }\n\n /**\n * Register a handler for agent registration events.\n *\n * @param handler - Function called when an agent registers\n * @returns Unsubscribe function\n */\n onAgentRegistered(handler: (agent: Agent) => void): () => void {\n this.#meshPeer.on('agent:registered', handler);\n return () => this.#meshPeer.off('agent:registered', handler);\n }\n\n /**\n * Register a handler for agent unregistration events.\n *\n * @param handler - Function called when an agent unregisters\n * @returns Unsubscribe function\n */\n onAgentUnregistered(handler: (agent: Agent) => void): () => void {\n this.#meshPeer.on('agent:unregistered', handler);\n return () => this.#meshPeer.off('agent:unregistered', handler);\n }\n\n /**\n * Register a handler for error events.\n *\n * @param handler - Function called when an error occurs\n * @returns Unsubscribe function\n */\n onError(handler: (error: Error) => void): () => void {\n this.#meshPeer.on('error', handler);\n return () => this.#meshPeer.off('error', handler);\n }\n}\n\n// =============================================================================\n// Internal Implementations\n// =============================================================================\n\n/**\n * Implementation of LocalAgent wrapping AgentConnection.\n */\nclass LocalAgentImpl implements LocalAgent {\n readonly #conn: AgentConnectionLike;\n\n constructor(conn: AgentConnectionLike) {\n this.#conn = conn;\n }\n\n get agentId(): AgentId {\n return this.#conn.agentId;\n }\n\n get name(): string {\n return this.#conn.name;\n }\n\n get role(): string | undefined {\n return this.#conn.role;\n }\n\n get state(): AgentState {\n return this.#conn.state as AgentState;\n }\n\n async busy(): Promise<void> {\n await this.#conn.updateState('busy');\n }\n\n async idle(): Promise<void> {\n await this.#conn.updateState('idle');\n }\n\n async updateState(state: AgentState): Promise<void> {\n await this.#conn.updateState(state);\n }\n\n async updateMetadata(metadata: Record<string, unknown>): Promise<void> {\n await this.#conn.updateMetadata(metadata);\n }\n\n async send(to: Address, payload: unknown, meta?: MessageMeta): Promise<SendResult> {\n return this.#conn.send(to, payload, meta);\n }\n\n onMessage(handler: (message: Message) => void | Promise<void>): () => void {\n const wrappedHandler = (message: unknown) => handler(message as Message);\n this.#conn.on('message', wrappedHandler);\n return () => {\n this.#conn.off('message', wrappedHandler);\n };\n }\n\n async unregister(reason?: string): Promise<void> {\n await this.#conn.unregister(reason);\n }\n}\n\n/**\n * Implementation of GitSyncService wrapping GitTransportService.\n */\nclass GitSyncServiceImpl implements GitSyncService {\n readonly #service: GitTransportServiceLike;\n readonly #defaultRepoPath: string;\n #defaultClient: GitSyncClientLike | null = null;\n\n constructor(service: GitTransportServiceLike, defaultRepoPath: string) {\n this.#service = service;\n this.#defaultRepoPath = defaultRepoPath;\n }\n\n get isRunning(): boolean {\n return true; // Service is managed by MeshPeer lifecycle\n }\n\n get httpPort(): number {\n return this.#service.httpPort;\n }\n\n createSyncClient(repoPath: string): GitSyncClient {\n return this.#service.createSyncClient(repoPath);\n }\n\n #getDefaultClient(): GitSyncClientLike {\n if (!this.#defaultClient) {\n this.#defaultClient = this.#service.createSyncClient(this.#defaultRepoPath);\n }\n return this.#defaultClient;\n }\n\n async sync(peerId: string, options?: SyncOptions): Promise<SyncResult> {\n return this.#getDefaultClient().sync(peerId, options);\n }\n\n async pull(peerId: string, branch?: string, options?: PullOptions): Promise<SyncResult> {\n return this.#getDefaultClient().pull(peerId, branch, options);\n }\n\n async push(peerId: string, branch?: string, options?: PushOptions): Promise<SyncResult> {\n return this.#getDefaultClient().push(peerId, branch, options);\n }\n\n async clone(peerId: string, destPath: string, options?: CloneOptions): Promise<SyncResult> {\n return this.#getDefaultClient().clone(peerId, destPath, options);\n }\n}\n","/**\n * ACPAgentAdapter - Agent-side helper for ACP-over-MAP.\n *\n * Simplifies implementing ACP-compatible agents by handling the\n * MAP↔ACP translation layer automatically.\n *\n * @module\n */\n\nimport type { AgentConnection } from \"../connection/agent\";\nimport type { Message, ParticipantId } from \"../types\";\nimport {\n type ACPSessionId,\n type ACPRequestId,\n type ACPEnvelope,\n type ACPAgentContext,\n type ACPAgentHandler,\n type ACPInitializeRequest,\n type ACPAuthenticateRequest,\n type ACPNewSessionRequest,\n type ACPLoadSessionRequest,\n type ACPSetSessionModeRequest,\n type ACPPromptRequest,\n type ACPCancelNotification,\n type ACPSessionNotification,\n type ACPRequestPermissionRequest,\n type ACPRequestPermissionResponse,\n type ACPReadTextFileRequest,\n type ACPReadTextFileResponse,\n type ACPWriteTextFileRequest,\n type ACPWriteTextFileResponse,\n type ACPCreateTerminalRequest,\n type ACPCreateTerminalResponse,\n type ACPTerminalOutputRequest,\n type ACPTerminalOutputResponse,\n type ACPReleaseTerminalRequest,\n type ACPReleaseTerminalResponse,\n type ACPWaitForTerminalExitRequest,\n type ACPWaitForTerminalExitResponse,\n type ACPKillTerminalCommandRequest,\n type ACPKillTerminalCommandResponse,\n ACPError,\n ACP_METHODS,\n isACPEnvelope,\n} from \"./types\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Pending client request state for agent→client correlation.\n */\ninterface PendingClientRequest {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n method: string;\n}\n\n/**\n * Stream context tracked per client stream.\n */\ninterface StreamContext {\n clientParticipantId: ParticipantId;\n sessionId: ACPSessionId | null;\n}\n\n// =============================================================================\n// ACPAgentAdapter\n// =============================================================================\n\n/**\n * Adapter for implementing ACP-compatible agents.\n *\n * Handles the ACP envelope protocol, request routing, and provides\n * helper methods for agent→client communication.\n *\n * @example\n * ```typescript\n * const mapAgent = await AgentConnection.connect('ws://localhost:8080', {\n * name: 'CodingAgent',\n * capabilities: { protocols: ['acp'], acp: { version: '2024-10-07' } }\n * });\n *\n * const adapter = new ACPAgentAdapter(mapAgent, {\n * initialize: async (params, ctx) => ({\n * protocolVersion: 20241007,\n * agentInfo: { name: 'CodingAgent', version: '1.0.0' },\n * agentCapabilities: { loadSession: true }\n * }),\n * newSession: async (params, ctx) => ({\n * sessionId: generateId()\n * }),\n * prompt: async (params, ctx) => {\n * await adapter.sendSessionUpdate(ctx.streamId, {\n * sessionId: params.sessionId,\n * update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'Hello!' } }\n * });\n * return { stopReason: 'end_turn' };\n * },\n * cancel: async (params, ctx) => {}\n * });\n * ```\n */\nexport class ACPAgentAdapter {\n readonly #mapAgent: AgentConnection;\n readonly #handler: ACPAgentHandler;\n readonly #streamContexts: Map<string, StreamContext> = new Map();\n readonly #pendingClientRequests: Map<string, PendingClientRequest> = new Map();\n readonly #clientRequestTimeout: number;\n\n /**\n * Create a new ACP agent adapter.\n *\n * @param mapAgent - The underlying MAP agent connection\n * @param handler - Handler implementing ACP agent methods\n * @param options - Optional configuration\n */\n constructor(\n mapAgent: AgentConnection,\n handler: ACPAgentHandler,\n options?: { clientRequestTimeout?: number }\n ) {\n this.#mapAgent = mapAgent;\n this.#handler = handler;\n this.#clientRequestTimeout = options?.clientRequestTimeout ?? 30000;\n\n // Register message handler\n // IMPORTANT: We use queueMicrotask to avoid deadlock for client requests.\n // The message handler is called from within the BaseConnection's notification\n // handler, which awaits it. If we process client requests synchronously and\n // need to send a response, we'd await a send that waits for a response from\n // the server. But the read loop can't process that response because it's\n // blocked awaiting us. By using queueMicrotask, we return immediately,\n // allowing the read loop to continue processing responses.\n //\n // However, we track stream context synchronously so that hasStream() works\n // immediately after a message is received.\n mapAgent.onMessage((message) => {\n // Check if this is an ACP message\n if (!message.payload || !isACPEnvelope(message.payload)) {\n return;\n }\n\n const envelope = message.payload as ACPEnvelope;\n const { acp, acpContext } = envelope;\n\n // Responses to pending client requests can be handled synchronously\n // since they don't involve sending anything\n if (acp.id !== undefined && !acp.method) {\n void this.#handleMessage(message);\n return;\n }\n\n // For client requests, track stream context synchronously\n if (acp.method) {\n this.#trackStreamContext(acpContext, message.from);\n }\n\n // Then defer the actual request processing to avoid deadlock\n queueMicrotask(() => void this.#handleMessage(message));\n });\n }\n\n /**\n * Track stream context for a client request.\n * This is called synchronously so that hasStream() works immediately.\n */\n #trackStreamContext(\n acpCtx: ACPEnvelope[\"acpContext\"],\n clientParticipantId: ParticipantId\n ): void {\n if (!this.#streamContexts.has(acpCtx.streamId)) {\n this.#streamContexts.set(acpCtx.streamId, {\n clientParticipantId,\n sessionId: acpCtx.sessionId,\n });\n } else if (acpCtx.sessionId) {\n const streamCtx = this.#streamContexts.get(acpCtx.streamId)!;\n streamCtx.sessionId = acpCtx.sessionId;\n }\n }\n\n // ===========================================================================\n // Message Handling\n // ===========================================================================\n\n /**\n * Handle incoming messages from MAP.\n */\n async #handleMessage(message: Message): Promise<void> {\n // Check if this is an ACP message\n if (!message.payload || !isACPEnvelope(message.payload)) {\n return;\n }\n\n const envelope = message.payload as ACPEnvelope;\n const { acp, acpContext } = envelope;\n\n // Handle response to a pending client request\n if (acp.id !== undefined && !acp.method) {\n const requestId = String(acp.id);\n const pending = this.#pendingClientRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.#pendingClientRequests.delete(requestId);\n\n if (acp.error) {\n pending.reject(ACPError.fromResponse(acp.error));\n } else {\n pending.resolve(acp.result);\n }\n }\n return;\n }\n\n // Handle client→agent request or notification\n if (acp.method) {\n await this.#handleClientRequest(\n acp.id,\n acp.method,\n acp.params,\n acpContext,\n message\n );\n }\n }\n\n /**\n * Handle a client→agent request.\n */\n async #handleClientRequest(\n requestId: ACPRequestId | undefined,\n method: string,\n params: unknown,\n acpCtx: ACPEnvelope[\"acpContext\"],\n originalMessage: Message\n ): Promise<void> {\n // Build the handler context\n const ctx: ACPAgentContext = {\n streamId: acpCtx.streamId,\n sessionId: acpCtx.sessionId,\n clientParticipantId: originalMessage.from,\n };\n\n // Note: Stream context is now tracked synchronously in the message handler\n // callback via #trackStreamContext, so we don't duplicate it here.\n\n let result: unknown;\n let error: ACPError | undefined;\n\n try {\n switch (method) {\n case ACP_METHODS.INITIALIZE:\n result = await this.#handler.initialize(\n params as ACPInitializeRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.AUTHENTICATE:\n if (!this.#handler.authenticate) {\n throw new ACPError(-32601, \"Method not implemented: authenticate\");\n }\n result = await this.#handler.authenticate(\n params as ACPAuthenticateRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.SESSION_NEW:\n result = await this.#handler.newSession(\n params as ACPNewSessionRequest,\n ctx\n );\n // Update stream context with new session ID\n const newSessionResult = result as { sessionId: ACPSessionId };\n const streamContext = this.#streamContexts.get(acpCtx.streamId);\n if (streamContext) {\n streamContext.sessionId = newSessionResult.sessionId;\n }\n break;\n\n case ACP_METHODS.SESSION_LOAD:\n if (!this.#handler.loadSession) {\n throw new ACPError(-32601, \"Method not implemented: session/load\");\n }\n result = await this.#handler.loadSession(\n params as ACPLoadSessionRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.SESSION_SET_MODE:\n if (!this.#handler.setSessionMode) {\n throw new ACPError(-32601, \"Method not implemented: session/set_mode\");\n }\n result = await this.#handler.setSessionMode(\n params as ACPSetSessionModeRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.SESSION_PROMPT:\n result = await this.#handler.prompt(params as ACPPromptRequest, ctx);\n break;\n\n case ACP_METHODS.SESSION_CANCEL:\n await this.#handler.cancel(params as ACPCancelNotification, ctx);\n // Notifications don't have responses\n return;\n\n default:\n throw new ACPError(-32601, `Unknown method: ${method}`);\n }\n } catch (e) {\n if (e instanceof ACPError) {\n error = e;\n } else {\n error = new ACPError(-32603, (e as Error).message);\n }\n }\n\n // Send response (only for requests, not notifications)\n // IMPORTANT: We must NOT await this send operation because we're inside\n // a notification handler. Awaiting would cause a deadlock: the notification\n // handler awaits the send, which awaits a response from the server, but the\n // read loop can't process the response because it's blocked awaiting the\n // notification handler.\n if (requestId !== undefined) {\n const responseEnvelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: requestId,\n ...(error ? { error: error.toErrorObject() } : { result }),\n },\n acpContext: {\n streamId: acpCtx.streamId,\n sessionId: this.#streamContexts.get(acpCtx.streamId)?.sessionId ?? null,\n direction: \"agent-to-client\",\n },\n };\n\n // Fire-and-forget with error logging\n this.#mapAgent\n .send(\n { participant: originalMessage.from },\n responseEnvelope,\n {\n protocol: \"acp\",\n correlationId: originalMessage.id,\n }\n )\n .catch((err) => {\n console.error(\"ACP: Failed to send response:\", err);\n });\n }\n }\n\n // ===========================================================================\n // Agent→Client Communication\n // ===========================================================================\n\n /**\n * Send a session update notification to the client.\n */\n async sendSessionUpdate(\n streamId: string,\n notification: ACPSessionNotification\n ): Promise<void> {\n const streamCtx = this.#streamContexts.get(streamId);\n if (!streamCtx) {\n throw new Error(`Unknown stream: ${streamId}`);\n }\n\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n method: ACP_METHODS.SESSION_UPDATE,\n params: notification,\n },\n acpContext: {\n streamId,\n sessionId: streamCtx.sessionId,\n direction: \"agent-to-client\",\n },\n };\n\n await this.#mapAgent.send(\n { participant: streamCtx.clientParticipantId },\n envelope,\n { protocol: \"acp\" }\n );\n }\n\n /**\n * Send an agent→client request and wait for response.\n */\n async #sendClientRequest<TParams, TResult>(\n streamId: string,\n method: string,\n params: TParams\n ): Promise<TResult> {\n const streamCtx = this.#streamContexts.get(streamId);\n if (!streamCtx) {\n throw new Error(`Unknown stream: ${streamId}`);\n }\n\n const correlationId = `agent-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: correlationId,\n method,\n params: params as unknown,\n },\n acpContext: {\n streamId,\n sessionId: streamCtx.sessionId,\n direction: \"agent-to-client\",\n pendingClientRequest: {\n requestId: correlationId,\n method,\n timeout: this.#clientRequestTimeout,\n },\n },\n };\n\n await this.#mapAgent.send(\n { participant: streamCtx.clientParticipantId },\n envelope,\n { protocol: \"acp\", correlationId }\n );\n\n return new Promise<TResult>((resolve, reject) => {\n const timeoutHandle = setTimeout(() => {\n this.#pendingClientRequests.delete(correlationId);\n reject(new Error(`Client request timed out: ${method}`));\n }, this.#clientRequestTimeout);\n\n this.#pendingClientRequests.set(correlationId, {\n resolve: resolve as (result: unknown) => void,\n reject,\n timeout: timeoutHandle,\n method,\n });\n });\n }\n\n /**\n * Request permission from the client.\n */\n async requestPermission(\n streamId: string,\n request: ACPRequestPermissionRequest\n ): Promise<ACPRequestPermissionResponse> {\n return this.#sendClientRequest<\n ACPRequestPermissionRequest,\n ACPRequestPermissionResponse\n >(streamId, ACP_METHODS.REQUEST_PERMISSION, request);\n }\n\n /**\n * Read a text file from the client.\n */\n async readTextFile(\n streamId: string,\n request: ACPReadTextFileRequest\n ): Promise<ACPReadTextFileResponse> {\n return this.#sendClientRequest<\n ACPReadTextFileRequest,\n ACPReadTextFileResponse\n >(streamId, ACP_METHODS.FS_READ_TEXT_FILE, request);\n }\n\n /**\n * Write a text file on the client.\n */\n async writeTextFile(\n streamId: string,\n request: ACPWriteTextFileRequest\n ): Promise<ACPWriteTextFileResponse> {\n return this.#sendClientRequest<\n ACPWriteTextFileRequest,\n ACPWriteTextFileResponse\n >(streamId, ACP_METHODS.FS_WRITE_TEXT_FILE, request);\n }\n\n /**\n * Create a terminal on the client.\n */\n async createTerminal(\n streamId: string,\n request: ACPCreateTerminalRequest\n ): Promise<ACPCreateTerminalResponse> {\n return this.#sendClientRequest<\n ACPCreateTerminalRequest,\n ACPCreateTerminalResponse\n >(streamId, ACP_METHODS.TERMINAL_CREATE, request);\n }\n\n /**\n * Get terminal output from the client.\n */\n async terminalOutput(\n streamId: string,\n request: ACPTerminalOutputRequest\n ): Promise<ACPTerminalOutputResponse> {\n return this.#sendClientRequest<\n ACPTerminalOutputRequest,\n ACPTerminalOutputResponse\n >(streamId, ACP_METHODS.TERMINAL_OUTPUT, request);\n }\n\n /**\n * Release a terminal on the client.\n */\n async releaseTerminal(\n streamId: string,\n request: ACPReleaseTerminalRequest\n ): Promise<ACPReleaseTerminalResponse> {\n return this.#sendClientRequest<\n ACPReleaseTerminalRequest,\n ACPReleaseTerminalResponse\n >(streamId, ACP_METHODS.TERMINAL_RELEASE, request);\n }\n\n /**\n * Wait for a terminal to exit on the client.\n */\n async waitForTerminalExit(\n streamId: string,\n request: ACPWaitForTerminalExitRequest\n ): Promise<ACPWaitForTerminalExitResponse> {\n return this.#sendClientRequest<\n ACPWaitForTerminalExitRequest,\n ACPWaitForTerminalExitResponse\n >(streamId, ACP_METHODS.TERMINAL_WAIT_FOR_EXIT, request);\n }\n\n /**\n * Kill a terminal command on the client.\n */\n async killTerminal(\n streamId: string,\n request: ACPKillTerminalCommandRequest\n ): Promise<ACPKillTerminalCommandResponse> {\n return this.#sendClientRequest<\n ACPKillTerminalCommandRequest,\n ACPKillTerminalCommandResponse\n >(streamId, ACP_METHODS.TERMINAL_KILL, request);\n }\n\n // ===========================================================================\n // Utility Methods\n // ===========================================================================\n\n /**\n * Get the current session ID for a stream.\n */\n getSessionId(streamId: string): ACPSessionId | null {\n return this.#streamContexts.get(streamId)?.sessionId ?? null;\n }\n\n /**\n * Get the client participant ID for a stream.\n */\n getClientParticipantId(streamId: string): ParticipantId | undefined {\n return this.#streamContexts.get(streamId)?.clientParticipantId;\n }\n\n /**\n * Check if a stream is active.\n */\n hasStream(streamId: string): boolean {\n return this.#streamContexts.has(streamId);\n }\n\n /**\n * Remove a stream context (e.g., on disconnect).\n */\n removeStream(streamId: string): boolean {\n return this.#streamContexts.delete(streamId);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stream/agentic-mesh.ts","../src/types/index.ts","../src/jsonrpc/index.ts","../src/errors/index.ts","../src/stream/index.ts","../src/subscription/index.ts","../src/connection/base.ts","../src/utils/ulid.ts","../src/utils/retry.ts","../src/utils/causal-buffer.ts","../src/acp/types.ts","../src/acp/stream.ts","../src/connection/client.ts","../src/connection/agent.ts","../src/federation/envelope.ts","../src/federation/buffer.ts","../src/connection/gateway.ts","../src/schema/zod.gen.ts","../src/protocol/index.ts","../src/permissions/index.ts","../src/server/messages/address.ts","../src/mesh/peer.ts","../src/acp/adapter.ts"],"names":["agenticMeshStream","agenticMeshCreateMeshPeer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Agentic-Mesh Stream Adapter\n *\n * Wraps agentic-mesh's TunnelStream as a MAP SDK Stream interface.\n * This enables MAP clients/agents to communicate over encrypted mesh\n * networks (Nebula, Tailscale, Headscale).\n *\n * @module\n */\n\nimport type { Stream, AnyMessage } from './index';\nimport { TunnelStream, type TransportAdapter } from 'agentic-mesh';\n\n/**\n * Peer endpoint for mesh connection.\n * Re-exported from agentic-mesh for convenience.\n */\nexport interface MeshPeerEndpoint {\n /** Peer identifier */\n peerId: string;\n /** Transport-specific address (IP, URL, etc.) */\n address: string;\n /** Optional port (for TCP-based transports) */\n port?: number;\n /** Additional transport-specific metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Transport adapter interface (subset used by this module).\n * Full interface is defined in agentic-mesh.\n */\nexport interface MeshTransportAdapter {\n /** Whether the transport is currently active */\n readonly active: boolean;\n /** Start the transport */\n start(): Promise<void>;\n /** Connect to a peer endpoint */\n connect(endpoint: MeshPeerEndpoint): Promise<boolean>;\n /** Check if connected to a peer */\n isConnected(peerId: string): boolean;\n}\n\n/**\n * Configuration for agentic-mesh stream.\n */\nexport interface AgenticMeshStreamConfig {\n /**\n * The agentic-mesh transport adapter (Nebula, Tailscale, etc.).\n *\n * Create using agentic-mesh factory functions:\n * - `createNebulaTransport()` for Nebula networks\n * - `createTailscaleTransport()` for Tailscale networks\n */\n transport: MeshTransportAdapter;\n\n /**\n * Remote peer to connect to.\n */\n peer: MeshPeerEndpoint;\n\n /**\n * Local peer ID for identification.\n * Used to generate unique stream IDs.\n */\n localPeerId: string;\n\n /**\n * Connection timeout in milliseconds.\n * @default 10000\n */\n timeout?: number;\n}\n\n/**\n * Internal TunnelStream interface (from agentic-mesh).\n * We use a minimal interface to avoid tight coupling.\n */\ninterface TunnelStreamLike {\n readonly isOpen: boolean;\n open(): Promise<void>;\n close(): Promise<void>;\n write(frame: unknown): Promise<void>;\n [Symbol.asyncIterator](): AsyncIterator<unknown>;\n}\n\n/**\n * Creates a MAP Stream over an agentic-mesh tunnel.\n *\n * This wraps agentic-mesh's TunnelStream (NDJSON over encrypted transport)\n * and adapts it to the MAP SDK's Stream interface.\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param config - Stream configuration\n * @returns Promise resolving to a connected MAP Stream\n * @throws Error if agentic-mesh is not installed\n * @throws Error if peer connection fails\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n * import { agenticMeshStream, ClientConnection } from '@multi-agent-protocol/sdk';\n *\n * // Create Nebula transport\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * // Create MAP stream over mesh\n * const stream = await agenticMeshStream({\n * transport,\n * peer: { peerId: 'server', address: '10.0.0.1', port: 4242 },\n * localPeerId: 'my-client',\n * });\n *\n * // Use with MAP client\n * const client = new ClientConnection(stream, { name: 'MeshClient' });\n * await client.connect();\n * ```\n */\nexport async function agenticMeshStream(\n config: AgenticMeshStreamConfig\n): Promise<Stream> {\n // Start transport if not already active\n if (!config.transport.active) {\n await config.transport.start();\n }\n\n // Connect to peer\n const connected = await config.transport.connect(config.peer);\n if (!connected) {\n throw new Error(`Failed to connect to peer: ${config.peer.peerId}`);\n }\n\n // Create tunnel stream with unique ID\n const streamId = `map-${config.localPeerId}-${Date.now()}`;\n const tunnelStream = new TunnelStream({\n transport: config.transport as unknown as TransportAdapter,\n peerId: config.peer.peerId,\n streamId,\n });\n\n // Open the stream\n await tunnelStream.open();\n\n // Adapt to MAP Stream interface\n return tunnelStreamToMapStream(tunnelStream);\n}\n\n/**\n * Adapts a TunnelStream to the MAP SDK Stream interface.\n *\n * The MAP SDK uses Web Streams API (ReadableStream/WritableStream)\n * while TunnelStream uses AsyncIterator pattern.\n *\n * @internal\n */\nfunction tunnelStreamToMapStream(tunnel: TunnelStreamLike): Stream {\n // Track if reading has been aborted (for cleanup)\n let readingAborted = false;\n\n const readable = new ReadableStream<AnyMessage>({\n async start(controller) {\n try {\n for await (const frame of tunnel) {\n if (readingAborted) break;\n controller.enqueue(frame as AnyMessage);\n }\n if (!readingAborted) {\n controller.close();\n }\n } catch (error) {\n if (!readingAborted) {\n controller.error(error);\n }\n }\n },\n cancel() {\n readingAborted = true;\n tunnel.close().catch(() => {\n // Ignore close errors during cancel\n });\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n if (!tunnel.isOpen) {\n throw new Error('Stream is not open');\n }\n await tunnel.write(message);\n },\n async close() {\n await tunnel.close();\n },\n abort() {\n readingAborted = true;\n tunnel.close().catch(() => {\n // Ignore close errors during abort\n });\n },\n });\n\n return { readable, writable };\n}\n","/**\n * Multi-Agent Protocol (MAP) Type Definitions - v2\n *\n * Core type definitions matching the MAP JSON Schema.\n * These types are the foundation for the TypeScript SDK.\n *\n * v2 Changes:\n * - Fixed ERROR_CODES collision (FEDERATION_AUTH_FAILED)\n * - Added Agent.ownerId for ownership tracking\n * - Reorganized method constants by capability domain\n * - Added EventInput type and createEvent() helper\n * - Added disconnect policy and lifecycle events\n * - Expanded subscription filters\n * - Standardized response shapes (always return entities)\n * - Added hierarchy expansion to agents/get\n * - Added CAPABILITY_REQUIREMENTS mapping\n * - Clarified message event data (no payloads)\n */\n\n// =============================================================================\n// Primitive Types & Identifiers\n// =============================================================================\n\n/** Unique identifier for any participant (agent, client, system, gateway) */\nexport type ParticipantId = string;\n\n/** Unique identifier for an agent */\nexport type AgentId = string;\n\n/** Unique identifier for a scope */\nexport type ScopeId = string;\n\n/** Unique identifier for a session */\nexport type SessionId = string;\n\n/** Unique identifier for a message */\nexport type MessageId = string;\n\n/** Unique identifier for a subscription */\nexport type SubscriptionId = string;\n\n/** Identifier for correlating related messages */\nexport type CorrelationId = string;\n\n/** Unique identifier for a conversation (format: 'conv-{ulid}') */\nexport type ConversationId = string;\n\n/** Unique identifier for a turn within a conversation (format: 'turn-{ulid}') */\nexport type TurnId = string;\n\n/** Unique identifier for a thread within a conversation (format: 'thread-{ulid}') */\nexport type ThreadId = string;\n\n/** JSON-RPC request ID */\nexport type RequestId = string | number;\n\n/** MAP protocol version */\nexport type ProtocolVersion = 1;\n\n/** Unix timestamp in milliseconds */\nexport type Timestamp = number;\n\n/** Vendor extension metadata */\nexport type Meta = Record<string, unknown>;\n\n// =============================================================================\n// Participant Types\n// =============================================================================\n\n/** Type of participant in the protocol */\nexport type ParticipantType = 'agent' | 'client' | 'system' | 'gateway';\n\n/** Transport binding type */\nexport type TransportType = 'websocket' | 'stdio' | 'inprocess' | 'http-sse';\n\n/**\n * Streaming capabilities for backpressure and flow control.\n * Servers advertise these to indicate what features they support.\n */\nexport interface StreamingCapabilities {\n /** Server can receive and process ack notifications */\n supportsAck?: boolean;\n /** Server will pause sending when client falls behind */\n supportsFlowControl?: boolean;\n /** Server supports pause/resume subscription state */\n supportsPause?: boolean;\n}\n\n/** Capabilities of a participant, grouped by category */\nexport interface ParticipantCapabilities {\n observation?: {\n /** Can subscribe to event streams */\n canObserve?: boolean;\n /** Can query agents and structure */\n canQuery?: boolean;\n };\n messaging?: {\n /** Can send messages */\n canSend?: boolean;\n /** Can receive messages addressed to it */\n canReceive?: boolean;\n /** Can send to scopes/roles */\n canBroadcast?: boolean;\n };\n lifecycle?: {\n /** Can create child agents */\n canSpawn?: boolean;\n /** Can register agents (not as children) */\n canRegister?: boolean;\n /** Can remove agents */\n canUnregister?: boolean;\n /** Can inject context/control agents */\n canSteer?: boolean;\n /** Can request agent termination */\n canStop?: boolean;\n };\n scopes?: {\n /** Can create new scopes */\n canCreateScopes?: boolean;\n /** Can modify and delete scopes */\n canManageScopes?: boolean;\n };\n federation?: {\n /** Can connect to and route to federated systems */\n canFederate?: boolean;\n };\n /** Mail protocol capabilities for conversation/turn tracking */\n mail?: {\n /** Whether mail is enabled (server response only) */\n enabled?: boolean;\n /** Can create new conversations */\n canCreate?: boolean;\n /** Can join existing conversations */\n canJoin?: boolean;\n /** Can invite participants to conversations */\n canInvite?: boolean;\n /** Can view conversation history */\n canViewHistory?: boolean;\n /** Can create threads within conversations */\n canCreateThreads?: boolean;\n };\n /** Streaming/backpressure capabilities */\n streaming?: StreamingCapabilities;\n\n /**\n * Protocols supported by this participant.\n * Used for protocol capability discovery.\n *\n * @example ['acp', 'mcp']\n */\n protocols?: string[];\n\n /**\n * ACP (Agent Client Protocol) capability details.\n * Only present if 'acp' is in the protocols array.\n */\n acp?: ACPCapability;\n\n _meta?: Meta;\n}\n\n/**\n * ACP capability advertisement.\n * Describes what ACP features an agent supports.\n */\nexport interface ACPCapability {\n /** ACP protocol version supported (e.g., '2024-10-07') */\n version: string;\n /** ACP features supported by this agent */\n features?: string[];\n _meta?: Meta;\n}\n\n/** A participant in the MAP protocol */\nexport interface Participant {\n id: ParticipantId;\n type: ParticipantType;\n name?: string;\n capabilities?: ParticipantCapabilities;\n transport?: TransportType;\n sessionId?: SessionId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Agent Types\n// =============================================================================\n\n/**\n * State of an agent.\n * Standard states are enumerated; custom states use 'x-' prefix.\n */\nexport type AgentState =\n | 'registered'\n | 'active'\n | 'busy'\n | 'idle'\n | 'suspended'\n | 'stopping'\n | 'stopped'\n | 'failed'\n | 'orphaned'\n | `x-${string}`;\n\n/** Type of relationship between agents */\nexport type AgentRelationshipType = 'peer' | 'supervisor' | 'supervised' | 'collaborator';\n\n/** A relationship between agents */\nexport interface AgentRelationship {\n type: AgentRelationshipType;\n agentId: AgentId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/** Lifecycle metadata for an agent */\nexport interface AgentLifecycle {\n createdAt?: Timestamp;\n startedAt?: Timestamp;\n stoppedAt?: Timestamp;\n lastActiveAt?: Timestamp;\n orphanedAt?: Timestamp;\n exitCode?: number;\n exitReason?: string;\n _meta?: Meta;\n}\n\n/** Who can see this agent */\nexport type AgentVisibility = 'public' | 'parent-only' | 'scope' | 'system';\n\n/** An agent in the multi-agent system */\nexport interface Agent {\n id: AgentId;\n\n /**\n * The participant that owns/controls this agent's connection.\n * Used for message routing and cleanup on disconnect.\n *\n * - Non-null: Agent is owned by the specified participant\n * - null: Agent is orphaned (owner disconnected with 'orphan' policy)\n */\n ownerId: ParticipantId | null;\n\n name?: string;\n description?: string;\n\n /** Parent agent ID (for spawned agents) */\n parent?: AgentId;\n\n /** Child agent IDs (populated when queried with include.children) */\n children?: AgentId[];\n\n relationships?: AgentRelationship[];\n state: AgentState;\n role?: string;\n scopes?: ScopeId[];\n\n /**\n * Simple visibility setting (legacy).\n * @deprecated Use permissionOverrides.canSee.agents for more granular control\n */\n visibility?: AgentVisibility;\n\n /**\n * Per-agent permission overrides.\n * Merged on top of role-based defaults from system configuration.\n * Only include fields that differ from the role default.\n *\n * @example\n * ```typescript\n * // Agent that accepts messages from clients (unlike role default)\n * permissionOverrides: {\n * acceptsFrom: { clients: 'all' }\n * }\n * ```\n */\n permissionOverrides?: Partial<AgentPermissions>;\n\n lifecycle?: AgentLifecycle;\n capabilities?: ParticipantCapabilities;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Check if an agent is orphaned (owner disconnected).\n * Orphaned agents have `ownerId === null`.\n */\nexport function isOrphanedAgent(agent: Agent): boolean {\n return agent.ownerId === null;\n}\n\n// =============================================================================\n// Agent Permission Types\n// =============================================================================\n\n/**\n * Rule for which agents this agent can see.\n * - 'all': Can see any agent in the system\n * - 'hierarchy': Can see parent, children, ancestors, descendants\n * - 'scoped': Can see agents in the same scopes\n * - 'direct': Can only see explicitly included agents\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentVisibilityRule =\n | 'all'\n | 'hierarchy'\n | 'scoped'\n | 'direct'\n | { include: AgentId[] };\n\n/**\n * Rule for which scopes this agent can see.\n * - 'all': Can see any scope\n * - 'member': Can only see scopes they're a member of\n * - { include: [...] }: Explicit allowlist of scope IDs\n */\nexport type ScopeVisibilityRule =\n | 'all'\n | 'member'\n | { include: ScopeId[] };\n\n/**\n * Rule for how much agent hierarchy structure this agent can see.\n * - 'full': Can see the full agent hierarchy tree\n * - 'local': Can see immediate parent and children only\n * - 'none': Cannot see hierarchy relationships\n */\nexport type StructureVisibilityRule = 'full' | 'local' | 'none';\n\n/**\n * Rule for which agents this agent can send messages to.\n * - 'all': Can message any agent\n * - 'hierarchy': Can message parent, children, ancestors, descendants\n * - 'scoped': Can message agents in the same scopes\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentMessagingRule =\n | 'all'\n | 'hierarchy'\n | 'scoped'\n | { include: AgentId[] };\n\n/**\n * Rule for which scopes this agent can send messages to.\n * - 'all': Can send to any scope\n * - 'member': Can only send to scopes they're a member of\n * - { include: [...] }: Explicit allowlist of scope IDs\n */\nexport type ScopeMessagingRule =\n | 'all'\n | 'member'\n | { include: ScopeId[] };\n\n/**\n * Rule for which agents this agent accepts messages from.\n * - 'all': Accepts from any agent\n * - 'hierarchy': Accepts from parent, children, ancestors, descendants\n * - 'scoped': Accepts from agents in the same scopes\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentAcceptanceRule =\n | 'all'\n | 'hierarchy'\n | 'scoped'\n | { include: AgentId[] };\n\n/**\n * Rule for which clients this agent accepts messages from.\n * - 'all': Accepts from any client\n * - 'none': Does not accept from any client\n * - { include: [...] }: Explicit allowlist of participant IDs\n */\nexport type ClientAcceptanceRule =\n | 'all'\n | 'none'\n | { include: ParticipantId[] };\n\n/**\n * Rule for which federated systems this agent accepts messages from.\n * - 'all': Accepts from any federated system\n * - 'none': Does not accept from any federated system\n * - { include: [...] }: Explicit allowlist of system IDs\n */\nexport type SystemAcceptanceRule =\n | 'all'\n | 'none'\n | { include: string[] };\n\n/**\n * Permission configuration for an agent.\n * Defines what the agent can see, who it can message, and who it accepts messages from.\n *\n * Used in two ways:\n * 1. As role-based defaults in system configuration\n * 2. As per-agent overrides via Agent.permissionOverrides\n *\n * @example\n * ```typescript\n * const workerPermissions: AgentPermissions = {\n * canSee: {\n * agents: 'hierarchy',\n * scopes: 'member',\n * structure: 'local',\n * },\n * canMessage: {\n * agents: 'hierarchy',\n * scopes: 'member',\n * },\n * acceptsFrom: {\n * agents: 'hierarchy',\n * clients: 'none',\n * systems: 'none',\n * },\n * };\n * ```\n */\nexport interface AgentPermissions {\n /** Rules for what this agent can see */\n canSee?: {\n /** Which agents this agent can see */\n agents?: AgentVisibilityRule;\n /** Which scopes this agent can see */\n scopes?: ScopeVisibilityRule;\n /** How much hierarchy structure this agent can see */\n structure?: StructureVisibilityRule;\n };\n /** Rules for who this agent can send messages to */\n canMessage?: {\n /** Which agents this agent can message */\n agents?: AgentMessagingRule;\n /** Which scopes this agent can send to */\n scopes?: ScopeMessagingRule;\n };\n /** Rules for who this agent accepts messages from */\n acceptsFrom?: {\n /** Which agents this agent accepts messages from */\n agents?: AgentAcceptanceRule;\n /** Which clients this agent accepts messages from */\n clients?: ClientAcceptanceRule;\n /** Which federated systems this agent accepts messages from */\n systems?: SystemAcceptanceRule;\n };\n}\n\n/**\n * System-level configuration for agent permissions.\n * Defines default permissions and role-based permission templates.\n *\n * Resolution order:\n * 1. Start with defaultPermissions\n * 2. If agent has a role, deep merge rolePermissions[role]\n * 3. Deep merge agent.permissionOverrides\n *\n * @example\n * ```typescript\n * const config: AgentPermissionConfig = {\n * defaultPermissions: {\n * canSee: { agents: 'hierarchy', scopes: 'member', structure: 'local' },\n * canMessage: { agents: 'hierarchy', scopes: 'member' },\n * acceptsFrom: { agents: 'hierarchy', clients: 'none', systems: 'none' },\n * },\n * rolePermissions: {\n * coordinator: {\n * canSee: { agents: 'all', scopes: 'all', structure: 'full' },\n * canMessage: { agents: 'all', scopes: 'all' },\n * acceptsFrom: { agents: 'all', clients: 'all', systems: 'none' },\n * },\n * },\n * };\n * ```\n */\nexport interface AgentPermissionConfig {\n /** Default permissions for agents without a role or role-specific config */\n defaultPermissions: AgentPermissions;\n /** Role-based permission templates */\n rolePermissions: Record<string, AgentPermissions>;\n}\n\n// =============================================================================\n// Addressing Types\n// =============================================================================\n\n/** Address a single agent directly */\nexport interface DirectAddress {\n agent: AgentId;\n}\n\n/** Address multiple agents */\nexport interface MultiAddress {\n agents: AgentId[];\n}\n\n/** Address all agents in a scope */\nexport interface ScopeAddress {\n scope: ScopeId;\n}\n\n/** Address agents by role, optionally within a scope */\nexport interface RoleAddress {\n role: string;\n within?: ScopeId;\n}\n\n/** Address relative to sender in hierarchy */\nexport interface HierarchicalAddress {\n parent?: true;\n children?: true;\n ancestors?: true;\n descendants?: true;\n siblings?: true;\n depth?: number;\n}\n\n/** Address all agents in the system */\nexport interface BroadcastAddress {\n broadcast: true;\n}\n\n/** Address the system/router itself */\nexport interface SystemAddress {\n system: true;\n}\n\n/** Address any participant by ID or category */\nexport interface ParticipantAddress {\n participant?: ParticipantId;\n participants?: 'all' | 'agents' | 'clients';\n}\n\n/** Address an agent in a federated system */\nexport interface FederatedAddress {\n system: string;\n agent: AgentId;\n}\n\n/** Flexible addressing for any topology */\nexport type Address =\n | string\n | DirectAddress\n | MultiAddress\n | ScopeAddress\n | RoleAddress\n | HierarchicalAddress\n | BroadcastAddress\n | SystemAddress\n | ParticipantAddress\n | FederatedAddress;\n\n// =============================================================================\n// Message Types\n// =============================================================================\n\n/** Message priority */\nexport type MessagePriority = 'urgent' | 'high' | 'normal' | 'low';\n\n/** Message delivery guarantees */\nexport type DeliverySemantics = 'fire-and-forget' | 'acknowledged' | 'guaranteed';\n\n/** Relationship context for the message */\nexport type MessageRelationship = 'parent-to-child' | 'child-to-parent' | 'peer' | 'broadcast';\n\n/** Metadata for a message */\nexport interface MessageMeta {\n timestamp?: Timestamp;\n relationship?: MessageRelationship;\n expectsResponse?: boolean;\n correlationId?: CorrelationId;\n isResult?: boolean;\n priority?: MessagePriority;\n delivery?: DeliverySemantics;\n ttlMs?: number;\n /**\n * Protocol identifier for tunneled protocols (e.g., 'acp').\n * Used to identify the protocol of the payload.\n */\n protocol?: string;\n /**\n * Mail turn tracking metadata.\n * When present on map/send, the server records a turn in the specified\n * conversation in addition to routing the message.\n */\n mail?: MailMessageMeta;\n _meta?: Meta;\n}\n\n/** A message in the multi-agent system */\nexport interface Message<T = unknown> {\n id: MessageId;\n from: ParticipantId;\n to: Address;\n timestamp: Timestamp;\n payload?: T;\n meta?: MessageMeta;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Scope Types\n// =============================================================================\n\n/** Policy for joining a scope */\nexport type JoinPolicy = 'open' | 'invite' | 'role' | 'system';\n\n/** Who can see the scope exists and its members */\nexport type ScopeVisibility = 'public' | 'members' | 'system';\n\n/** Who can see messages sent to this scope */\nexport type MessageVisibility = 'public' | 'members' | 'system';\n\n/** Who can send messages to this scope */\nexport type SendPolicy = 'members' | 'any';\n\n/** A scope for grouping agents */\nexport interface Scope {\n id: ScopeId;\n name?: string;\n description?: string;\n parent?: ScopeId;\n joinPolicy?: JoinPolicy;\n autoJoinRoles?: string[];\n visibility?: ScopeVisibility;\n messageVisibility?: MessageVisibility;\n sendPolicy?: SendPolicy;\n persistent?: boolean;\n autoDelete?: boolean;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Event Types\n// =============================================================================\n\n/**\n * Event type constants.\n * Use these instead of string literals for type safety and autocomplete.\n */\nexport const EVENT_TYPES = {\n // Agent lifecycle events\n AGENT_REGISTERED: 'agent_registered',\n AGENT_UNREGISTERED: 'agent_unregistered',\n AGENT_STATE_CHANGED: 'agent_state_changed',\n AGENT_ORPHANED: 'agent_orphaned',\n\n // Participant lifecycle events\n PARTICIPANT_CONNECTED: 'participant_connected',\n PARTICIPANT_DISCONNECTED: 'participant_disconnected',\n\n // Message events\n MESSAGE_SENT: 'message_sent',\n MESSAGE_DELIVERED: 'message_delivered',\n MESSAGE_FAILED: 'message_failed',\n\n // Scope events\n SCOPE_CREATED: 'scope_created',\n SCOPE_DELETED: 'scope_deleted',\n SCOPE_MEMBER_JOINED: 'scope_member_joined',\n SCOPE_MEMBER_LEFT: 'scope_member_left',\n\n // Permission events\n PERMISSIONS_CLIENT_UPDATED: 'permissions_client_updated',\n PERMISSIONS_AGENT_UPDATED: 'permissions_agent_updated',\n\n // System events\n SYSTEM_ERROR: 'system_error',\n\n // Federation events\n FEDERATION_CONNECTED: 'federation_connected',\n FEDERATION_DISCONNECTED: 'federation_disconnected',\n\n // Mail events\n MAIL_CREATED: 'mail.created',\n MAIL_CLOSED: 'mail.closed',\n MAIL_PARTICIPANT_JOINED: 'mail.participant.joined',\n MAIL_PARTICIPANT_LEFT: 'mail.participant.left',\n MAIL_TURN_ADDED: 'mail.turn.added',\n MAIL_TURN_UPDATED: 'mail.turn.updated',\n MAIL_THREAD_CREATED: 'mail.thread.created',\n MAIL_SUMMARY_GENERATED: 'mail.summary.generated',\n} as const;\n\n/** Type of system event (derived from EVENT_TYPES) */\nexport type EventType = (typeof EVENT_TYPES)[keyof typeof EVENT_TYPES];\n\n/**\n * Input for creating events.\n * id and timestamp are optional - server generates them.\n */\nexport interface EventInput {\n type: EventType;\n timestamp?: Timestamp;\n source?: ParticipantId;\n data?: Record<string, unknown>;\n causedBy?: string[];\n _meta?: Meta;\n}\n\n/**\n * Wire event as sent to clients.\n * id and timestamp are always present.\n */\nexport interface Event {\n id: string;\n type: EventType;\n timestamp: Timestamp;\n source?: ParticipantId;\n data?: Record<string, unknown>;\n causedBy?: string[];\n _meta?: Meta;\n}\n\n/** Helper to create events with auto-generated id and timestamp */\nexport function createEvent(input: EventInput): Event {\n return {\n id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: input.timestamp ?? Date.now(),\n type: input.type,\n source: input.source,\n data: input.data,\n causedBy: input.causedBy,\n _meta: input._meta,\n };\n}\n\n// =============================================================================\n// Subscription Types\n// =============================================================================\n\n/**\n * Filter for event subscriptions.\n *\n * ## Combination Logic\n *\n * All specified fields are combined with **AND** logic:\n * - An event must match ALL specified criteria to be delivered\n * - Within array fields, values are combined with **OR** logic\n * - Empty arrays (`[]`) are treated as \"no filter\" (matches any)\n * - Undefined/omitted fields are treated as \"no filter\" (matches any)\n *\n * ## Examples\n *\n * ```typescript\n * // Match agent_registered OR agent_unregistered events from agent-1 OR agent-2\n * {\n * eventTypes: ['agent_registered', 'agent_unregistered'],\n * fromAgents: ['agent-1', 'agent-2']\n * }\n *\n * // Match any event from agents with role 'worker' OR 'supervisor'\n * { fromRoles: ['worker', 'supervisor'] }\n *\n * // Match scope events in scope-1 with metadata containing priority='high'\n * {\n * scopes: ['scope-1'],\n * metadataMatch: { priority: 'high' }\n * }\n * ```\n *\n * ## Field Semantics\n *\n * | Field | Within-field | Cross-field | Description |\n * |-------|--------------|-------------|-------------|\n * | `eventTypes` | OR | AND | Event type is one of the listed types |\n * | `fromAgents` | OR | AND | Event source is one of the listed agents |\n * | `fromRoles` | OR | AND | Event source agent has one of the listed roles |\n * | `roles` | OR | AND | Event relates to agents with one of the listed roles |\n * | `scopes` | OR | AND | Event relates to one of the listed scopes |\n * | `priorities` | OR | AND | Message priority is one of the listed levels |\n * | `correlationIds` | OR | AND | Event has one of the listed correlation IDs |\n * | `metadataMatch` | AND | AND | Event metadata contains ALL specified key-value pairs |\n */\nexport interface SubscriptionFilter {\n /**\n * Filter by roles the event relates to.\n * Matches events where the related agent has one of these roles.\n */\n roles?: string[];\n\n /**\n * Filter by scopes the event relates to.\n * Matches events with scopeId in event.data matching one of these.\n */\n scopes?: ScopeId[];\n\n /**\n * Filter by event type.\n * Use EVENT_TYPES constants: `eventTypes: [EVENT_TYPES.AGENT_REGISTERED]`\n */\n eventTypes?: EventType[];\n\n /**\n * Filter by message priority (for message events).\n */\n priorities?: MessagePriority[];\n\n /**\n * Filter by correlation ID.\n * Matches events with correlationId in event.data matching one of these.\n */\n correlationIds?: CorrelationId[];\n\n /**\n * Filter by source agent ID.\n * Matches events where event.source is one of these agent IDs.\n */\n fromAgents?: AgentId[];\n\n /**\n * Filter by source agent role.\n * Matches events where the source agent has one of these roles.\n */\n fromRoles?: string[];\n\n /**\n * Filter by metadata key-value pairs.\n * All specified pairs must match (AND logic within this field).\n * Checks event.data.metadata for matching values.\n */\n metadataMatch?: Record<string, unknown>;\n\n /**\n * Mail-specific filter for conversation events.\n * Matches mail events related to a specific conversation, thread,\n * participant, or content type.\n */\n mail?: MailSubscriptionFilter;\n\n _meta?: Meta;\n}\n\n/** Options for subscriptions */\nexport interface SubscriptionOptions {\n /** Include full payloads in message events (default: false) */\n includeMessagePayloads?: boolean;\n /** Exclude events from own actions (default: false) */\n excludeOwnEvents?: boolean;\n}\n\n/** An active event subscription */\nexport interface Subscription {\n id: SubscriptionId;\n filter?: SubscriptionFilter;\n options?: SubscriptionOptions;\n createdAt?: Timestamp;\n replayFrom?: Timestamp | string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Subscription Backpressure Types\n// =============================================================================\n\n/**\n * State of a subscription's event delivery.\n * - 'active': Events are being delivered normally\n * - 'paused': Events are buffered but not delivered to the iterator\n * - 'closed': Subscription is terminated\n */\nexport type SubscriptionState = 'active' | 'paused' | 'closed';\n\n/**\n * Information about events dropped due to buffer overflow.\n * Passed to overflow handlers when events cannot be buffered.\n */\nexport interface OverflowInfo {\n /** Number of events dropped in this overflow batch */\n eventsDropped: number;\n /** Event ID of oldest dropped event (if available) */\n oldestDroppedId?: string;\n /** Event ID of newest dropped event (if available) */\n newestDroppedId?: string;\n /** Timestamp when overflow occurred */\n timestamp: Timestamp;\n /** Total events dropped since subscription started */\n totalDropped: number;\n}\n\n/** Handler called when subscription buffer overflows */\nexport type OverflowHandler = (info: OverflowInfo) => void;\n\n/**\n * Parameters for acknowledging received events.\n * Sent as a notification to inform the server of client progress.\n * Enables optional server-side flow control.\n */\nexport interface SubscriptionAckParams {\n /** Subscription being acknowledged */\n subscriptionId: SubscriptionId;\n /** Acknowledge all events up to and including this sequence number */\n upToSequence: number;\n _meta?: Meta;\n}\n\n/** Notification for subscription acknowledgment */\nexport interface SubscriptionAckNotification extends MAPNotificationBase<SubscriptionAckParams> {\n method: 'map/subscribe.ack';\n params: SubscriptionAckParams;\n}\n\n// =============================================================================\n// Message Event Data Types\n// =============================================================================\n\n/** Data for message_sent events (no payload for privacy) */\nexport interface MessageSentEventData {\n messageId: MessageId;\n from: ParticipantId;\n to: Address;\n timestamp: Timestamp;\n correlationId?: CorrelationId;\n priority?: MessagePriority;\n}\n\n/** Data for message_delivered events (no payload for privacy) */\nexport interface MessageDeliveredEventData {\n messageId: MessageId;\n from: ParticipantId;\n deliveredTo: ParticipantId[];\n timestamp: Timestamp;\n correlationId?: CorrelationId;\n}\n\n/** Data for message_failed events */\nexport interface MessageFailedEventData {\n messageId: MessageId;\n from: ParticipantId;\n to: Address;\n reason: string;\n code?: number;\n}\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/** Category of error for handling decisions */\nexport type ErrorCategory =\n | 'protocol'\n | 'auth'\n | 'routing'\n | 'agent'\n | 'resource'\n | 'federation'\n | 'mail'\n | 'internal';\n\n/** Structured error data */\nexport interface MAPErrorData {\n category?: ErrorCategory;\n retryable?: boolean;\n retryAfterMs?: number;\n details?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/** JSON-RPC 2.0 error object */\nexport interface MAPError {\n code: number;\n message: string;\n data?: MAPErrorData;\n}\n\n// =============================================================================\n// JSON-RPC Base Types\n// =============================================================================\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = '2.0' as const;\n\n/** Base JSON-RPC request */\nexport interface MAPRequestBase<TParams = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/** Base JSON-RPC response (success) */\nexport interface MAPResponseSuccess<T = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n result: T;\n}\n\n/** Base JSON-RPC response (error) */\nexport interface MAPResponseError {\n jsonrpc: '2.0';\n id: RequestId;\n error: MAPError;\n}\n\n/** JSON-RPC response (success or error) */\nexport type MAPResponse<T = unknown> = MAPResponseSuccess<T> | MAPResponseError;\n\n/** Base JSON-RPC notification */\nexport interface MAPNotificationBase<TParams = unknown> {\n jsonrpc: '2.0';\n method: string;\n params?: TParams;\n}\n\n// =============================================================================\n// Session Types\n// =============================================================================\n\nexport interface SessionInfo {\n id: SessionId;\n createdAt: Timestamp;\n lastActiveAt?: Timestamp;\n closedAt?: Timestamp;\n}\n\n// =============================================================================\n// Authentication Types\n// =============================================================================\n\n/** Standard authentication methods defined by the protocol */\nexport type StandardAuthMethod = 'bearer' | 'api-key' | 'mtls' | 'none';\n\n/** Authentication method - standard or custom (x- prefixed) */\nexport type AuthMethod = StandardAuthMethod | `x-${string}`;\n\n/** Authentication error codes */\nexport type AuthErrorCode =\n | 'invalid_credentials'\n | 'expired'\n | 'insufficient_scope'\n | 'method_not_supported'\n | 'auth_required';\n\n/**\n * Client-provided authentication credentials.\n * Used in connect requests and authenticate calls.\n */\nexport interface AuthCredentials {\n /** The authentication method being used */\n method: AuthMethod;\n /** The credential value (token, API key, etc.) */\n credential?: string;\n /** Method-specific additional data */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Server-advertised authentication capabilities.\n * Included in connect response when auth is required.\n */\nexport interface ServerAuthCapabilities {\n /** Supported authentication methods (in preference order) */\n methods: AuthMethod[];\n /** Is authentication required to proceed? */\n required: boolean;\n /** OAuth2 authorization server metadata URL (RFC 8414) */\n oauth2MetadataUrl?: string;\n /** JWKS URL for local JWT verification (RFC 7517) */\n jwksUrl?: string;\n /** Realm identifier for this server */\n realm?: string;\n}\n\n/**\n * Authenticated principal information.\n * Returned after successful authentication.\n */\nexport interface AuthPrincipal {\n /** Unique identifier for this principal */\n id: string;\n /** Token issuer (for federated auth) */\n issuer?: string;\n /** Additional claims from the credential */\n claims?: Record<string, unknown>;\n /** Token expiration timestamp (Unix ms) - from JWT exp claim */\n expiresAt?: number;\n}\n\n/**\n * Authentication error details.\n */\nexport interface AuthError {\n /** Error code */\n code: AuthErrorCode;\n /** Human-readable error message */\n message: string;\n}\n\n/**\n * Result of an authentication attempt.\n */\nexport interface AuthResult {\n /** Whether authentication succeeded */\n success: boolean;\n /** Authenticated principal (if success) */\n principal?: AuthPrincipal;\n /** Error details (if failure) */\n error?: AuthError;\n}\n\n/**\n * Authentication for federated connections.\n */\nexport interface FederationAuth {\n method: 'bearer' | 'api-key' | 'mtls';\n credentials?: string;\n}\n\n// =============================================================================\n// Connect Types\n// =============================================================================\n\n/** Policy for handling unexpected disconnection */\nexport interface DisconnectPolicy {\n /** What happens to agents on disconnect */\n agentBehavior: 'unregister' | 'orphan' | 'grace-period';\n /** Grace period before unregistering (ms) */\n gracePeriodMs?: number;\n /** Emit events to subscribers */\n notifySubscribers?: boolean;\n}\n\nexport interface ConnectRequestParams {\n protocolVersion: ProtocolVersion;\n participantType: ParticipantType;\n participantId?: ParticipantId;\n name?: string;\n capabilities?: ParticipantCapabilities;\n sessionId?: SessionId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n /** Reclaim orphaned agents from previous connection */\n reclaimAgents?: AgentId[];\n /** Policy for unexpected disconnect */\n disconnectPolicy?: DisconnectPolicy;\n /** Authentication credentials */\n auth?: AuthCredentials;\n _meta?: Meta;\n}\n\nexport interface ConnectRequest extends MAPRequestBase<ConnectRequestParams> {\n method: 'map/connect';\n params: ConnectRequestParams;\n}\n\nexport interface ConnectResponseResult {\n protocolVersion: ProtocolVersion;\n sessionId: SessionId;\n participantId: ParticipantId;\n capabilities: ParticipantCapabilities;\n systemInfo?: {\n name?: string;\n version?: string;\n };\n /** Is this a reconnection? */\n reconnected?: boolean;\n /** Reclaimed agents */\n reclaimedAgents?: Agent[];\n /** Currently owned agents */\n ownedAgents?: AgentId[];\n /** Authenticated principal (if auth succeeded) */\n principal?: AuthPrincipal;\n /** Auth required but not provided - client should authenticate */\n authRequired?: ServerAuthCapabilities;\n /** Token to resume this session later */\n resumeToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Disconnect Types\n// =============================================================================\n\nexport interface DisconnectRequestParams {\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface DisconnectRequest extends MAPRequestBase<DisconnectRequestParams> {\n method: 'map/disconnect';\n params?: DisconnectRequestParams;\n}\n\nexport interface DisconnectResponseResult {\n session: SessionInfo;\n /** Token to resume this session later */\n resumeToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Session Request/Response Types\n// =============================================================================\n\nexport interface SessionListRequestParams {\n _meta?: Meta;\n}\n\nexport interface SessionListRequest extends MAPRequestBase<SessionListRequestParams> {\n method: 'map/session/list';\n params?: SessionListRequestParams;\n}\n\nexport interface SessionListResponseResult {\n sessions: SessionInfo[];\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequestParams {\n sessionId: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequest extends MAPRequestBase<SessionLoadRequestParams> {\n method: 'map/session/load';\n params: SessionLoadRequestParams;\n}\n\nexport interface SessionLoadResponseResult {\n sessionId: SessionId;\n restored: boolean;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequestParams {\n sessionId?: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequest extends MAPRequestBase<SessionCloseRequestParams> {\n method: 'map/session/close';\n params?: SessionCloseRequestParams;\n}\n\nexport interface SessionCloseResponseResult {\n session: SessionInfo;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Agents Request/Response Types\n// =============================================================================\n\nexport interface AgentsListFilter {\n states?: AgentState[];\n roles?: string[];\n scopes?: ScopeId[];\n parent?: AgentId;\n hasChildren?: boolean;\n ownerId?: ParticipantId;\n}\n\nexport interface AgentsListRequestParams {\n filter?: AgentsListFilter;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsListRequest extends MAPRequestBase<AgentsListRequestParams> {\n method: 'map/agents/list';\n params?: AgentsListRequestParams;\n}\n\nexport interface AgentsListResponseResult {\n agents: Agent[];\n nextCursor?: string;\n _meta?: Meta;\n}\n\n/** Options for expanding related agents */\nexport interface AgentIncludeOptions {\n parent?: boolean;\n children?: boolean;\n siblings?: boolean;\n ancestors?: boolean;\n descendants?: boolean;\n maxDepth?: number;\n}\n\nexport interface AgentsGetRequestParams {\n agentId: AgentId;\n include?: AgentIncludeOptions;\n _meta?: Meta;\n}\n\nexport interface AgentsGetRequest extends MAPRequestBase<AgentsGetRequestParams> {\n method: 'map/agents/get';\n params: AgentsGetRequestParams;\n}\n\nexport interface AgentsGetResponseResult {\n agent: Agent;\n parent?: Agent;\n children?: Agent[];\n siblings?: Agent[];\n ancestors?: Agent[];\n descendants?: Agent[];\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n metadata?: Record<string, unknown>;\n /** Permission overrides merged on top of role-based defaults */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequest extends MAPRequestBase<AgentsRegisterRequestParams> {\n method: 'map/agents/register';\n params?: AgentsRegisterRequestParams;\n}\n\nexport interface AgentsRegisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequest extends MAPRequestBase<AgentsUnregisterRequestParams> {\n method: 'map/agents/unregister';\n params: AgentsUnregisterRequestParams;\n}\n\nexport interface AgentsUnregisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequestParams {\n agentId: AgentId;\n state?: AgentState;\n metadata?: Record<string, unknown>;\n /**\n * Permission overrides to apply to the agent.\n * Merged on top of role-based defaults.\n */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequest extends MAPRequestBase<AgentsUpdateRequestParams> {\n method: 'map/agents/update';\n params: AgentsUpdateRequestParams;\n}\n\nexport interface AgentsUpdateResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n initialMessage?: Message;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequest extends MAPRequestBase<AgentsSpawnRequestParams> {\n method: 'map/agents/spawn';\n params?: AgentsSpawnRequestParams;\n}\n\nexport interface AgentsSpawnResponseResult {\n agent: Agent;\n messageId?: MessageId;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequestParams {\n agentId: AgentId;\n reason?: string;\n force?: boolean;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequest extends MAPRequestBase<AgentsStopRequestParams> {\n method: 'map/agents/stop';\n params: AgentsStopRequestParams;\n}\n\nexport interface AgentsStopResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequest extends MAPRequestBase<AgentsSuspendRequestParams> {\n method: 'map/agents/suspend';\n params: AgentsSuspendRequestParams;\n}\n\nexport interface AgentsSuspendResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequestParams {\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequest extends MAPRequestBase<AgentsResumeRequestParams> {\n method: 'map/agents/resume';\n params: AgentsResumeRequestParams;\n}\n\nexport interface AgentsResumeResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Send Types\n// =============================================================================\n\nexport interface SendRequestParams {\n to: Address;\n payload?: unknown;\n meta?: MessageMeta;\n _meta?: Meta;\n}\n\nexport interface SendRequest extends MAPRequestBase<SendRequestParams> {\n method: 'map/send';\n params: SendRequestParams;\n}\n\nexport interface SendResponseResult {\n messageId: MessageId;\n delivered?: ParticipantId[];\n _meta?: Meta;\n}\n\n// =============================================================================\n// Subscribe Types\n// =============================================================================\n\nexport interface SubscribeRequestParams {\n filter?: SubscriptionFilter;\n options?: SubscriptionOptions;\n replayFrom?: Timestamp | string;\n _meta?: Meta;\n}\n\nexport interface SubscribeRequest extends MAPRequestBase<SubscribeRequestParams> {\n method: 'map/subscribe';\n params?: SubscribeRequestParams;\n}\n\nexport interface SubscribeResponseResult {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequestParams {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequest extends MAPRequestBase<UnsubscribeRequestParams> {\n method: 'map/unsubscribe';\n params: UnsubscribeRequestParams;\n}\n\nexport interface UnsubscribeResponseResult {\n subscription: {\n id: SubscriptionId;\n closedAt: Timestamp;\n };\n _meta?: Meta;\n}\n\n// =============================================================================\n// Replay Types\n// =============================================================================\n\n/**\n * A replayed event with its envelope metadata.\n */\nexport interface ReplayedEvent {\n /** Globally unique event ID (ULID format) */\n eventId: string;\n /** Server timestamp when event was originally processed */\n timestamp: Timestamp;\n /** Event IDs that causally precede this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n}\n\n/**\n * Parameters for replaying historical events.\n *\n * Uses keyset pagination with `afterEventId` - pass the last eventId\n * from the previous response to get the next page of results.\n *\n * @example\n * ```typescript\n * // Replay from a specific point\n * const page1 = await client.replay({ limit: 100 });\n * const page2 = await client.replay({\n * afterEventId: page1.events.at(-1)?.eventId,\n * limit: 100\n * });\n * ```\n */\nexport interface ReplayRequestParams {\n /**\n * Start after this eventId (exclusive).\n * Used for keyset pagination - pass the last eventId from previous response.\n */\n afterEventId?: string;\n\n /**\n * Alternative: start from this timestamp (inclusive).\n * If both afterEventId and fromTimestamp are provided, afterEventId takes precedence.\n */\n fromTimestamp?: Timestamp;\n\n /**\n * End at this timestamp (inclusive).\n * If not provided, replays up to the most recent event.\n */\n toTimestamp?: Timestamp;\n\n /**\n * Filter events (same as subscription filter).\n */\n filter?: SubscriptionFilter;\n\n /**\n * Maximum number of events to return.\n * Default: 100, Maximum: 1000\n */\n limit?: number;\n\n _meta?: Meta;\n}\n\nexport interface ReplayRequest extends MAPRequestBase<ReplayRequestParams> {\n method: 'map/replay';\n params?: ReplayRequestParams;\n}\n\nexport interface ReplayResponseResult {\n /** Replayed events in chronological order */\n events: ReplayedEvent[];\n\n /** Whether more events exist after the last returned event */\n hasMore: boolean;\n\n /**\n * Total count of matching events (if known).\n * May be omitted for performance reasons on large result sets.\n */\n totalCount?: number;\n\n _meta?: Meta;\n}\n\n// =============================================================================\n// Auth Types\n// =============================================================================\n\nexport interface AuthRefreshRequestParams {\n refreshToken: string;\n _meta?: Meta;\n}\n\nexport interface AuthRefreshRequest extends MAPRequestBase<AuthRefreshRequestParams> {\n method: 'map/auth/refresh';\n params: AuthRefreshRequestParams;\n}\n\nexport interface AuthRefreshResponseResult {\n accessToken: string;\n expiresAt: Timestamp;\n refreshToken?: string;\n _meta?: Meta;\n}\n\n/**\n * Parameters for map/authenticate request.\n * Used when auth negotiation is required after initial connect.\n */\nexport interface AuthenticateRequestParams {\n /** The authentication method being used */\n method: AuthMethod;\n /** The credential value (token, API key, etc.) */\n credential?: string;\n /** Method-specific additional data */\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface AuthenticateRequest extends MAPRequestBase<AuthenticateRequestParams> {\n method: 'map/authenticate';\n params: AuthenticateRequestParams;\n}\n\n/**\n * Response from map/authenticate request.\n */\nexport interface AuthenticateResponseResult {\n /** Whether authentication succeeded */\n success: boolean;\n /** Session ID (if auth succeeded) */\n sessionId?: SessionId;\n /** Participant ID (if auth succeeded) */\n participantId?: ParticipantId;\n /** Authenticated principal (if auth succeeded) */\n principal?: AuthPrincipal;\n /** Error details (if auth failed) */\n error?: AuthError;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Scope Types\n// =============================================================================\n\nexport interface ScopesListRequestParams {\n parent?: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesListRequest extends MAPRequestBase<ScopesListRequestParams> {\n method: 'map/scopes/list';\n params?: ScopesListRequestParams;\n}\n\nexport interface ScopesListResponseResult {\n scopes: Scope[];\n _meta?: Meta;\n}\n\nexport interface ScopesGetRequestParams {\n scopeId: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesGetRequest extends MAPRequestBase<ScopesGetRequestParams> {\n method: 'map/scopes/get';\n params: ScopesGetRequestParams;\n}\n\nexport interface ScopesGetResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesCreateRequestParams {\n scopeId?: ScopeId;\n name?: string;\n description?: string;\n parent?: ScopeId;\n joinPolicy?: JoinPolicy;\n autoJoinRoles?: string[];\n visibility?: ScopeVisibility;\n messageVisibility?: MessageVisibility;\n sendPolicy?: SendPolicy;\n persistent?: boolean;\n autoDelete?: boolean;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface ScopesCreateRequest extends MAPRequestBase<ScopesCreateRequestParams> {\n method: 'map/scopes/create';\n params?: ScopesCreateRequestParams;\n}\n\nexport interface ScopesCreateResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesDeleteRequestParams {\n scopeId: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesDeleteRequest extends MAPRequestBase<ScopesDeleteRequestParams> {\n method: 'map/scopes/delete';\n params: ScopesDeleteRequestParams;\n}\n\nexport interface ScopesDeleteResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesJoinRequestParams {\n scopeId: ScopeId;\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface ScopesJoinRequest extends MAPRequestBase<ScopesJoinRequestParams> {\n method: 'map/scopes/join';\n params: ScopesJoinRequestParams;\n}\n\nexport interface ScopesJoinResponseResult {\n scope: Scope;\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface ScopesLeaveRequestParams {\n scopeId: ScopeId;\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface ScopesLeaveRequest extends MAPRequestBase<ScopesLeaveRequestParams> {\n method: 'map/scopes/leave';\n params: ScopesLeaveRequestParams;\n}\n\nexport interface ScopesLeaveResponseResult {\n scope: Scope;\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface ScopesMembersRequestParams {\n scopeId: ScopeId;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface ScopesMembersRequest extends MAPRequestBase<ScopesMembersRequestParams> {\n method: 'map/scopes/members';\n params: ScopesMembersRequestParams;\n}\n\nexport interface ScopesMembersResponseResult {\n members: AgentId[];\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Structure Graph Types\n// =============================================================================\n\nexport interface StructureGraphRequestParams {\n rootAgentId?: AgentId;\n depth?: number;\n includeRelationships?: boolean;\n _meta?: Meta;\n}\n\nexport interface StructureGraphRequest extends MAPRequestBase<StructureGraphRequestParams> {\n method: 'map/structure/graph';\n params?: StructureGraphRequestParams;\n}\n\nexport interface GraphEdge {\n from: AgentId;\n to: AgentId;\n type: 'parent-child' | 'peer' | 'supervisor' | 'collaborator';\n}\n\nexport interface StructureGraphResponseResult {\n nodes: Agent[];\n edges: GraphEdge[];\n _meta?: Meta;\n}\n\n// =============================================================================\n// Inject Types\n// =============================================================================\n\nexport type InjectDelivery = 'interrupt' | 'queue' | 'best-effort';\nexport type InjectDeliveryResult = 'interrupt' | 'queue' | 'message';\n\nexport interface InjectRequestParams {\n agentId: AgentId;\n content: unknown;\n delivery?: InjectDelivery;\n _meta?: Meta;\n}\n\nexport interface InjectRequest extends MAPRequestBase<InjectRequestParams> {\n method: 'map/inject';\n params: InjectRequestParams;\n}\n\nexport interface InjectResponseResult {\n injected: boolean;\n delivery?: InjectDeliveryResult;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Permission Update Types\n// =============================================================================\n\n/**\n * Parameters for updating client permissions.\n * Only system/admin participants can update client permissions.\n */\nexport interface PermissionsUpdateRequestParams {\n /** Client to update permissions for */\n clientId: ParticipantId;\n /** Partial permissions to merge with existing */\n permissions: Partial<ParticipantCapabilities>;\n _meta?: Meta;\n}\n\nexport interface PermissionsUpdateRequest extends MAPRequestBase<PermissionsUpdateRequestParams> {\n method: 'map/permissions/update';\n params: PermissionsUpdateRequestParams;\n}\n\nexport interface PermissionsUpdateResponseResult {\n /** Whether update was applied */\n success: boolean;\n /** Effective permissions after update */\n effectivePermissions: ParticipantCapabilities;\n _meta?: Meta;\n}\n\n/**\n * Event data for permissions_client_updated events.\n * Emitted when a client's permissions are changed.\n */\nexport interface PermissionsClientUpdatedEventData {\n /** Client whose permissions changed */\n clientId: ParticipantId;\n /** The permission changes that were applied */\n changes: Partial<ParticipantCapabilities>;\n /** Effective permissions after the update */\n effectivePermissions: ParticipantCapabilities;\n /** Participant who made the change */\n updatedBy: ParticipantId;\n}\n\n/**\n * Event data for permissions_agent_updated events.\n * Emitted when an agent's permission overrides are changed.\n */\nexport interface PermissionsAgentUpdatedEventData {\n /** Agent whose permissions changed */\n agentId: AgentId;\n /** The permission changes that were applied */\n changes: Partial<AgentPermissions>;\n /** Effective permissions after the update */\n effectivePermissions: AgentPermissions;\n /** Participant who made the change */\n updatedBy: ParticipantId;\n}\n\n// =============================================================================\n// Federation Types\n// =============================================================================\n\n/**\n * Metadata for federation routing and tracking.\n * Included in every message routed between federated systems.\n */\nexport interface FederationMetadata {\n /** System that originated this message */\n sourceSystem: string;\n /** Intended final destination system */\n targetSystem: string;\n /** Number of systems this message has traversed */\n hopCount: number;\n /** Maximum hops before rejection (prevents infinite loops) */\n maxHops?: number;\n /** Systems this message has traversed (for debugging/loop detection) */\n path?: string[];\n /** Timestamp when message was first sent (ms since epoch) */\n originTimestamp: Timestamp;\n /** Correlation ID for cross-system tracing */\n correlationId?: string;\n /**\n * Signature for integrity verification.\n * @todo Define signing algorithm and key management\n */\n signature?: string;\n}\n\n/**\n * Envelope for messages routed between federated systems.\n * Wraps the payload with routing metadata for tracking and loop prevention.\n *\n * @typeParam T - The payload type (typically Message)\n *\n * @example\n * ```typescript\n * const envelope: FederationEnvelope<Message> = {\n * payload: message,\n * federation: {\n * sourceSystem: 'alpha',\n * targetSystem: 'beta',\n * hopCount: 0,\n * originTimestamp: Date.now(),\n * },\n * };\n * ```\n */\nexport interface FederationEnvelope<T = unknown> {\n /** The payload being routed */\n payload: T;\n /** Federation routing metadata */\n federation: FederationMetadata;\n}\n\n/**\n * Configuration for federation routing behavior.\n * Used by gateways to control message routing policies.\n */\nexport interface FederationRoutingConfig {\n /** This system's identifier */\n systemId: string;\n /** Maximum hops to accept (default: 10) */\n maxHops?: number;\n /** Whether to track full path for debugging (default: false) */\n trackPath?: boolean;\n /** Systems we're willing to route to (undefined = all) */\n allowedTargets?: string[];\n /** Systems we accept routes from (undefined = all) */\n allowedSources?: string[];\n}\n\n// =============================================================================\n// Federation Reconnection Types\n// =============================================================================\n\n/**\n * Configuration for buffering messages during federation outages.\n * Messages are stored locally until the peer reconnects.\n */\nexport interface FederationBufferConfig {\n /** Enable buffering of messages during disconnection (default: true) */\n enabled?: boolean;\n /** Maximum number of messages to buffer per peer (default: 1000) */\n maxMessages?: number;\n /** Maximum buffer size in bytes per peer (default: 10MB) */\n maxBytes?: number;\n /** Time to retain buffered messages in ms (default: 1 hour) */\n retentionMs?: number;\n /** Strategy when buffer is full */\n overflowStrategy?: 'drop-oldest' | 'drop-newest' | 'reject';\n}\n\n/**\n * Configuration for replaying events from event store on reconnection.\n * Supplements buffer with persisted events.\n */\nexport interface FederationReplayConfig {\n /** Enable replay from event store on reconnection (default: true) */\n enabled?: boolean;\n /** Maximum time window for replay in ms (default: 1 hour) */\n maxReplayWindowMs?: number;\n /** Maximum number of events to replay (default: 10000) */\n maxReplayEvents?: number;\n /** Filter for events to replay (optional) */\n filter?: SubscriptionFilter;\n}\n\n/**\n * Type of gateway reconnection event.\n */\nexport type GatewayReconnectionEventType =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'reconnecting'\n | 'reconnect_failed'\n | 'buffer_overflow'\n | 'replay_started'\n | 'replay_completed';\n\n/**\n * Event emitted during gateway reconnection lifecycle.\n */\nexport interface GatewayReconnectionEvent {\n /** Type of reconnection event */\n type: GatewayReconnectionEventType;\n /** Target system ID */\n systemId: string;\n /** Timestamp of the event */\n timestamp: Timestamp;\n /** Current reconnection attempt (for reconnecting events) */\n attempt?: number;\n /** Error message (for disconnected/reconnect_failed) */\n error?: string;\n /** Number of buffered messages (for buffer_overflow) */\n bufferedCount?: number;\n /** Number of events being replayed (for replay_started/completed) */\n replayCount?: number;\n /** Duration of outage in ms (for connected after reconnect) */\n outageDurationMs?: number;\n}\n\n/** Handler for gateway reconnection events */\nexport type GatewayReconnectionEventHandler = (event: GatewayReconnectionEvent) => void;\n\n/**\n * Options for gateway connection with reconnection support.\n * Extends base connection options with federation-specific settings.\n */\nexport interface GatewayReconnectionOptions {\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Initial delay before first reconnection attempt in ms (default: 1000) */\n initialDelayMs?: number;\n /** Maximum delay between reconnection attempts in ms (default: 30000) */\n maxDelayMs?: number;\n /** Backoff multiplier for exponential backoff (default: 2) */\n backoffMultiplier?: number;\n /** Maximum number of reconnection attempts (default: Infinity) */\n maxRetries?: number;\n /** Add random jitter to delays (default: true) */\n jitter?: boolean;\n /** Buffer configuration for outages */\n buffer?: FederationBufferConfig;\n /** Replay configuration for event store recovery */\n replay?: FederationReplayConfig;\n /** Handler for reconnection lifecycle events */\n onReconnectionEvent?: GatewayReconnectionEventHandler;\n}\n\nexport interface FederationConnectRequestParams {\n systemId: string;\n endpoint: string;\n auth?: FederationAuth;\n _meta?: Meta;\n}\n\nexport interface FederationConnectRequest extends MAPRequestBase<FederationConnectRequestParams> {\n method: 'map/federation/connect';\n params: FederationConnectRequestParams;\n}\n\nexport interface FederationConnectResponseResult {\n connected: boolean;\n systemInfo?: {\n name?: string;\n version?: string;\n capabilities?: ParticipantCapabilities;\n };\n _meta?: Meta;\n}\n\nexport interface FederationRouteRequestParams {\n /** Target system ID (for immediate next hop) */\n systemId: string;\n /**\n * Wrapped message with federation metadata.\n * Use this for new implementations.\n */\n envelope?: FederationEnvelope<Message>;\n /**\n * Raw message (legacy format).\n * @deprecated Use envelope instead for proper routing metadata\n */\n message?: Message;\n _meta?: Meta;\n}\n\nexport interface FederationRouteRequest extends MAPRequestBase<FederationRouteRequestParams> {\n method: 'map/federation/route';\n params: FederationRouteRequestParams;\n}\n\nexport interface FederationRouteResponseResult {\n routed: boolean;\n messageId?: MessageId;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Mail Types - Conversation, Turn, and Thread types\n// =============================================================================\n\n/**\n * Type of conversation.\n */\nexport type ConversationType =\n | 'user-session'\n | 'agent-task'\n | 'multi-agent'\n | 'mixed';\n\n/**\n * Status of a conversation.\n */\nexport type ConversationStatus =\n | 'active'\n | 'paused'\n | 'completed'\n | 'failed'\n | 'archived';\n\n/**\n * A conversation - a container for tracking related interactions.\n */\nexport interface Conversation {\n id: ConversationId;\n type: ConversationType;\n status: ConversationStatus;\n subject?: string;\n participantCount: number;\n parentConversationId?: ConversationId;\n parentTurnId?: TurnId;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n closedAt?: Timestamp;\n createdBy: ParticipantId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Role of a participant within a conversation.\n */\nexport type ParticipantRole =\n | 'initiator'\n | 'assistant'\n | 'worker'\n | 'observer'\n | 'moderator';\n\n/**\n * Permissions for a participant within a conversation.\n */\nexport interface ConversationPermissions {\n canSend: boolean;\n canObserve: boolean;\n canInvite: boolean;\n canRemove: boolean;\n canCreateThreads: boolean;\n historyAccess: 'none' | 'from-join' | 'full';\n canSeeInternal: boolean;\n _meta?: Meta;\n}\n\n/**\n * A participant in a conversation with role and permissions.\n */\nexport interface ConversationParticipant {\n id: ParticipantId;\n type: 'user' | 'agent' | 'system';\n role: ParticipantRole;\n joinedAt: Timestamp;\n leftAt?: Timestamp;\n permissions: ConversationPermissions;\n agentInfo?: {\n agentId: AgentId;\n name?: string;\n role?: string;\n };\n _meta?: Meta;\n}\n\n/**\n * A thread within a conversation for focused discussion.\n */\nexport interface Thread {\n id: ThreadId;\n conversationId: ConversationId;\n parentThreadId?: ThreadId;\n subject?: string;\n rootTurnId: TurnId;\n turnCount: number;\n participantCount: number;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n createdBy: ParticipantId;\n _meta?: Meta;\n}\n\n/**\n * How a turn was created.\n * - 'explicit': Created directly via mail/turn call\n * - 'intercepted': Auto-recorded from map/send with mail meta\n */\nexport type TurnSource =\n | { type: 'explicit'; method: 'mail/turn' }\n | { type: 'intercepted'; messageId: MessageId };\n\n/**\n * Visibility of a turn within a conversation.\n */\nexport type TurnVisibility =\n | { type: 'all' }\n | { type: 'participants'; ids: ParticipantId[] }\n | { type: 'role'; roles: ParticipantRole[] }\n | { type: 'private' };\n\n/**\n * Status of a turn's content lifecycle.\n */\nexport type TurnStatus = 'pending' | 'streaming' | 'complete' | 'failed';\n\n/**\n * A turn - the atomic unit of conversation.\n * Records what a participant intentionally communicates.\n *\n * Content uses a generic model:\n * - Well-known types: 'text', 'data', 'event', 'reference'\n * - Custom types use 'x-' prefix (e.g., 'x-tool-call')\n */\nexport interface Turn {\n id: TurnId;\n conversationId: ConversationId;\n participant: ParticipantId;\n timestamp: Timestamp;\n /** Content type - well-known ('text', 'data', 'event', 'reference') or custom ('x-*') */\n contentType: string;\n /** Content payload - shape determined by contentType */\n content: unknown;\n /** Thread this turn belongs to */\n threadId?: ThreadId;\n /** Turn this is in reply to */\n inReplyTo?: TurnId;\n /** How this turn was created */\n source: TurnSource;\n /** Who can see this turn */\n visibility?: TurnVisibility;\n /** Status of the turn content */\n status?: TurnStatus;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Mail metadata for map/send turn tracking.\n * Include in MessageMeta.mail to route AND record a turn.\n */\nexport interface MailMessageMeta {\n conversationId: ConversationId;\n threadId?: ThreadId;\n inReplyTo?: TurnId;\n visibility?: TurnVisibility;\n}\n\n/**\n * Mail-specific subscription filter.\n * Used in SubscriptionFilter.mail for filtering mail events.\n */\nexport interface MailSubscriptionFilter {\n conversationId?: ConversationId;\n threadId?: ThreadId;\n participantId?: ParticipantId;\n contentType?: string;\n}\n\n// =============================================================================\n// Mail Event Data Types\n// =============================================================================\n\n/** Data for mail.created events */\nexport interface MailCreatedEventData {\n conversationId: ConversationId;\n type: ConversationType;\n subject?: string;\n createdBy: ParticipantId;\n}\n\n/** Data for mail.closed events */\nexport interface MailClosedEventData {\n conversationId: ConversationId;\n closedBy: ParticipantId;\n reason?: string;\n}\n\n/** Data for mail.participant.joined events */\nexport interface MailParticipantJoinedEventData {\n conversationId: ConversationId;\n participant: ConversationParticipant;\n}\n\n/** Data for mail.participant.left events */\nexport interface MailParticipantLeftEventData {\n conversationId: ConversationId;\n participantId: ParticipantId;\n reason?: string;\n}\n\n/** Data for mail.turn.added events */\nexport interface MailTurnAddedEventData {\n conversationId: ConversationId;\n turn: Turn;\n}\n\n/** Data for mail.turn.updated events */\nexport interface MailTurnUpdatedEventData {\n conversationId: ConversationId;\n turnId: TurnId;\n status?: TurnStatus;\n}\n\n/** Data for mail.thread.created events */\nexport interface MailThreadCreatedEventData {\n conversationId: ConversationId;\n thread: Thread;\n}\n\n/** Data for mail.summary.generated events */\nexport interface MailSummaryGeneratedEventData {\n conversationId: ConversationId;\n summary: string;\n}\n\n// =============================================================================\n// Mail Request/Response Types\n// =============================================================================\n\n// --- mail/create ---\n\nexport interface MailCreateRequestParams {\n type?: ConversationType;\n subject?: string;\n parentConversationId?: ConversationId;\n parentTurnId?: TurnId;\n initialParticipants?: Array<{\n id: ParticipantId;\n role?: ParticipantRole;\n permissions?: Partial<ConversationPermissions>;\n }>;\n initialTurn?: {\n contentType: string;\n content: unknown;\n visibility?: TurnVisibility;\n };\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface MailCreateRequest extends MAPRequestBase<MailCreateRequestParams> {\n method: 'mail/create';\n params: MailCreateRequestParams;\n}\n\nexport interface MailCreateResponseResult {\n conversation: Conversation;\n participant: ConversationParticipant;\n initialTurn?: Turn;\n _meta?: Meta;\n}\n\n// --- mail/get ---\n\nexport interface MailGetRequestParams {\n conversationId: ConversationId;\n include?: {\n participants?: boolean;\n threads?: boolean;\n recentTurns?: number;\n stats?: boolean;\n };\n _meta?: Meta;\n}\n\nexport interface MailGetRequest extends MAPRequestBase<MailGetRequestParams> {\n method: 'mail/get';\n params: MailGetRequestParams;\n}\n\nexport interface MailGetResponseResult {\n conversation: Conversation;\n participants?: ConversationParticipant[];\n threads?: Thread[];\n recentTurns?: Turn[];\n stats?: {\n totalTurns: number;\n turnsByContentType: Record<string, number>;\n activeParticipants: number;\n threadCount: number;\n };\n _meta?: Meta;\n}\n\n// --- mail/list ---\n\nexport interface MailListRequestParams {\n filter?: {\n type?: ConversationType[];\n status?: ConversationStatus[];\n participantId?: ParticipantId;\n createdAfter?: Timestamp;\n createdBefore?: Timestamp;\n parentConversationId?: ConversationId;\n };\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface MailListRequest extends MAPRequestBase<MailListRequestParams> {\n method: 'mail/list';\n params?: MailListRequestParams;\n}\n\nexport interface MailListResponseResult {\n conversations: Conversation[];\n nextCursor?: string;\n hasMore: boolean;\n _meta?: Meta;\n}\n\n// --- mail/close ---\n\nexport interface MailCloseRequestParams {\n conversationId: ConversationId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface MailCloseRequest extends MAPRequestBase<MailCloseRequestParams> {\n method: 'mail/close';\n params: MailCloseRequestParams;\n}\n\nexport interface MailCloseResponseResult {\n conversation: Conversation;\n _meta?: Meta;\n}\n\n// --- mail/join ---\n\nexport interface MailJoinRequestParams {\n conversationId: ConversationId;\n role?: ParticipantRole;\n catchUp?: {\n from: string | number;\n limit?: number;\n includeSummary?: boolean;\n };\n _meta?: Meta;\n}\n\nexport interface MailJoinRequest extends MAPRequestBase<MailJoinRequestParams> {\n method: 'mail/join';\n params: MailJoinRequestParams;\n}\n\nexport interface MailJoinResponseResult {\n conversation: Conversation;\n participant: ConversationParticipant;\n history?: Turn[];\n historyCursor?: string;\n summary?: string;\n _meta?: Meta;\n}\n\n// --- mail/leave ---\n\nexport interface MailLeaveRequestParams {\n conversationId: ConversationId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface MailLeaveRequest extends MAPRequestBase<MailLeaveRequestParams> {\n method: 'mail/leave';\n params: MailLeaveRequestParams;\n}\n\nexport interface MailLeaveResponseResult {\n success: boolean;\n leftAt: Timestamp;\n _meta?: Meta;\n}\n\n// --- mail/invite ---\n\nexport interface MailInviteRequestParams {\n conversationId: ConversationId;\n participant: {\n id: ParticipantId;\n role?: ParticipantRole;\n permissions?: Partial<ConversationPermissions>;\n };\n message?: string;\n _meta?: Meta;\n}\n\nexport interface MailInviteRequest extends MAPRequestBase<MailInviteRequestParams> {\n method: 'mail/invite';\n params: MailInviteRequestParams;\n}\n\nexport interface MailInviteResponseResult {\n invited: boolean;\n participant?: ConversationParticipant;\n invitationId?: string;\n pending?: boolean;\n _meta?: Meta;\n}\n\n// --- mail/turn ---\n\nexport interface MailTurnRequestParams {\n conversationId: ConversationId;\n contentType: string;\n content: unknown;\n threadId?: ThreadId;\n inReplyTo?: TurnId;\n visibility?: TurnVisibility;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface MailTurnRequest extends MAPRequestBase<MailTurnRequestParams> {\n method: 'mail/turn';\n params: MailTurnRequestParams;\n}\n\nexport interface MailTurnResponseResult {\n turn: Turn;\n _meta?: Meta;\n}\n\n// --- mail/turns/list ---\n\nexport interface MailTurnsListRequestParams {\n conversationId: ConversationId;\n filter?: {\n threadId?: ThreadId;\n includeAllThreads?: boolean;\n contentTypes?: string[];\n participantId?: ParticipantId;\n afterTurnId?: TurnId;\n beforeTurnId?: TurnId;\n afterTimestamp?: Timestamp;\n beforeTimestamp?: Timestamp;\n };\n limit?: number;\n order?: 'asc' | 'desc';\n _meta?: Meta;\n}\n\nexport interface MailTurnsListRequest extends MAPRequestBase<MailTurnsListRequestParams> {\n method: 'mail/turns/list';\n params: MailTurnsListRequestParams;\n}\n\nexport interface MailTurnsListResponseResult {\n turns: Turn[];\n hasMore: boolean;\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// --- mail/thread/create ---\n\nexport interface MailThreadCreateRequestParams {\n conversationId: ConversationId;\n rootTurnId: TurnId;\n subject?: string;\n parentThreadId?: ThreadId;\n _meta?: Meta;\n}\n\nexport interface MailThreadCreateRequest extends MAPRequestBase<MailThreadCreateRequestParams> {\n method: 'mail/thread/create';\n params: MailThreadCreateRequestParams;\n}\n\nexport interface MailThreadCreateResponseResult {\n thread: Thread;\n _meta?: Meta;\n}\n\n// --- mail/thread/list ---\n\nexport interface MailThreadListRequestParams {\n conversationId: ConversationId;\n parentThreadId?: ThreadId;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface MailThreadListRequest extends MAPRequestBase<MailThreadListRequestParams> {\n method: 'mail/thread/list';\n params?: MailThreadListRequestParams;\n}\n\nexport interface MailThreadListResponseResult {\n threads: Thread[];\n hasMore: boolean;\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// --- mail/summary ---\n\nexport interface MailSummaryRequestParams {\n conversationId: ConversationId;\n scope?: {\n fromTurnId?: TurnId;\n toTurnId?: TurnId;\n threadId?: ThreadId;\n };\n regenerate?: boolean;\n include?: {\n keyPoints?: boolean;\n keyDecisions?: boolean;\n openQuestions?: boolean;\n participants?: boolean;\n };\n _meta?: Meta;\n}\n\nexport interface MailSummaryRequest extends MAPRequestBase<MailSummaryRequestParams> {\n method: 'mail/summary';\n params: MailSummaryRequestParams;\n}\n\nexport interface MailSummaryResponseResult {\n summary: string;\n keyPoints?: string[];\n keyDecisions?: string[];\n openQuestions?: string[];\n generated: boolean;\n cachedAt?: Timestamp;\n _meta?: Meta;\n}\n\n// --- mail/replay ---\n\nexport interface MailReplayRequestParams {\n conversationId: ConversationId;\n fromTurnId?: TurnId;\n fromTimestamp?: Timestamp;\n threadId?: ThreadId;\n limit?: number;\n contentTypes?: string[];\n _meta?: Meta;\n}\n\nexport interface MailReplayRequest extends MAPRequestBase<MailReplayRequestParams> {\n method: 'mail/replay';\n params: MailReplayRequestParams;\n}\n\nexport interface MailReplayResponseResult {\n turns: Turn[];\n hasMore: boolean;\n nextCursor?: string;\n missedCount: number;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Notification Types\n// =============================================================================\n\n/**\n * Parameters for event notifications delivered to subscribers.\n *\n * The envelope contains both delivery metadata (subscriptionId, sequence)\n * and optional fields for deduplication and causal ordering.\n */\nexport interface EventNotificationParams {\n /** The subscription this event is being delivered to */\n subscriptionId: SubscriptionId;\n\n /** Monotonically increasing sequence number within this subscription */\n sequenceNumber: number;\n\n /**\n * Globally unique event identifier (ULID format).\n *\n * Used for:\n * - Deduplication (same event delivered multiple times)\n * - Replay references (afterEventId in replay requests)\n * - Causal tracking (referenced in causedBy arrays)\n *\n * Format: 26-character ULID, e.g., \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n *\n * @remarks\n * If not provided by the server, deduplication is skipped.\n * New routers should always provide this field.\n */\n eventId?: string;\n\n /**\n * Server timestamp when the event was processed (milliseconds since epoch).\n *\n * This is the envelope-level timestamp, which may differ from event.timestamp\n * if the event was queued or replayed.\n */\n timestamp?: Timestamp;\n\n /**\n * Event IDs of events that causally precede this event.\n *\n * Used for enforcing causal ordering - this event should not be\n * processed until all events in causedBy have been processed.\n *\n * @example\n * A message_delivered event would have causedBy: [messagesentEventId]\n */\n causedBy?: string[];\n\n /** The event payload */\n event: Event;\n\n _meta?: Meta;\n}\n\nexport interface EventNotification extends MAPNotificationBase<EventNotificationParams> {\n method: 'map/event';\n params: EventNotificationParams;\n}\n\nexport interface MessageNotificationParams {\n message: Message;\n _meta?: Meta;\n}\n\nexport interface MessageNotification extends MAPNotificationBase<MessageNotificationParams> {\n method: 'map/message';\n params: MessageNotificationParams;\n}\n\n// =============================================================================\n// Union Types for All Requests/Responses/Notifications\n// =============================================================================\n\n/** All MAP request types */\nexport type MAPRequest =\n // Core\n | ConnectRequest\n | DisconnectRequest\n | SessionListRequest\n | SessionLoadRequest\n | SessionCloseRequest\n | AgentsListRequest\n | AgentsGetRequest\n | SendRequest\n | SubscribeRequest\n | UnsubscribeRequest\n | ReplayRequest\n | AuthRefreshRequest\n // Structure\n | AgentsRegisterRequest\n | AgentsSpawnRequest\n | AgentsUnregisterRequest\n | AgentsUpdateRequest\n | AgentsStopRequest\n | AgentsSuspendRequest\n | AgentsResumeRequest\n | StructureGraphRequest\n | ScopesListRequest\n | ScopesGetRequest\n | ScopesCreateRequest\n | ScopesDeleteRequest\n | ScopesJoinRequest\n | ScopesLeaveRequest\n | ScopesMembersRequest\n // Permissions\n | PermissionsUpdateRequest\n // Extension\n | InjectRequest\n | FederationConnectRequest\n | FederationRouteRequest\n // Mail\n | MailCreateRequest\n | MailGetRequest\n | MailListRequest\n | MailCloseRequest\n | MailJoinRequest\n | MailLeaveRequest\n | MailInviteRequest\n | MailTurnRequest\n | MailTurnsListRequest\n | MailThreadCreateRequest\n | MailThreadListRequest\n | MailSummaryRequest\n | MailReplayRequest;\n\n/** All MAP notification types */\nexport type MAPNotification = EventNotification | MessageNotification | SubscriptionAckNotification;\n\n// =============================================================================\n// Method Constants (Reorganized by capability domain)\n// =============================================================================\n\n/** Core methods - All implementations must support */\nexport const CORE_METHODS = {\n CONNECT: 'map/connect',\n DISCONNECT: 'map/disconnect',\n SEND: 'map/send',\n SUBSCRIBE: 'map/subscribe',\n UNSUBSCRIBE: 'map/unsubscribe',\n REPLAY: 'map/replay',\n} as const;\n\n/** Observation methods - Query/read operations */\nexport const OBSERVATION_METHODS = {\n AGENTS_LIST: 'map/agents/list',\n AGENTS_GET: 'map/agents/get',\n SCOPES_LIST: 'map/scopes/list',\n SCOPES_GET: 'map/scopes/get',\n SCOPES_MEMBERS: 'map/scopes/members',\n STRUCTURE_GRAPH: 'map/structure/graph',\n} as const;\n\n/** Lifecycle methods - Agent creation/destruction */\nexport const LIFECYCLE_METHODS = {\n AGENTS_REGISTER: 'map/agents/register',\n AGENTS_UNREGISTER: 'map/agents/unregister',\n AGENTS_SPAWN: 'map/agents/spawn',\n} as const;\n\n/** State methods - Agent state management */\nexport const STATE_METHODS = {\n AGENTS_UPDATE: 'map/agents/update',\n AGENTS_SUSPEND: 'map/agents/suspend',\n AGENTS_RESUME: 'map/agents/resume',\n AGENTS_STOP: 'map/agents/stop',\n} as const;\n\n/** Steering methods - External control */\nexport const STEERING_METHODS = {\n INJECT: 'map/inject',\n} as const;\n\n/** Scope methods - Scope management */\nexport const SCOPE_METHODS = {\n SCOPES_CREATE: 'map/scopes/create',\n SCOPES_DELETE: 'map/scopes/delete',\n SCOPES_JOIN: 'map/scopes/join',\n SCOPES_LEAVE: 'map/scopes/leave',\n} as const;\n\n/** Session methods */\nexport const SESSION_METHODS = {\n SESSION_LIST: 'map/session/list',\n SESSION_LOAD: 'map/session/load',\n SESSION_CLOSE: 'map/session/close',\n} as const;\n\n/** Auth methods */\nexport const AUTH_METHODS = {\n AUTHENTICATE: 'map/authenticate',\n AUTH_REFRESH: 'map/auth/refresh',\n} as const;\n\n/** Permission methods */\nexport const PERMISSION_METHODS = {\n PERMISSIONS_UPDATE: 'map/permissions/update',\n} as const;\n\n/** Federation methods */\nexport const FEDERATION_METHODS = {\n FEDERATION_CONNECT: 'map/federation/connect',\n FEDERATION_ROUTE: 'map/federation/route',\n} as const;\n\n/** Mail methods - Conversation and turn management */\nexport const MAIL_METHODS = {\n MAIL_CREATE: 'mail/create',\n MAIL_GET: 'mail/get',\n MAIL_LIST: 'mail/list',\n MAIL_CLOSE: 'mail/close',\n MAIL_JOIN: 'mail/join',\n MAIL_LEAVE: 'mail/leave',\n MAIL_INVITE: 'mail/invite',\n MAIL_TURN: 'mail/turn',\n MAIL_TURNS_LIST: 'mail/turns/list',\n MAIL_THREAD_CREATE: 'mail/thread/create',\n MAIL_THREAD_LIST: 'mail/thread/list',\n MAIL_SUMMARY: 'mail/summary',\n MAIL_REPLAY: 'mail/replay',\n} as const;\n\n/** Notification methods */\nexport const NOTIFICATION_METHODS = {\n EVENT: 'map/event',\n MESSAGE: 'map/message',\n /** Client acknowledges received events (for backpressure) */\n SUBSCRIBE_ACK: 'map/subscribe.ack',\n /** Server notifies client that auth is about to expire */\n AUTH_EXPIRING: 'map/auth/expiring',\n} as const;\n\n/** All MAP methods */\nexport const MAP_METHODS = {\n ...CORE_METHODS,\n ...OBSERVATION_METHODS,\n ...LIFECYCLE_METHODS,\n ...STATE_METHODS,\n ...STEERING_METHODS,\n ...SCOPE_METHODS,\n ...SESSION_METHODS,\n ...AUTH_METHODS,\n ...PERMISSION_METHODS,\n ...FEDERATION_METHODS,\n ...MAIL_METHODS,\n} as const;\n\n// Legacy aliases for backward compatibility\nexport const STRUCTURE_METHODS = {\n ...LIFECYCLE_METHODS,\n ...STATE_METHODS,\n ...SCOPE_METHODS,\n STRUCTURE_GRAPH: OBSERVATION_METHODS.STRUCTURE_GRAPH,\n} as const;\n\nexport const EXTENSION_METHODS = {\n ...STEERING_METHODS,\n ...FEDERATION_METHODS,\n} as const;\n\n// =============================================================================\n// Error Codes (Fixed: no collisions)\n// =============================================================================\n\n/** JSON-RPC standard error codes */\nexport const PROTOCOL_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n/** Authentication error codes */\nexport const AUTH_ERROR_CODES = {\n AUTH_REQUIRED: 1000,\n AUTH_FAILED: 1001,\n TOKEN_EXPIRED: 1002,\n PERMISSION_DENIED: 1003,\n INSUFFICIENT_SCOPE: 1004,\n METHOD_NOT_SUPPORTED: 1005,\n INVALID_CREDENTIALS: 1006,\n} as const;\n\n/** Routing error codes */\nexport const ROUTING_ERROR_CODES = {\n ADDRESS_NOT_FOUND: 2000,\n AGENT_NOT_FOUND: 2001,\n SCOPE_NOT_FOUND: 2002,\n DELIVERY_FAILED: 2003,\n ADDRESS_AMBIGUOUS: 2004,\n} as const;\n\n/** Agent error codes */\nexport const AGENT_ERROR_CODES = {\n AGENT_EXISTS: 3000,\n STATE_INVALID: 3001,\n NOT_RESPONDING: 3002,\n TERMINATED: 3003,\n SPAWN_FAILED: 3004,\n} as const;\n\n/** Resource error codes */\nexport const RESOURCE_ERROR_CODES = {\n EXHAUSTED: 4000,\n RATE_LIMITED: 4001,\n QUOTA_EXCEEDED: 4002,\n} as const;\n\n/** Federation error codes - prefixed to avoid collision with AUTH_FAILED */\nexport const FEDERATION_ERROR_CODES = {\n FEDERATION_UNAVAILABLE: 5000,\n FEDERATION_SYSTEM_NOT_FOUND: 5001,\n FEDERATION_AUTH_FAILED: 5002,\n FEDERATION_ROUTE_REJECTED: 5003,\n /** Message has already visited this system (loop detected) */\n FEDERATION_LOOP_DETECTED: 5010,\n /** Message exceeded maximum hop count */\n FEDERATION_MAX_HOPS_EXCEEDED: 5011,\n} as const;\n\n/** Mail error codes - prefixed to avoid collision with PERMISSION_DENIED */\nexport const MAIL_ERROR_CODES = {\n MAIL_CONVERSATION_NOT_FOUND: 10000,\n MAIL_CONVERSATION_CLOSED: 10001,\n MAIL_NOT_A_PARTICIPANT: 10002,\n MAIL_PERMISSION_DENIED: 10003,\n MAIL_TURN_NOT_FOUND: 10004,\n MAIL_THREAD_NOT_FOUND: 10005,\n MAIL_INVALID_TURN_CONTENT: 10006,\n MAIL_PARTICIPANT_ALREADY_JOINED: 10007,\n MAIL_INVITATION_REQUIRED: 10008,\n MAIL_HISTORY_ACCESS_DENIED: 10009,\n MAIL_PARENT_CONVERSATION_NOT_FOUND: 10010,\n} as const;\n\n/** All error codes */\nexport const ERROR_CODES = {\n ...PROTOCOL_ERROR_CODES,\n ...AUTH_ERROR_CODES,\n ...ROUTING_ERROR_CODES,\n ...AGENT_ERROR_CODES,\n ...RESOURCE_ERROR_CODES,\n ...FEDERATION_ERROR_CODES,\n ...MAIL_ERROR_CODES,\n} as const;\n\n/** Protocol version */\nexport const PROTOCOL_VERSION: ProtocolVersion = 1;\n\n// =============================================================================\n// Capability Requirements\n// =============================================================================\n\n/**\n * Maps methods to required capabilities.\n * Empty array means no special capability required.\n */\nexport const CAPABILITY_REQUIREMENTS: Record<string, string[]> = {\n // Core\n [CORE_METHODS.CONNECT]: [],\n [CORE_METHODS.DISCONNECT]: [],\n [CORE_METHODS.SEND]: ['messaging.canSend'],\n [CORE_METHODS.SUBSCRIBE]: ['observation.canObserve'],\n [CORE_METHODS.UNSUBSCRIBE]: ['observation.canObserve'],\n\n // Observation\n [OBSERVATION_METHODS.AGENTS_LIST]: ['observation.canQuery'],\n [OBSERVATION_METHODS.AGENTS_GET]: ['observation.canQuery'],\n [OBSERVATION_METHODS.SCOPES_LIST]: ['observation.canQuery'],\n [OBSERVATION_METHODS.SCOPES_GET]: ['observation.canQuery'],\n [OBSERVATION_METHODS.SCOPES_MEMBERS]: ['observation.canQuery'],\n [OBSERVATION_METHODS.STRUCTURE_GRAPH]: ['observation.canQuery'],\n\n // Lifecycle\n [LIFECYCLE_METHODS.AGENTS_REGISTER]: ['lifecycle.canRegister'],\n [LIFECYCLE_METHODS.AGENTS_UNREGISTER]: ['lifecycle.canUnregister'],\n [LIFECYCLE_METHODS.AGENTS_SPAWN]: ['lifecycle.canSpawn'],\n\n // State\n [STATE_METHODS.AGENTS_UPDATE]: ['lifecycle.canRegister'],\n [STATE_METHODS.AGENTS_SUSPEND]: ['lifecycle.canStop'],\n [STATE_METHODS.AGENTS_RESUME]: ['lifecycle.canStop'],\n [STATE_METHODS.AGENTS_STOP]: ['lifecycle.canStop'],\n\n // Steering\n [STEERING_METHODS.INJECT]: ['lifecycle.canSteer'],\n\n // Scopes\n [SCOPE_METHODS.SCOPES_CREATE]: ['scopes.canCreateScopes'],\n [SCOPE_METHODS.SCOPES_DELETE]: ['scopes.canManageScopes'],\n [SCOPE_METHODS.SCOPES_JOIN]: [],\n [SCOPE_METHODS.SCOPES_LEAVE]: [],\n\n // Session\n [SESSION_METHODS.SESSION_LIST]: [],\n [SESSION_METHODS.SESSION_LOAD]: [],\n [SESSION_METHODS.SESSION_CLOSE]: [],\n\n // Auth (no capability required - anyone can authenticate)\n [AUTH_METHODS.AUTHENTICATE]: [],\n [AUTH_METHODS.AUTH_REFRESH]: [],\n\n // Permissions (system-only, no capability check - enforced by participant type)\n [PERMISSION_METHODS.PERMISSIONS_UPDATE]: [],\n\n // Federation\n [FEDERATION_METHODS.FEDERATION_CONNECT]: ['federation.canFederate'],\n [FEDERATION_METHODS.FEDERATION_ROUTE]: ['federation.canFederate'],\n\n // Mail\n [MAIL_METHODS.MAIL_CREATE]: ['mail.canCreate'],\n [MAIL_METHODS.MAIL_GET]: ['mail.canJoin'],\n [MAIL_METHODS.MAIL_LIST]: ['mail.canJoin'],\n [MAIL_METHODS.MAIL_CLOSE]: ['mail.canCreate'],\n [MAIL_METHODS.MAIL_JOIN]: ['mail.canJoin'],\n [MAIL_METHODS.MAIL_LEAVE]: ['mail.canJoin'],\n [MAIL_METHODS.MAIL_INVITE]: ['mail.canInvite'],\n [MAIL_METHODS.MAIL_TURN]: ['mail.canJoin'],\n [MAIL_METHODS.MAIL_TURNS_LIST]: ['mail.canViewHistory'],\n [MAIL_METHODS.MAIL_THREAD_CREATE]: ['mail.canCreateThreads'],\n [MAIL_METHODS.MAIL_THREAD_LIST]: ['mail.canJoin'],\n [MAIL_METHODS.MAIL_SUMMARY]: ['mail.canViewHistory'],\n [MAIL_METHODS.MAIL_REPLAY]: ['mail.canViewHistory'],\n} as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/** Check if a response is an error response */\nexport function isErrorResponse(response: MAPResponse): response is MAPResponseError {\n return 'error' in response;\n}\n\n/** Check if a response is a success response */\nexport function isSuccessResponse<T>(response: MAPResponse<T>): response is MAPResponseSuccess<T> {\n return 'result' in response;\n}\n\n/** Check if an address is a direct address */\nexport function isDirectAddress(address: Address): address is DirectAddress {\n return typeof address === 'object' && 'agent' in address && !('system' in address);\n}\n\n/** Check if an address is a federated address */\nexport function isFederatedAddress(address: Address): address is FederatedAddress {\n return typeof address === 'object' && 'system' in address && 'agent' in address;\n}\n\n/** Check if an address is a scope address */\nexport function isScopeAddress(address: Address): address is ScopeAddress {\n return typeof address === 'object' && 'scope' in address;\n}\n\n/** Check if an address is a broadcast address */\nexport function isBroadcastAddress(address: Address): address is BroadcastAddress {\n return typeof address === 'object' && 'broadcast' in address;\n}\n\n/** Check if an address is a hierarchical address */\nexport function isHierarchicalAddress(address: Address): address is HierarchicalAddress {\n return (\n typeof address === 'object' &&\n ('parent' in address ||\n 'children' in address ||\n 'ancestors' in address ||\n 'descendants' in address ||\n 'siblings' in address)\n );\n}\n","/**\n * JSON-RPC 2.0 utilities for MAP protocol\n */\n\nimport type { RequestId, MAPError } from '../types';\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = '2.0' as const;\n\n/**\n * Generic JSON-RPC request structure\n */\nexport interface JsonRpcRequest<TParams = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC notification structure (no id)\n */\nexport interface JsonRpcNotification<TParams = unknown> {\n jsonrpc: '2.0';\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC success response\n */\nexport interface JsonRpcSuccessResponse<TResult = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n result: TResult;\n}\n\n/**\n * Generic JSON-RPC error response\n */\nexport interface JsonRpcErrorResponse {\n jsonrpc: '2.0';\n id: RequestId;\n error: MAPError;\n}\n\n/**\n * Any JSON-RPC response\n */\nexport type JsonRpcResponse<TResult = unknown> =\n | JsonRpcSuccessResponse<TResult>\n | JsonRpcErrorResponse;\n\n/**\n * Any JSON-RPC message\n */\nexport type JsonRpcMessage =\n | JsonRpcRequest\n | JsonRpcNotification\n | JsonRpcResponse;\n\n/**\n * Check if a message is a request (has id and method)\n */\nexport function isRequest(message: unknown): message is JsonRpcRequest {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n 'method' in message\n );\n}\n\n/**\n * Check if a message is a notification (has method but no id)\n */\nexport function isNotification(message: unknown): message is JsonRpcNotification {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'method' in message &&\n !('id' in message)\n );\n}\n\n/**\n * Check if a message is a response (has id but no method)\n */\nexport function isResponse(message: unknown): message is JsonRpcResponse {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n !('method' in message)\n );\n}\n\n/**\n * Check if a response is an error response\n */\nexport function isErrorResponse(\n response: JsonRpcResponse\n): response is JsonRpcErrorResponse {\n return 'error' in response;\n}\n\n/**\n * Check if a response is a success response\n */\nexport function isSuccessResponse<T>(\n response: JsonRpcResponse<T>\n): response is JsonRpcSuccessResponse<T> {\n return 'result' in response;\n}\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest<TParams>(\n id: RequestId,\n method: string,\n params?: TParams\n): JsonRpcRequest<TParams> {\n const request: JsonRpcRequest<TParams> = {\n jsonrpc: '2.0',\n id,\n method,\n };\n if (params !== undefined) {\n request.params = params;\n }\n return request;\n}\n\n/**\n * Create a JSON-RPC notification\n */\nexport function createNotification<TParams>(\n method: string,\n params?: TParams\n): JsonRpcNotification<TParams> {\n const notification: JsonRpcNotification<TParams> = {\n jsonrpc: '2.0',\n method,\n };\n if (params !== undefined) {\n notification.params = params;\n }\n return notification;\n}\n\n/**\n * Create a JSON-RPC success response\n */\nexport function createSuccessResponse<TResult>(\n id: RequestId,\n result: TResult\n): JsonRpcSuccessResponse<TResult> {\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n}\n\n/**\n * Create a JSON-RPC error response\n */\nexport function createErrorResponse(\n id: RequestId,\n error: MAPError\n): JsonRpcErrorResponse {\n return {\n jsonrpc: '2.0',\n id,\n error,\n };\n}\n","/**\n * Error classes for MAP protocol\n */\n\nimport type { MAPError, MAPErrorData, ErrorCategory, RequestId } from '../types';\nimport {\n PROTOCOL_ERROR_CODES,\n AUTH_ERROR_CODES,\n ROUTING_ERROR_CODES,\n AGENT_ERROR_CODES,\n RESOURCE_ERROR_CODES,\n FEDERATION_ERROR_CODES,\n} from '../types';\nimport { createErrorResponse, type JsonRpcErrorResponse } from '../jsonrpc';\n\n/**\n * Error thrown when a MAP request fails.\n *\n * Extends Error with JSON-RPC error properties and provides\n * factory methods for common error types.\n */\nexport class MAPRequestError extends Error {\n readonly code: number;\n readonly data?: MAPErrorData;\n\n constructor(code: number, message: string, data?: MAPErrorData) {\n super(message);\n this.name = 'MAPRequestError';\n this.code = code;\n this.data = data;\n }\n\n /**\n * Convert to MAP error object\n */\n toError(): MAPError {\n const error: MAPError = {\n code: this.code,\n message: this.message,\n };\n if (this.data) {\n error.data = this.data;\n }\n return error;\n }\n\n /**\n * Convert to JSON-RPC error response\n */\n toResponse(id: RequestId): JsonRpcErrorResponse {\n return createErrorResponse(id, this.toError());\n }\n\n // ==========================================================================\n // Protocol Errors (-32xxx)\n // ==========================================================================\n\n static parseError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.PARSE_ERROR,\n details ?? 'Parse error',\n { category: 'protocol' }\n );\n }\n\n static invalidRequest(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_REQUEST,\n details ?? 'Invalid request',\n { category: 'protocol' }\n );\n }\n\n static methodNotFound(method: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.METHOD_NOT_FOUND,\n `Method not found: ${method}`,\n { category: 'protocol' }\n );\n }\n\n static invalidParams(details?: unknown): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_PARAMS,\n 'Invalid params',\n { category: 'protocol', details: details as Record<string, unknown> }\n );\n }\n\n static internalError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INTERNAL_ERROR,\n details ?? 'Internal error',\n { category: 'internal' }\n );\n }\n\n // ==========================================================================\n // Auth Errors (1xxx)\n // ==========================================================================\n\n static authRequired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_REQUIRED,\n 'Authentication required',\n { category: 'auth' }\n );\n }\n\n static authFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_FAILED,\n details ?? 'Authentication failed',\n { category: 'auth' }\n );\n }\n\n static tokenExpired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.TOKEN_EXPIRED,\n 'Token expired',\n { category: 'auth', retryable: true }\n );\n }\n\n static permissionDenied(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.PERMISSION_DENIED,\n required ? `Permission denied: ${required}` : 'Permission denied',\n { category: 'auth' }\n );\n }\n\n static insufficientScope(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.INSUFFICIENT_SCOPE,\n required ? `Insufficient scope: ${required}` : 'Insufficient scope',\n { category: 'auth' }\n );\n }\n\n static methodNotSupported(method: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.METHOD_NOT_SUPPORTED,\n `Authentication method not supported: ${method}`,\n { category: 'auth' }\n );\n }\n\n static invalidCredentials(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.INVALID_CREDENTIALS,\n details ?? 'Invalid credentials',\n { category: 'auth' }\n );\n }\n\n // ==========================================================================\n // Routing Errors (2xxx)\n // ==========================================================================\n\n static addressNotFound(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_NOT_FOUND,\n `Address not found: ${address}`,\n { category: 'routing' }\n );\n }\n\n static agentNotFound(agentId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.AGENT_NOT_FOUND,\n `Agent not found: ${agentId}`,\n { category: 'routing' }\n );\n }\n\n static scopeNotFound(scopeId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.SCOPE_NOT_FOUND,\n `Scope not found: ${scopeId}`,\n { category: 'routing' }\n );\n }\n\n static deliveryFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.DELIVERY_FAILED,\n details ?? 'Message delivery failed',\n { category: 'routing', retryable: true }\n );\n }\n\n static addressAmbiguous(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_AMBIGUOUS,\n `Address is ambiguous: ${address}`,\n { category: 'routing' }\n );\n }\n\n // ==========================================================================\n // Agent Errors (3xxx)\n // ==========================================================================\n\n static agentExists(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.AGENT_EXISTS,\n `Agent already exists: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static stateInvalid(currentState: string, requestedAction: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.STATE_INVALID,\n `Cannot ${requestedAction} agent in state: ${currentState}`,\n { category: 'agent' }\n );\n }\n\n static agentNotResponding(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.NOT_RESPONDING,\n `Agent not responding: ${agentId}`,\n { category: 'agent', retryable: true }\n );\n }\n\n static agentTerminated(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.TERMINATED,\n `Agent terminated: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static spawnFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.SPAWN_FAILED,\n details ?? 'Failed to spawn agent',\n { category: 'agent' }\n );\n }\n\n // ==========================================================================\n // Resource Errors (4xxx)\n // ==========================================================================\n\n static resourceExhausted(resource?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.EXHAUSTED,\n resource ? `Resource exhausted: ${resource}` : 'Resource exhausted',\n { category: 'resource', retryable: true }\n );\n }\n\n static rateLimited(retryAfterMs?: number): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.RATE_LIMITED,\n 'Rate limited',\n { category: 'resource', retryable: true, retryAfterMs }\n );\n }\n\n static quotaExceeded(quota?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.QUOTA_EXCEEDED,\n quota ? `Quota exceeded: ${quota}` : 'Quota exceeded',\n { category: 'resource' }\n );\n }\n\n // ==========================================================================\n // Federation Errors (5xxx)\n // ==========================================================================\n\n static federationUnavailable(systemId?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_UNAVAILABLE,\n systemId ? `Federation unavailable: ${systemId}` : 'Federation unavailable',\n { category: 'federation', retryable: true }\n );\n }\n\n static federationSystemNotFound(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_SYSTEM_NOT_FOUND,\n `System not found: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationAuthFailed(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_AUTH_FAILED,\n `Federation authentication failed: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationRouteRejected(systemId: string, reason?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n reason ? `Route rejected by ${systemId}: ${reason}` : `Route rejected by ${systemId}`,\n { category: 'federation' }\n );\n }\n\n // ==========================================================================\n // Utility\n // ==========================================================================\n\n /**\n * Create from a MAP error object\n */\n static fromError(error: MAPError): MAPRequestError {\n return new MAPRequestError(error.code, error.message, error.data);\n }\n\n /**\n * Check if this error is retryable\n */\n get retryable(): boolean {\n return this.data?.retryable ?? false;\n }\n\n /**\n * Get retry delay in milliseconds, if specified\n */\n get retryAfterMs(): number | undefined {\n return this.data?.retryAfterMs;\n }\n\n /**\n * Get error category\n */\n get category(): ErrorCategory | undefined {\n return this.data?.category;\n }\n}\n\n/**\n * Error thrown when a connection is closed unexpectedly\n */\nexport class MAPConnectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MAPConnectionError';\n }\n\n static closed(): MAPConnectionError {\n return new MAPConnectionError('Connection closed');\n }\n\n static timeout(): MAPConnectionError {\n return new MAPConnectionError('Connection timeout');\n }\n}\n\n/**\n * Error thrown when an operation times out\n */\nexport class MAPTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(operation: string, timeoutMs: number) {\n super(`Operation timed out after ${timeoutMs}ms: ${operation}`);\n this.name = 'MAPTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n","/**\n * Stream utilities for MAP protocol transport\n *\n * Provides helpers for converting byte streams to/from MAP message streams.\n */\n\nimport type { MAPRequest, MAPResponse, MAPNotification } from '../types';\n\n/** Any MAP message type */\nexport type AnyMessage = MAPRequest | MAPResponse | MAPNotification | Record<string, unknown>;\n\n/**\n * Bidirectional message stream interface.\n * This is the transport abstraction that connection classes use.\n */\nexport interface Stream {\n writable: WritableStream<AnyMessage>;\n readable: ReadableStream<AnyMessage>;\n}\n\n/**\n * Converts raw byte streams to newline-delimited JSON message streams.\n *\n * This is the primary transport adapter - works with any byte stream\n * (stdio, TCP socket, etc.)\n *\n * @param readable - Input byte stream\n * @param writable - Output byte stream\n * @returns Stream interface for MAP messages\n */\nexport function ndJsonStream(\n readable: ReadableStream<Uint8Array>,\n writable: WritableStream<Uint8Array>\n): Stream {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n\n // Buffer for incomplete lines\n let buffer = '';\n\n const messageReadable = new ReadableStream<AnyMessage>({\n async start(controller) {\n const reader = readable.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Process any remaining buffer content\n if (buffer.trim()) {\n try {\n const message = JSON.parse(buffer.trim());\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse final message:', buffer);\n }\n }\n controller.close();\n break;\n }\n\n // Decode bytes and add to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n try {\n const message = JSON.parse(trimmed);\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse message:', trimmed);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n\n const messageWritable = new WritableStream<AnyMessage>({\n async write(message) {\n const writer = writable.getWriter();\n try {\n const json = JSON.stringify(message) + '\\n';\n await writer.write(encoder.encode(json));\n } finally {\n writer.releaseLock();\n }\n },\n async close() {\n await writable.close();\n },\n abort(reason) {\n writable.abort(reason);\n },\n });\n\n return {\n readable: messageReadable,\n writable: messageWritable,\n };\n}\n\n/**\n * Wraps a WebSocket in a Stream interface.\n *\n * @param ws - WebSocket instance (must be open or will wait for open)\n * @returns Stream interface for MAP messages\n */\nexport function websocketStream(ws: WebSocket): Stream {\n // Queue for messages received before reader is ready\n const messageQueue: AnyMessage[] = [];\n let messageResolver: ((value: IteratorResult<AnyMessage>) => void) | null = null;\n let closed = false;\n let closeError: Error | null = null;\n\n // Handle incoming messages\n ws.addEventListener('message', (event) => {\n try {\n const message = JSON.parse(event.data as string);\n if (messageResolver) {\n messageResolver({ value: message, done: false });\n messageResolver = null;\n } else {\n messageQueue.push(message);\n }\n } catch {\n console.error('MAP: Failed to parse WebSocket message:', event.data);\n }\n });\n\n ws.addEventListener('close', () => {\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n ws.addEventListener('error', () => {\n closeError = new Error('WebSocket error');\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n const readable = new ReadableStream<AnyMessage>({\n async pull(controller) {\n if (messageQueue.length > 0) {\n controller.enqueue(messageQueue.shift()!);\n return;\n }\n\n if (closed) {\n if (closeError) {\n controller.error(closeError);\n } else {\n controller.close();\n }\n return;\n }\n\n // Wait for next message\n await new Promise<IteratorResult<AnyMessage>>((resolve) => {\n messageResolver = resolve;\n }).then((result) => {\n if (result.done) {\n controller.close();\n } else {\n controller.enqueue(result.value);\n }\n });\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n if (ws.readyState === WebSocket.CONNECTING) {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.removeEventListener('error', onError);\n resolve();\n };\n const onError = () => {\n ws.removeEventListener('open', onOpen);\n reject(new Error('WebSocket failed to connect'));\n };\n ws.addEventListener('open', onOpen, { once: true });\n ws.addEventListener('error', onError, { once: true });\n });\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not open');\n }\n\n ws.send(JSON.stringify(message));\n },\n close() {\n ws.close();\n },\n abort() {\n ws.close();\n },\n });\n\n return { readable, writable };\n}\n\n/**\n * Wait for a WebSocket to open with timeout.\n *\n * @param ws - WebSocket instance\n * @param timeoutMs - Timeout in milliseconds (default: 10000)\n * @returns Promise that resolves when WebSocket is open\n * @throws Error if connection times out or fails\n */\nexport function waitForOpen(ws: WebSocket, timeoutMs = 10000): Promise<void> {\n return new Promise((resolve, reject) => {\n if (ws.readyState === WebSocket.OPEN) {\n resolve();\n return;\n }\n\n const timeout = setTimeout(() => {\n ws.close();\n reject(new Error(`WebSocket connection timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onOpen = () => {\n clearTimeout(timeout);\n ws.removeEventListener(\"error\", onError);\n resolve();\n };\n\n const onError = () => {\n clearTimeout(timeout);\n ws.removeEventListener(\"open\", onOpen);\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n ws.addEventListener(\"open\", onOpen, { once: true });\n ws.addEventListener(\"error\", onError, { once: true });\n });\n}\n\n/**\n * Creates a pair of connected in-memory streams for testing.\n *\n * Messages written to one stream's writable appear on the other's readable.\n *\n * @returns Tuple of [clientStream, serverStream]\n */\nexport function createStreamPair(): [Stream, Stream] {\n // Queues for each direction\n const clientToServer: AnyMessage[] = [];\n const serverToClient: AnyMessage[] = [];\n\n // Resolvers for blocking reads\n let clientToServerResolver: ((msg: AnyMessage) => void) | null = null;\n let serverToClientResolver: ((msg: AnyMessage) => void) | null = null;\n\n // Closed flags\n let clientToServerClosed = false;\n let serverToClientClosed = false;\n\n function createReadable(\n queue: AnyMessage[],\n _getResolver: () => ((msg: AnyMessage) => void) | null,\n setResolver: (r: ((msg: AnyMessage) => void) | null) => void,\n isClosed: () => boolean\n ): ReadableStream<AnyMessage> {\n return new ReadableStream({\n async pull(controller) {\n if (queue.length > 0) {\n controller.enqueue(queue.shift()!);\n return;\n }\n\n if (isClosed()) {\n controller.close();\n return;\n }\n\n const message = await new Promise<AnyMessage | null>((resolve) => {\n setResolver((msg) => {\n setResolver(null);\n resolve(msg);\n });\n });\n\n if (message === null) {\n controller.close();\n } else {\n controller.enqueue(message);\n }\n },\n });\n }\n\n function createWritable(\n queue: AnyMessage[],\n getResolver: () => ((msg: AnyMessage) => void) | null,\n setClosed: () => void\n ): WritableStream<AnyMessage> {\n return new WritableStream({\n write(message) {\n const resolver = getResolver();\n if (resolver) {\n resolver(message);\n } else {\n queue.push(message);\n }\n },\n close() {\n setClosed();\n const resolver = getResolver();\n if (resolver) {\n resolver(null as unknown as AnyMessage);\n }\n },\n });\n }\n\n const clientStream: Stream = {\n // Client writes to server\n writable: createWritable(\n clientToServer,\n () => clientToServerResolver,\n () => {\n clientToServerClosed = true;\n }\n ),\n // Client reads from server\n readable: createReadable(\n serverToClient,\n () => serverToClientResolver,\n (r) => {\n serverToClientResolver = r;\n },\n () => serverToClientClosed\n ),\n };\n\n const serverStream: Stream = {\n // Server writes to client\n writable: createWritable(\n serverToClient,\n () => serverToClientResolver,\n () => {\n serverToClientClosed = true;\n }\n ),\n // Server reads from client\n readable: createReadable(\n clientToServer,\n () => clientToServerResolver,\n (r) => {\n clientToServerResolver = r;\n },\n () => clientToServerClosed\n ),\n };\n\n return [clientStream, serverStream];\n}\n\n// ===========================================================================\n// Agentic-Mesh Transport (optional peer dependency)\n// ===========================================================================\n\nexport {\n agenticMeshStream,\n type AgenticMeshStreamConfig,\n type MeshPeerEndpoint,\n type MeshTransportAdapter,\n} from './agentic-mesh';\n","/**\n * Subscription class for MAP event streams\n *\n * Provides both AsyncIterable and event emitter patterns for consuming events.\n * Includes automatic deduplication based on eventId when provided by the server.\n */\n\nimport type {\n SubscriptionId,\n Event,\n SubscriptionFilter,\n SubscriptionState,\n SubscriptionAckParams,\n OverflowInfo,\n OverflowHandler,\n EventNotificationParams,\n} from '../types';\n\n/**\n * Event handler callback type\n */\nexport type EventHandler = (event: Event) => void;\n\n/**\n * Subscription options\n */\nexport interface SubscriptionOptions {\n /** Filter for events */\n filter?: SubscriptionFilter;\n /** Buffer size for events before backpressure */\n bufferSize?: number;\n /**\n * Maximum number of eventIds to track for deduplication.\n * Older eventIds are evicted when this limit is reached.\n * Default: 10000\n */\n maxSeenEventIds?: number;\n}\n\n/**\n * Subscription to MAP events.\n *\n * Supports both async iteration and event handler patterns:\n *\n * ```typescript\n * // Async iteration\n * for await (const event of subscription) {\n * console.log(event);\n * }\n *\n * // Event handler\n * subscription.on('event', (event) => console.log(event));\n * ```\n *\n * ## Deduplication\n *\n * When the server provides `eventId` in the notification params,\n * the subscription automatically deduplicates events. This handles\n * scenarios like:\n * - Network retries delivering the same event twice\n * - Reconnection replay overlapping with already-received events\n *\n * If `eventId` is not provided, deduplication is skipped.\n *\n * ## Pause/Resume\n *\n * You can pause event delivery from the async iterator while still\n * buffering events:\n *\n * ```typescript\n * subscription.pause();\n * // Events are buffered but not yielded\n * subscription.resume();\n * // Buffered events are now yielded\n * ```\n *\n * ## Overflow Handling\n *\n * When the buffer is full, events are dropped and overflow handlers\n * are notified:\n *\n * ```typescript\n * subscription.on('overflow', (info) => {\n * console.log(`Dropped ${info.eventsDropped} events`);\n * });\n * ```\n */\nexport class Subscription implements AsyncIterable<Event> {\n readonly id: SubscriptionId;\n readonly filter?: SubscriptionFilter;\n\n readonly #eventHandlers: Set<EventHandler> = new Set();\n readonly #overflowHandlers: Set<OverflowHandler> = new Set();\n readonly #eventQueue: Event[] = [];\n readonly #bufferSize: number;\n readonly #unsubscribe: () => Promise<void>;\n readonly #sendAck?: (params: SubscriptionAckParams) => void;\n\n // Deduplication tracking\n readonly #seenEventIds: Set<string> = new Set();\n readonly #seenEventIdOrder: string[] = []; // For LRU eviction\n readonly #maxSeenEventIds: number;\n\n #eventResolver: ((event: Event | null) => void) | null = null;\n #pauseResolver: (() => void) | null = null;\n #state: SubscriptionState = 'active';\n #lastSequenceNumber = -1;\n #lastEventId: string | undefined;\n #lastTimestamp: number | undefined;\n\n // Overflow tracking\n #totalDropped = 0;\n #oldestDroppedId?: string;\n #newestDroppedId?: string;\n\n // Ack support\n #serverSupportsAck = false;\n\n constructor(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options: SubscriptionOptions = {},\n sendAck?: (params: SubscriptionAckParams) => void\n ) {\n this.id = id;\n this.filter = options.filter;\n this.#bufferSize = options.bufferSize ?? 1000;\n this.#maxSeenEventIds = options.maxSeenEventIds ?? 10000;\n this.#unsubscribe = unsubscribe;\n this.#sendAck = sendAck;\n }\n\n /**\n * Current subscription state\n */\n get state(): SubscriptionState {\n return this.#state;\n }\n\n /**\n * Whether the subscription is closed\n */\n get isClosed(): boolean {\n return this.#state === 'closed';\n }\n\n /**\n * Whether the subscription is paused\n */\n get isPaused(): boolean {\n return this.#state === 'paused';\n }\n\n /**\n * Last received sequence number (for ordering verification)\n */\n get lastSequenceNumber(): number {\n return this.#lastSequenceNumber;\n }\n\n /**\n * Last received eventId (for replay positioning)\n */\n get lastEventId(): string | undefined {\n return this.#lastEventId;\n }\n\n /**\n * Last received server timestamp\n */\n get lastTimestamp(): number | undefined {\n return this.#lastTimestamp;\n }\n\n /**\n * Number of events currently buffered\n */\n get bufferedCount(): number {\n return this.#eventQueue.length;\n }\n\n /**\n * Number of eventIds being tracked for deduplication\n */\n get trackedEventIdCount(): number {\n return this.#seenEventIds.size;\n }\n\n /**\n * Total number of events dropped due to buffer overflow\n */\n get totalDropped(): number {\n return this.#totalDropped;\n }\n\n /**\n * Whether the server supports acknowledgments\n */\n get supportsAck(): boolean {\n return this.#serverSupportsAck && !!this.#sendAck;\n }\n\n /**\n * Pause event delivery from the async iterator.\n * Events are still buffered but not yielded until resume() is called.\n * Event handlers (on('event', ...)) still receive events while paused.\n */\n pause(): void {\n if (this.#state === 'closed') return;\n this.#state = 'paused';\n }\n\n /**\n * Resume event delivery from the async iterator.\n * Any events buffered during pause will be yielded.\n */\n resume(): void {\n if (this.#state === 'closed') return;\n this.#state = 'active';\n\n // Wake up paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // If iterator is waiting for events and we have buffered events, deliver one\n if (this.#eventResolver && this.#eventQueue.length > 0) {\n const event = this.#eventQueue.shift()!;\n this.#eventResolver(event);\n this.#eventResolver = null;\n }\n }\n\n /**\n * Acknowledge events up to a sequence number.\n * No-op if server doesn't support acks.\n *\n * @param upToSequence - Acknowledge all events up to and including this sequence.\n * If omitted, acknowledges up to lastSequenceNumber.\n */\n ack(upToSequence?: number): void {\n if (!this.supportsAck) return;\n\n const seq = upToSequence ?? this.#lastSequenceNumber;\n if (seq < 0) return; // No events received yet\n\n this.#sendAck!({\n subscriptionId: this.id,\n upToSequence: seq,\n });\n }\n\n /**\n * Register an event or overflow handler\n */\n on(type: 'event', handler: EventHandler): this;\n on(type: 'overflow', handler: OverflowHandler): this;\n on(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.add(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.add(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Remove an event or overflow handler\n */\n off(type: 'event', handler: EventHandler): this;\n off(type: 'overflow', handler: OverflowHandler): this;\n off(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.delete(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.delete(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Register a one-time event handler\n */\n once(type: 'event', handler: EventHandler): this {\n if (type === 'event') {\n const wrapper: EventHandler = (event) => {\n this.off('event', wrapper);\n handler(event);\n };\n this.on('event', wrapper);\n }\n return this;\n }\n\n /**\n * Unsubscribe and close the subscription\n */\n async unsubscribe(): Promise<void> {\n if (this.#state === 'closed') return;\n\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // Clear handlers and tracking\n this.#eventHandlers.clear();\n this.#overflowHandlers.clear();\n this.#seenEventIds.clear();\n this.#seenEventIdOrder.length = 0;\n\n // Call the unsubscribe callback\n await this.#unsubscribe();\n }\n\n /**\n * Set whether server supports acknowledgments.\n * Called by connection after capability negotiation.\n * @internal\n */\n _setServerSupportsAck(supports: boolean): void {\n this.#serverSupportsAck = supports;\n }\n\n /**\n * Push an event to the subscription (called by connection)\n * @internal\n */\n _pushEvent(params: EventNotificationParams): void {\n if (this.#state === 'closed') return;\n\n const { sequenceNumber, eventId, timestamp, event } = params;\n\n // Deduplicate by eventId if provided\n if (eventId) {\n if (this.#seenEventIds.has(eventId)) {\n // Duplicate event, skip silently\n return;\n }\n\n // Track this eventId\n this.#seenEventIds.add(eventId);\n this.#seenEventIdOrder.push(eventId);\n\n // LRU eviction if we've exceeded the limit\n while (this.#seenEventIds.size > this.#maxSeenEventIds) {\n const oldestId = this.#seenEventIdOrder.shift();\n if (oldestId) {\n this.#seenEventIds.delete(oldestId);\n }\n }\n\n // Track last eventId for replay positioning\n this.#lastEventId = eventId;\n }\n\n // Track last timestamp\n if (timestamp !== undefined) {\n this.#lastTimestamp = timestamp;\n }\n\n // Check for sequence gaps (out of order or missed events)\n if (this.#lastSequenceNumber >= 0 && sequenceNumber !== this.#lastSequenceNumber + 1) {\n console.warn(\n `MAP: Subscription ${this.id} sequence gap: expected ${this.#lastSequenceNumber + 1}, got ${sequenceNumber}`\n );\n }\n this.#lastSequenceNumber = sequenceNumber;\n\n // Notify event handlers (always, even when paused)\n for (const handler of this.#eventHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Event handler error:', error);\n }\n }\n\n // If there's a waiting iterator and not paused, resolve it directly\n if (this.#eventResolver && this.#state === 'active') {\n this.#eventResolver(event);\n this.#eventResolver = null;\n return;\n }\n\n // Otherwise buffer the event\n if (this.#eventQueue.length < this.#bufferSize) {\n this.#eventQueue.push(event);\n } else {\n // Buffer overflow - track and notify\n this.#totalDropped++;\n\n // Track oldest/newest dropped event IDs\n if (eventId) {\n if (this.#oldestDroppedId === undefined) {\n this.#oldestDroppedId = eventId;\n }\n this.#newestDroppedId = eventId;\n }\n\n // Notify overflow handlers\n const info: OverflowInfo = {\n eventsDropped: 1,\n oldestDroppedId: this.#oldestDroppedId,\n newestDroppedId: this.#newestDroppedId,\n timestamp: Date.now(),\n totalDropped: this.#totalDropped,\n };\n\n for (const handler of this.#overflowHandlers) {\n try {\n handler(info);\n } catch (error) {\n console.error('MAP: Overflow handler error:', error);\n }\n }\n\n console.warn(`MAP: Subscription ${this.id} buffer full, dropping event`);\n }\n }\n\n /**\n * Mark the subscription as closed (called by connection)\n * @internal\n */\n _close(): void {\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n }\n\n /**\n * Async iterator implementation\n */\n async *[Symbol.asyncIterator](): AsyncIterator<Event> {\n while (!this.isClosed) {\n // Wait while paused\n while (this.isPaused) {\n await new Promise<void>((resolve) => {\n this.#pauseResolver = resolve;\n });\n // Check if closed during pause - need to break out of both loops\n if (this.isClosed) {\n // Drain remaining buffered events before returning\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n return;\n }\n }\n\n // Return buffered events first\n if (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n continue;\n }\n\n // Wait for next event\n const event = await new Promise<Event | null>((resolve) => {\n this.#eventResolver = resolve;\n });\n\n if (event === null) {\n // Subscription closed\n break;\n }\n\n yield event;\n }\n\n // Drain remaining buffered events\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n }\n}\n\n/**\n * Create a subscription instance\n * @internal\n */\nexport function createSubscription(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options?: SubscriptionOptions,\n sendAck?: (params: SubscriptionAckParams) => void\n): Subscription {\n return new Subscription(id, unsubscribe, options, sendAck);\n}\n","/**\n * Base connection class for MAP protocol\n *\n * Handles JSON-RPC message correlation, request/response matching,\n * and connection lifecycle management.\n */\n\nimport type { Stream, AnyMessage } from '../stream';\nimport type { RequestId, MAPError } from '../types';\nimport {\n isRequest,\n isNotification,\n isResponse,\n isErrorResponse,\n createRequest,\n createNotification,\n createSuccessResponse,\n createErrorResponse,\n type JsonRpcRequest,\n type JsonRpcNotification,\n type JsonRpcResponse,\n} from '../jsonrpc';\nimport { MAPRequestError, MAPConnectionError, MAPTimeoutError } from '../errors';\n\n/**\n * Pending response tracker\n */\ninterface PendingResponse<T = unknown> {\n resolve: (result: T) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Handler for incoming requests\n */\nexport type RequestHandler = (\n method: string,\n params: unknown\n) => Promise<unknown>;\n\n/**\n * Handler for incoming notifications\n */\nexport type NotificationHandler = (\n method: string,\n params: unknown\n) => Promise<void>;\n\n/**\n * Connection state for tracking lifecycle\n */\nexport type ConnectionState =\n | 'initial'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'closed';\n\n/**\n * Handler for connection state changes\n */\nexport type StateChangeHandler = (\n newState: ConnectionState,\n oldState: ConnectionState\n) => void;\n\n/**\n * Options for base connection\n */\nexport interface BaseConnectionOptions {\n /** Default timeout for requests in milliseconds */\n defaultTimeout?: number;\n}\n\n/**\n * Base connection class providing JSON-RPC message handling.\n *\n * This class is used internally by the role-specific connection classes\n * (ClientConnection, AgentConnection, etc.)\n */\nexport class BaseConnection {\n #stream: Stream;\n readonly #pendingResponses: Map<RequestId, PendingResponse> = new Map();\n readonly #abortController: AbortController = new AbortController();\n readonly #closedPromise: Promise<void>;\n readonly #defaultTimeout: number;\n readonly #stateChangeHandlers: Set<StateChangeHandler> = new Set();\n\n #nextRequestId: number = 1;\n #writeQueue: Promise<void> = Promise.resolve();\n #requestHandler: RequestHandler | null = null;\n #notificationHandler: NotificationHandler | null = null;\n #closed = false;\n #closeResolver!: () => void;\n #state: ConnectionState = 'initial';\n\n constructor(stream: Stream, options: BaseConnectionOptions = {}) {\n this.#stream = stream;\n this.#defaultTimeout = options.defaultTimeout ?? 30000;\n\n // Create closed promise\n this.#closedPromise = new Promise((resolve) => {\n this.#closeResolver = resolve;\n });\n\n // Start receiving messages\n void this.#startReceiving();\n }\n\n /**\n * AbortSignal that triggers when the connection closes.\n * Useful for cancelling operations tied to this connection.\n */\n get signal(): AbortSignal {\n return this.#abortController.signal;\n }\n\n /**\n * Promise that resolves when the connection is closed.\n */\n get closed(): Promise<void> {\n return this.#closedPromise;\n }\n\n /**\n * Whether the connection is closed\n */\n get isClosed(): boolean {\n return this.#closed;\n }\n\n /**\n * Set the handler for incoming requests\n */\n setRequestHandler(handler: RequestHandler): void {\n this.#requestHandler = handler;\n }\n\n /**\n * Set the handler for incoming notifications\n */\n setNotificationHandler(handler: NotificationHandler): void {\n this.#notificationHandler = handler;\n }\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#state;\n }\n\n /**\n * Register a handler for state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(handler: StateChangeHandler): () => void {\n this.#stateChangeHandlers.add(handler);\n return () => this.#stateChangeHandlers.delete(handler);\n }\n\n /**\n * Transition to a new state and notify handlers.\n * @internal\n */\n _transitionTo(newState: ConnectionState): void {\n if (this.#state === newState) return;\n\n const oldState = this.#state;\n this.#state = newState;\n\n for (const handler of this.#stateChangeHandlers) {\n try {\n handler(newState, oldState);\n } catch (error) {\n console.error('MAP: State change handler error:', error);\n }\n }\n }\n\n /**\n * Reconnect with a new stream.\n *\n * This method is used by role-specific connections to replace the\n * underlying transport after a disconnect.\n *\n * @param newStream - The new stream to use\n * @throws If the connection is permanently closed\n */\n async reconnect(newStream: Stream): Promise<void> {\n if (this.#state === 'closed') {\n throw new Error('Cannot reconnect a permanently closed connection');\n }\n\n // Replace the stream\n this.#stream = newStream;\n this.#closed = false;\n\n // Reset the write queue\n this.#writeQueue = Promise.resolve();\n\n // Start receiving on the new stream\n void this.#startReceiving();\n\n this._transitionTo('connected');\n }\n\n /**\n * Send a request and wait for response\n */\n async sendRequest<TParams, TResult>(\n method: string,\n params?: TParams,\n options?: { timeout?: number }\n ): Promise<TResult> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const id = this.#nextRequestId++;\n const request = createRequest(id, method, params);\n\n const responsePromise = new Promise<TResult>((resolve, reject) => {\n const pending: PendingResponse<TResult> = { resolve, reject };\n\n // Set up timeout\n const timeout = options?.timeout ?? this.#defaultTimeout;\n if (timeout > 0) {\n pending.timeoutId = setTimeout(() => {\n this.#pendingResponses.delete(id);\n reject(new MAPTimeoutError(method, timeout));\n }, timeout);\n }\n\n this.#pendingResponses.set(id, pending as PendingResponse);\n });\n\n await this.#sendMessage(request as AnyMessage);\n\n return responsePromise;\n }\n\n /**\n * Send a notification (no response expected)\n */\n async sendNotification<TParams>(\n method: string,\n params?: TParams\n ): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const notification = createNotification(method, params);\n await this.#sendMessage(notification as AnyMessage);\n }\n\n /**\n * Send a response to a request\n */\n async sendResponse<TResult>(id: RequestId, result: TResult): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createSuccessResponse(id, result);\n await this.#sendMessage(response);\n }\n\n /**\n * Send an error response to a request\n */\n async sendErrorResponse(id: RequestId, error: MAPError): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createErrorResponse(id, error);\n await this.#sendMessage(response);\n }\n\n /**\n * Close the connection\n */\n async close(): Promise<void> {\n if (this.#closed) return;\n\n this.#closed = true;\n this._transitionTo('closed');\n this.#abortController.abort();\n\n // Reject all pending responses\n for (const [, pending] of this.#pendingResponses) {\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n pending.reject(MAPConnectionError.closed());\n }\n this.#pendingResponses.clear();\n\n // Close the stream\n try {\n const writer = this.#stream.writable.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Ignore close errors\n }\n\n this.#closeResolver();\n }\n\n /**\n * Start receiving messages from the stream\n */\n async #startReceiving(): Promise<void> {\n const reader = this.#stream.readable.getReader();\n\n try {\n while (!this.#closed) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n await this.#handleMessage(value);\n }\n } catch (error) {\n if (!this.#closed) {\n console.error('MAP: Error receiving message:', error);\n }\n } finally {\n reader.releaseLock();\n await this.close();\n }\n }\n\n /**\n * Handle an incoming message\n */\n async #handleMessage(message: AnyMessage): Promise<void> {\n try {\n if (isRequest(message)) {\n await this.#handleRequest(message);\n } else if (isNotification(message)) {\n await this.#handleNotification(message);\n } else if (isResponse(message)) {\n this.#handleResponse(message);\n } else {\n console.error('MAP: Unknown message type:', message);\n }\n } catch (error) {\n console.error('MAP: Error handling message:', error);\n }\n }\n\n /**\n * Handle an incoming request\n */\n async #handleRequest(request: JsonRpcRequest): Promise<void> {\n const { id, method, params } = request;\n\n if (!this.#requestHandler) {\n await this.sendErrorResponse(\n id,\n MAPRequestError.methodNotFound(method).toError()\n );\n return;\n }\n\n try {\n const result = await this.#requestHandler(method, params);\n await this.sendResponse(id, result ?? null);\n } catch (error) {\n if (error instanceof MAPRequestError) {\n await this.sendErrorResponse(id, error.toError());\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error';\n await this.sendErrorResponse(\n id,\n MAPRequestError.internalError(message).toError()\n );\n }\n }\n }\n\n /**\n * Handle an incoming notification\n */\n async #handleNotification(notification: JsonRpcNotification): Promise<void> {\n const { method, params } = notification;\n\n if (!this.#notificationHandler) {\n // Notifications are fire-and-forget, so just log\n console.warn('MAP: No notification handler for:', method);\n return;\n }\n\n try {\n await this.#notificationHandler(method, params);\n } catch (error) {\n console.error('MAP: Error handling notification:', method, error);\n }\n }\n\n /**\n * Handle an incoming response\n */\n #handleResponse(response: JsonRpcResponse): void {\n const { id } = response;\n const pending = this.#pendingResponses.get(id);\n\n if (!pending) {\n console.warn('MAP: Received response for unknown request:', id);\n return;\n }\n\n this.#pendingResponses.delete(id);\n\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n if (isErrorResponse(response)) {\n pending.reject(MAPRequestError.fromError(response.error));\n } else {\n pending.resolve(response.result);\n }\n }\n\n /**\n * Send a message through the stream with write queue serialization\n */\n async #sendMessage(message: AnyMessage): Promise<void> {\n this.#writeQueue = this.#writeQueue\n .then(async () => {\n if (this.#closed) return;\n\n const writer = this.#stream.writable.getWriter();\n try {\n await writer.write(message);\n } finally {\n writer.releaseLock();\n }\n })\n .catch((error) => {\n console.error('MAP: Write error:', error);\n });\n\n return this.#writeQueue;\n }\n}\n","/**\n * ULID utilities for MAP event IDs\n *\n * ULIDs (Universally Unique Lexicographically Sortable Identifiers) are:\n * - 26 characters, Crockford Base32 encoded\n * - Time-sortable (first 48 bits = millisecond timestamp)\n * - Lexicographically sortable (string comparison = chronological order)\n *\n * Format: TTTTTTTTTTRRRRRRRRRRRRRRR\n * |---------|-------------|\n * Timestamp Randomness\n * (10 chars) (16 chars)\n *\n * @example\n * ```typescript\n * import { ulid, ulidTimestamp, compareUlid } from './utils/ulid';\n *\n * const id = ulid(); // \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n * const ts = ulidTimestamp(id); // 1706123456789\n * ```\n */\n\n// Re-export from ulid package\nexport { ulid, monotonicFactory } from 'ulid';\n\n// Crockford Base32 alphabet used by ULID\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\nconst ENCODING_LEN = ENCODING.length; // 32\n\n/**\n * Extract the timestamp from a ULID.\n *\n * @param id - The ULID string\n * @returns Unix timestamp in milliseconds\n *\n * @example\n * ```typescript\n * const id = ulid();\n * const timestamp = ulidTimestamp(id);\n * console.log(new Date(timestamp));\n * ```\n */\nexport function ulidTimestamp(id: string): number {\n if (id.length !== 26) {\n throw new Error(`Invalid ULID: expected 26 characters, got ${id.length}`);\n }\n\n // Decode first 10 characters (timestamp portion)\n let time = 0;\n for (let i = 0; i < 10; i++) {\n const char = id[i].toUpperCase();\n const idx = ENCODING.indexOf(char);\n if (idx === -1) {\n throw new Error(`Invalid ULID character: ${char}`);\n }\n time = time * ENCODING_LEN + idx;\n }\n\n return time;\n}\n\n/**\n * Compare two ULIDs lexicographically.\n *\n * Since ULIDs are designed to be lexicographically sortable,\n * this comparison also gives chronological ordering.\n *\n * @param a - First ULID\n * @param b - Second ULID\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```typescript\n * const ids = [ulid(), ulid(), ulid()];\n * ids.sort(compareUlid); // Chronological order\n * ```\n */\nexport function compareUlid(a: string, b: string): number {\n return a.localeCompare(b);\n}\n\n/**\n * Check if a string is a valid ULID format.\n *\n * @param id - String to check\n * @returns True if valid ULID format\n */\nexport function isValidUlid(id: string): boolean {\n if (typeof id !== 'string' || id.length !== 26) {\n return false;\n }\n\n for (let i = 0; i < 26; i++) {\n if (ENCODING.indexOf(id[i].toUpperCase()) === -1) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Retry utilities with exponential backoff\n *\n * Provides configurable retry logic for handling transient failures\n * in network operations like reconnection.\n */\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryPolicy {\n /** Maximum number of retry attempts (default: 10) */\n maxRetries: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Add randomness to delay to prevent thundering herd (default: true) */\n jitter: boolean;\n /** Custom function to determine if an error is retryable */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Default retry policy with sensible defaults for network operations\n */\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 10,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitter: true,\n};\n\n/**\n * State passed to retry callbacks\n */\nexport interface RetryState {\n /** Current attempt number (1-indexed) */\n attempt: number;\n /** Delay before next retry in milliseconds */\n nextDelayMs: number;\n /** The error that caused this retry */\n lastError?: Error;\n}\n\n/**\n * Callbacks for monitoring retry progress\n */\nexport interface RetryCallbacks<T> {\n /** Called before each retry attempt */\n onRetry?: (state: RetryState) => void;\n /** Called on successful completion */\n onSuccess?: (result: T, attempts: number) => void;\n /** Called when all retries are exhausted */\n onFailure?: (error: Error, attempts: number) => void;\n}\n\n/**\n * Calculate delay for a retry attempt using exponential backoff.\n *\n * Formula: min(baseDelay * 2^(attempt-1), maxDelay) * jitter\n *\n * @param attempt - Current attempt number (1-indexed)\n * @param policy - Retry policy configuration\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * // With baseDelay=1000, maxDelay=30000:\n * // Attempt 1: 1000ms\n * // Attempt 2: 2000ms\n * // Attempt 3: 4000ms\n * // Attempt 4: 8000ms\n * // Attempt 5: 16000ms\n * // Attempt 6+: 30000ms (capped)\n * ```\n */\nexport function calculateDelay(attempt: number, policy: RetryPolicy): number {\n // Exponential backoff: baseDelay * 2^(attempt-1)\n let delay = Math.min(\n policy.baseDelayMs * Math.pow(2, attempt - 1),\n policy.maxDelayMs\n );\n\n // Add jitter: multiply by random factor between 0.5 and 1.5\n if (policy.jitter) {\n delay = delay * (0.5 + Math.random());\n }\n\n return Math.floor(delay);\n}\n\n/**\n * Execute an async operation with retry logic.\n *\n * Retries the operation on failure using exponential backoff until\n * either it succeeds or the maximum retries are exhausted.\n *\n * @param operation - Async function to execute\n * @param policy - Retry policy (defaults to DEFAULT_RETRY_POLICY)\n * @param callbacks - Optional callbacks for monitoring progress\n * @returns The result of the successful operation\n * @throws The last error if all retries are exhausted\n *\n * @example\n * ```typescript\n * const result = await withRetry(\n * () => fetch('https://api.example.com/data'),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true },\n * {\n * onRetry: ({ attempt, nextDelayMs }) => {\n * console.log(`Retry ${attempt}, waiting ${nextDelayMs}ms`);\n * },\n * }\n * );\n * ```\n */\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY,\n callbacks?: RetryCallbacks<T>\n): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= policy.maxRetries + 1; attempt++) {\n try {\n const result = await operation();\n callbacks?.onSuccess?.(result, attempt);\n return result;\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n const isRetryable = policy.isRetryable?.(lastError) ?? true;\n const hasMoreAttempts = attempt <= policy.maxRetries;\n\n if (!isRetryable || !hasMoreAttempts) {\n break;\n }\n\n // Calculate delay and wait\n const delay = calculateDelay(attempt, policy);\n\n callbacks?.onRetry?.({\n attempt,\n nextDelayMs: delay,\n lastError,\n });\n\n await sleep(delay);\n }\n }\n\n callbacks?.onFailure?.(lastError!, policy.maxRetries + 1);\n throw lastError;\n}\n\n/**\n * Create a retryable wrapper around an async function.\n *\n * Returns a new function with the same signature that automatically\n * retries on failure according to the policy.\n *\n * @param fn - Async function to wrap\n * @param policy - Retry policy\n * @returns Wrapped function with retry behavior\n *\n * @example\n * ```typescript\n * const fetchWithRetry = retryable(\n * async (url: string) => fetch(url),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true }\n * );\n *\n * const response = await fetchWithRetry('https://api.example.com');\n * ```\n */\nexport function retryable<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY\n): (...args: TArgs) => Promise<TResult> {\n return (...args: TArgs) => withRetry(() => fn(...args), policy);\n}\n\n/**\n * Create a partial retry policy merged with defaults.\n *\n * @param options - Partial policy options to override defaults\n * @returns Complete retry policy\n */\nexport function createRetryPolicy(\n options: Partial<RetryPolicy> = {}\n): RetryPolicy {\n return { ...DEFAULT_RETRY_POLICY, ...options };\n}\n\n/**\n * Sleep for a specified duration.\n *\n * @param ms - Duration in milliseconds\n * @returns Promise that resolves after the duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Causal Event Buffer\n *\n * Buffers events and releases them in causal order. Events with `causedBy`\n * dependencies are held until all their predecessor events have been seen.\n *\n * This is useful for:\n * - Ensuring events are processed in correct causal order\n * - Handling out-of-order event delivery\n * - Building consistent views from event streams\n */\n\nimport type { Event } from '../types';\n\n/**\n * Event with envelope metadata for causal tracking\n */\nexport interface CausalEvent {\n /** Unique event identifier */\n eventId: string;\n /** Event IDs that must be processed before this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n /** Timestamp when the event was received */\n receivedAt?: number;\n}\n\n/**\n * Mode for handling events with multiple causal dependencies.\n * - \"all\": Wait for ALL causes before releasing (stricter, default)\n * - \"any\": Release when ANY cause is seen (more permissive)\n */\nexport type MultiCauseMode = \"all\" | \"any\";\n\n/**\n * Options for CausalEventBuffer\n */\nexport interface CausalEventBufferOptions {\n /**\n * Maximum time (ms) to wait for causal predecessors before releasing anyway.\n * Default: 5000ms. Set to 0 or Infinity to wait indefinitely.\n */\n maxWaitTime?: number;\n\n /**\n * Maximum number of events to buffer before force-releasing oldest.\n * Default: 1000. Prevents unbounded memory growth.\n */\n maxBufferSize?: number;\n\n /**\n * Mode for handling events with multiple causes.\n * - \"all\" (default): Wait for ALL causes before releasing\n * - \"any\": Release when ANY cause is seen\n */\n multiCauseMode?: MultiCauseMode;\n\n /**\n * Callback when an event is released despite missing predecessors (timeout or buffer overflow).\n */\n onForcedRelease?: (event: CausalEvent, missingPredecessors: string[]) => void;\n}\n\n/**\n * Result from pushing an event to the buffer\n */\nexport interface CausalBufferPushResult {\n /** Events that are now ready to be processed in causal order */\n ready: CausalEvent[];\n /** Number of events still waiting for predecessors */\n pending: number;\n}\n\n/**\n * Buffers events and releases them in causal order.\n *\n * Events with `causedBy` dependencies are held until all predecessor events\n * have been seen (pushed to the buffer). Events without dependencies are\n * released immediately.\n *\n * @example\n * ```typescript\n * const buffer = new CausalEventBuffer();\n *\n * // Event B depends on A, but arrives first\n * let result = buffer.push({\n * eventId: 'B',\n * causedBy: ['A'],\n * event: { id: 'B', type: 'effect', timestamp: 2 }\n * });\n * console.log(result.ready); // [] - B is waiting for A\n * console.log(result.pending); // 1\n *\n * // Event A arrives\n * result = buffer.push({\n * eventId: 'A',\n * event: { id: 'A', type: 'cause', timestamp: 1 }\n * });\n * console.log(result.ready); // [A, B] - Both released in order\n * console.log(result.pending); // 0\n * ```\n */\nexport class CausalEventBuffer {\n readonly #options: Required<Omit<CausalEventBufferOptions, 'onForcedRelease'>> & {\n onForcedRelease?: CausalEventBufferOptions['onForcedRelease'];\n };\n\n /** Events seen (by eventId) - used to check if predecessors exist */\n readonly #seen: Set<string> = new Set();\n\n /** Events waiting for predecessors */\n readonly #pending: Map<string, CausalEvent> = new Map();\n\n /** Map from eventId to events waiting for it */\n readonly #waitingFor: Map<string, Set<string>> = new Map();\n\n constructor(options: CausalEventBufferOptions = {}) {\n this.#options = {\n maxWaitTime: options.maxWaitTime ?? 5000,\n maxBufferSize: options.maxBufferSize ?? 1000,\n multiCauseMode: options.multiCauseMode ?? \"all\",\n onForcedRelease: options.onForcedRelease,\n };\n }\n\n /**\n * Get the current multi-cause mode.\n */\n get multiCauseMode(): MultiCauseMode {\n return this.#options.multiCauseMode;\n }\n\n /**\n * Push an event into the buffer.\n *\n * @param event - The event to buffer\n * @returns Events that are ready to be processed (in causal order)\n */\n push(event: CausalEvent): CausalBufferPushResult {\n const ready: CausalEvent[] = [];\n\n // Check if we've already seen this event (deduplication)\n if (this.#seen.has(event.eventId)) {\n return { ready, pending: this.#pending.size };\n }\n\n // Mark as seen\n this.#seen.add(event.eventId);\n\n // Add received timestamp if not present\n if (!event.receivedAt) {\n event = { ...event, receivedAt: Date.now() };\n }\n\n // Check if predecessors are satisfied based on multi-cause mode\n const shouldRelease = this.#shouldReleaseEvent(event);\n\n if (shouldRelease) {\n // No dependencies or dependencies satisfied - release immediately\n ready.push(event);\n\n // Check if this event unblocks any pending events\n this.#releaseWaiting(event.eventId, ready);\n } else {\n // Wait for predecessors\n this.#pending.set(event.eventId, event);\n\n // Track what this event is waiting for\n const predecessors = event.causedBy ?? [];\n for (const predecessorId of predecessors) {\n if (!this.#waitingFor.has(predecessorId)) {\n this.#waitingFor.set(predecessorId, new Set());\n }\n this.#waitingFor.get(predecessorId)!.add(event.eventId);\n }\n }\n\n // Check for buffer overflow\n this.#handleBufferOverflow(ready);\n\n // Check for timeouts\n this.#handleTimeouts(ready);\n\n return { ready, pending: this.#pending.size };\n }\n\n /**\n * Get the number of events waiting for predecessors\n */\n get pendingCount(): number {\n return this.#pending.size;\n }\n\n /**\n * Get the number of unique events seen\n */\n get seenCount(): number {\n return this.#seen.size;\n }\n\n /**\n * Check if a specific event has been seen\n */\n hasSeen(eventId: string): boolean {\n return this.#seen.has(eventId);\n }\n\n /**\n * Force release all pending events, regardless of missing predecessors.\n * Useful for cleanup or when you know no more events are coming.\n *\n * @returns All pending events in the order they would be released\n */\n flush(): CausalEvent[] {\n const ready: CausalEvent[] = [];\n\n // Release all pending events, trying to maintain some order\n // Sort by receivedAt to release in arrival order\n const pendingList = Array.from(this.#pending.values()).sort(\n (a, b) => (a.receivedAt ?? 0) - (b.receivedAt ?? 0)\n );\n\n for (const event of pendingList) {\n const missingPredecessors = this.#getMissingPredecessors(event);\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n ready.push(event);\n }\n\n this.#pending.clear();\n this.#waitingFor.clear();\n\n return ready;\n }\n\n /**\n * Clear all state (seen events, pending events)\n */\n clear(): void {\n this.#seen.clear();\n this.#pending.clear();\n this.#waitingFor.clear();\n }\n\n /**\n * Check if an event should be released based on its predecessors and the multi-cause mode.\n */\n #shouldReleaseEvent(event: CausalEvent): boolean {\n if (!event.causedBy || event.causedBy.length === 0) {\n return true; // No dependencies - release immediately\n }\n\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n if (this.#options.multiCauseMode === \"any\") {\n // \"any\" mode: release if ANY predecessor is satisfied (not missing)\n // If all are missing, we must wait\n return missingPredecessors.length < event.causedBy.length;\n } else {\n // \"all\" mode (default): release only if ALL predecessors are satisfied\n return missingPredecessors.length === 0;\n }\n }\n\n /**\n * Get missing predecessors for an event.\n * A predecessor is considered \"missing\" if it hasn't been released yet\n * (either not seen at all, or seen but still pending).\n */\n #getMissingPredecessors(event: CausalEvent): string[] {\n if (!event.causedBy || event.causedBy.length === 0) {\n return [];\n }\n\n return event.causedBy.filter((predecessorId) => {\n // Predecessor is missing if:\n // 1. We haven't seen it at all, OR\n // 2. We've seen it but it's still pending (waiting for its own predecessors)\n return !this.#seen.has(predecessorId) || this.#pending.has(predecessorId);\n });\n }\n\n /**\n * Release events that were waiting for a specific predecessor\n */\n #releaseWaiting(predecessorId: string, ready: CausalEvent[]): void {\n const waitingEventIds = this.#waitingFor.get(predecessorId);\n if (!waitingEventIds) return;\n\n // Remove this predecessor from the waiting map\n this.#waitingFor.delete(predecessorId);\n\n for (const waitingEventId of waitingEventIds) {\n const waitingEvent = this.#pending.get(waitingEventId);\n if (!waitingEvent) continue;\n\n // Check if predecessors are now satisfied (respects multi-cause mode)\n if (this.#shouldReleaseEvent(waitingEvent)) {\n // Predecessors satisfied - release this event\n this.#pending.delete(waitingEventId);\n\n // Clean up waiting entries for this event's other predecessors\n if (waitingEvent.causedBy) {\n for (const otherPredId of waitingEvent.causedBy) {\n if (otherPredId !== predecessorId) {\n const waiting = this.#waitingFor.get(otherPredId);\n if (waiting) {\n waiting.delete(waitingEventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(otherPredId);\n }\n }\n }\n }\n }\n\n ready.push(waitingEvent);\n\n // Recursively check if this event unblocks others\n this.#releaseWaiting(waitingEventId, ready);\n }\n }\n }\n\n /**\n * Handle buffer overflow by force-releasing oldest events\n */\n #handleBufferOverflow(ready: CausalEvent[]): void {\n while (this.#pending.size > this.#options.maxBufferSize) {\n // Find oldest pending event by receivedAt\n let oldest: CausalEvent | null = null;\n for (const event of this.#pending.values()) {\n if (!oldest || (event.receivedAt ?? 0) < (oldest.receivedAt ?? 0)) {\n oldest = event;\n }\n }\n\n if (oldest) {\n this.#forceRelease(oldest, ready);\n }\n }\n }\n\n /**\n * Handle events that have been waiting too long\n */\n #handleTimeouts(ready: CausalEvent[]): void {\n if (this.#options.maxWaitTime <= 0 || this.#options.maxWaitTime === Infinity) {\n return;\n }\n\n const now = Date.now();\n const toRelease: CausalEvent[] = [];\n\n for (const event of this.#pending.values()) {\n const waitTime = now - (event.receivedAt ?? now);\n if (waitTime >= this.#options.maxWaitTime) {\n toRelease.push(event);\n }\n }\n\n for (const event of toRelease) {\n this.#forceRelease(event, ready);\n }\n }\n\n /**\n * Force release an event despite missing predecessors\n */\n #forceRelease(event: CausalEvent, ready: CausalEvent[]): void {\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n // Remove from pending\n this.#pending.delete(event.eventId);\n\n // Remove from waiting lists\n for (const predecessorId of event.causedBy ?? []) {\n const waiting = this.#waitingFor.get(predecessorId);\n if (waiting) {\n waiting.delete(event.eventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(predecessorId);\n }\n }\n }\n\n // Notify callback\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n\n // Add to ready list\n ready.push(event);\n\n // Check if this unblocks others\n this.#releaseWaiting(event.eventId, ready);\n }\n}\n\n/**\n * Validate that events are in causal order.\n *\n * An event sequence is in causal order if no event appears before\n * any of its predecessors (events in its causedBy array).\n *\n * @param events - Events to validate\n * @returns True if events are in valid causal order\n *\n * @example\n * ```typescript\n * const events = [\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * ];\n * console.log(validateCausalOrder(events)); // true\n *\n * const badOrder = [\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'A', event: {...} }, // A should come before B\n * ];\n * console.log(validateCausalOrder(badOrder)); // false\n * ```\n */\nexport function validateCausalOrder(events: CausalEvent[]): boolean {\n const seen = new Set<string>();\n\n for (const event of events) {\n // Check all predecessors have been seen\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!seen.has(predecessorId)) {\n return false;\n }\n }\n }\n\n seen.add(event.eventId);\n }\n\n return true;\n}\n\n/**\n * Sort events into causal order using topological sort.\n *\n * If the events form a valid DAG (no cycles), returns them in an order\n * where no event appears before its predecessors. If there are cycles\n * or missing predecessors, throws an error.\n *\n * @param events - Events to sort\n * @returns Events in causal order\n * @throws If events contain cycles or reference missing predecessors\n *\n * @example\n * ```typescript\n * const unordered = [\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * ];\n * const ordered = sortCausalOrder(unordered);\n * // ordered = [A, B, C]\n * ```\n */\nexport function sortCausalOrder(events: CausalEvent[]): CausalEvent[] {\n const eventMap = new Map<string, CausalEvent>();\n for (const event of events) {\n eventMap.set(event.eventId, event);\n }\n\n const result: CausalEvent[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n\n function visit(eventId: string): void {\n if (visited.has(eventId)) return;\n\n if (visiting.has(eventId)) {\n throw new Error(`Cycle detected involving event: ${eventId}`);\n }\n\n const event = eventMap.get(eventId);\n if (!event) {\n throw new Error(`Missing event: ${eventId}`);\n }\n\n visiting.add(eventId);\n\n // Visit predecessors first\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!eventMap.has(predecessorId)) {\n throw new Error(`Missing predecessor: ${predecessorId} for event: ${eventId}`);\n }\n visit(predecessorId);\n }\n }\n\n visiting.delete(eventId);\n visited.add(eventId);\n result.push(event);\n }\n\n for (const event of events) {\n visit(event.eventId);\n }\n\n return result;\n}\n","/**\n * ACP (Agent Client Protocol) types for ACP-over-MAP tunneling.\n *\n * These types are bundled directly in the MAP SDK for simplicity,\n * enabling ACP semantics to be preserved when routing through MAP.\n *\n * @see https://agentclientprotocol.com/\n * @module\n */\n\n// =============================================================================\n// Core ID Types\n// =============================================================================\n\n/**\n * A unique identifier for a conversation session.\n */\nexport type ACPSessionId = string;\n\n/**\n * JSON-RPC request ID.\n */\nexport type ACPRequestId = string | number | null;\n\n/**\n * Protocol version identifier.\n */\nexport type ACPProtocolVersion = number;\n\n/**\n * Unique identifier for a tool call within a session.\n */\nexport type ACPToolCallId = string;\n\n/**\n * Unique identifier for a permission option.\n */\nexport type ACPPermissionOptionId = string;\n\n/**\n * Unique identifier for a session mode.\n */\nexport type ACPSessionModeId = string;\n\n// =============================================================================\n// JSON-RPC Base Types\n// =============================================================================\n\n/**\n * ACP JSON-RPC request structure.\n */\nexport interface ACPRequest<TParams = unknown> {\n jsonrpc: \"2.0\";\n id: ACPRequestId;\n method: string;\n params?: TParams;\n}\n\n/**\n * ACP JSON-RPC notification structure (no response expected).\n */\nexport interface ACPNotification<TParams = unknown> {\n jsonrpc: \"2.0\";\n method: string;\n params?: TParams;\n}\n\n/**\n * ACP JSON-RPC success response structure.\n */\nexport interface ACPSuccessResponse<TResult = unknown> {\n jsonrpc: \"2.0\";\n id: ACPRequestId;\n result: TResult;\n}\n\n/**\n * ACP JSON-RPC error object.\n */\nexport interface ACPErrorObject {\n code: ACPErrorCode;\n message: string;\n data?: unknown;\n}\n\n/**\n * ACP JSON-RPC error response structure.\n */\nexport interface ACPErrorResponse {\n jsonrpc: \"2.0\";\n id: ACPRequestId;\n error: ACPErrorObject;\n}\n\n/**\n * Union of all ACP JSON-RPC response types.\n */\nexport type ACPResponse<TResult = unknown> =\n | ACPSuccessResponse<TResult>\n | ACPErrorResponse;\n\n/**\n * Union of all ACP JSON-RPC message types.\n */\nexport type ACPMessage =\n | ACPRequest\n | ACPNotification\n | ACPSuccessResponse\n | ACPErrorResponse;\n\n// =============================================================================\n// Error Codes\n// =============================================================================\n\n/**\n * Predefined ACP error codes following JSON-RPC specification.\n */\nexport type ACPErrorCode =\n | -32700 // Parse error\n | -32600 // Invalid request\n | -32601 // Method not found\n | -32602 // Invalid params\n | -32603 // Internal error\n | -32800 // Request cancelled\n | -32000 // Auth required\n | -32002 // Session not found\n | number; // Custom codes\n\n/**\n * Standard ACP error codes with semantic names.\n */\nexport const ACP_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n REQUEST_CANCELLED: -32800,\n AUTH_REQUIRED: -32000,\n SESSION_NOT_FOUND: -32002,\n} as const;\n\n// =============================================================================\n// Error Class\n// =============================================================================\n\n/**\n * Error class for ACP protocol errors.\n * Preserves the original ACP error code and data.\n */\nexport class ACPError extends Error {\n readonly code: ACPErrorCode;\n readonly data?: unknown;\n\n constructor(code: ACPErrorCode, message: string, data?: unknown) {\n super(message);\n this.name = \"ACPError\";\n this.code = code;\n this.data = data;\n }\n\n /**\n * Create an ACPError from an error response.\n */\n static fromResponse(error: ACPErrorObject): ACPError {\n return new ACPError(error.code, error.message, error.data);\n }\n\n /**\n * Convert to JSON-RPC error object.\n */\n toErrorObject(): ACPErrorObject {\n return {\n code: this.code,\n message: this.message,\n ...(this.data !== undefined && { data: this.data }),\n };\n }\n}\n\n// =============================================================================\n// Meta Extension\n// =============================================================================\n\n/**\n * The _meta property for ACP extensibility.\n */\nexport type ACPMeta = {\n [key: string]: unknown;\n} | null;\n\n// =============================================================================\n// Implementation Info\n// =============================================================================\n\n/**\n * Metadata about the implementation of a client or agent.\n */\nexport interface ACPImplementation {\n _meta?: ACPMeta;\n /** Programmatic name of the implementation. */\n name: string;\n /** Human-readable title for display. */\n title?: string | null;\n /** Version string (e.g., \"1.0.0\"). */\n version: string;\n}\n\n// =============================================================================\n// Capabilities\n// =============================================================================\n\n/**\n * File system capabilities supported by the client.\n */\nexport interface ACPFileSystemCapability {\n _meta?: ACPMeta;\n /** Whether the client supports fs/read_text_file. */\n readTextFile?: boolean;\n /** Whether the client supports fs/write_text_file. */\n writeTextFile?: boolean;\n}\n\n/**\n * Capabilities supported by the client.\n */\nexport interface ACPClientCapabilities {\n _meta?: ACPMeta;\n /** File system capabilities. */\n fs?: ACPFileSystemCapability;\n /** Whether the client supports terminal methods. */\n terminal?: boolean;\n}\n\n/**\n * Prompt capabilities supported by the agent.\n */\nexport interface ACPPromptCapabilities {\n _meta?: ACPMeta;\n /** Agent supports audio content. */\n audio?: boolean;\n /** Agent supports embedded resource context. */\n embeddedContext?: boolean;\n /** Agent supports image content. */\n image?: boolean;\n}\n\n/**\n * MCP capabilities supported by the agent.\n */\nexport interface ACPMcpCapabilities {\n _meta?: ACPMeta;\n /** Agent supports HTTP MCP servers. */\n http?: boolean;\n /** Agent supports SSE MCP servers. */\n sse?: boolean;\n}\n\n/**\n * Session capabilities supported by the agent.\n */\nexport interface ACPSessionCapabilities {\n _meta?: ACPMeta;\n /** Whether the agent supports session/fork. */\n fork?: { _meta?: ACPMeta } | null;\n /** Whether the agent supports session/list. */\n list?: { _meta?: ACPMeta } | null;\n /** Whether the agent supports session/resume. */\n resume?: { _meta?: ACPMeta } | null;\n}\n\n/**\n * Capabilities supported by the agent.\n */\nexport interface ACPAgentCapabilities {\n _meta?: ACPMeta;\n /** Whether the agent supports session/load. */\n loadSession?: boolean;\n /** MCP capabilities. */\n mcpCapabilities?: ACPMcpCapabilities;\n /** Prompt capabilities. */\n promptCapabilities?: ACPPromptCapabilities;\n /** Session capabilities. */\n sessionCapabilities?: ACPSessionCapabilities;\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * Describes an available authentication method.\n */\nexport interface ACPAuthMethod {\n _meta?: ACPMeta;\n /** Unique identifier for this auth method. */\n id: string;\n /** Human-readable name. */\n name: string;\n /** Optional description. */\n description?: string | null;\n}\n\n// =============================================================================\n// Initialize\n// =============================================================================\n\n/**\n * Request parameters for the initialize method.\n */\nexport interface ACPInitializeRequest {\n _meta?: ACPMeta;\n /** The latest protocol version supported by the client. */\n protocolVersion: ACPProtocolVersion;\n /** Information about the client implementation. */\n clientInfo?: ACPImplementation | null;\n /** Capabilities supported by the client. */\n clientCapabilities?: ACPClientCapabilities;\n}\n\n/**\n * Response to the initialize method.\n */\nexport interface ACPInitializeResponse {\n _meta?: ACPMeta;\n /** The negotiated protocol version. */\n protocolVersion: ACPProtocolVersion;\n /** Information about the agent implementation. */\n agentInfo?: ACPImplementation | null;\n /** Capabilities supported by the agent. */\n agentCapabilities?: ACPAgentCapabilities;\n /** Available authentication methods. */\n authMethods?: ACPAuthMethod[];\n}\n\n// =============================================================================\n// Authenticate\n// =============================================================================\n\n/**\n * Request parameters for the authenticate method.\n */\nexport interface ACPAuthenticateRequest {\n _meta?: ACPMeta;\n /** The ID of the authentication method to use. */\n methodId: string;\n}\n\n/**\n * Response to the authenticate method.\n */\nexport interface ACPAuthenticateResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// MCP Server Configuration\n// =============================================================================\n\n/**\n * Environment variable for MCP server configuration.\n */\nexport interface ACPEnvVariable {\n _meta?: ACPMeta;\n name: string;\n value: string;\n}\n\n/**\n * HTTP header for MCP server configuration.\n */\nexport interface ACPHttpHeader {\n _meta?: ACPMeta;\n name: string;\n value: string;\n}\n\n/**\n * Stdio transport configuration for MCP.\n */\nexport interface ACPMcpServerStdio {\n _meta?: ACPMeta;\n name: string;\n command: string;\n args: string[];\n env: ACPEnvVariable[];\n}\n\n/**\n * HTTP transport configuration for MCP.\n */\nexport interface ACPMcpServerHttp {\n _meta?: ACPMeta;\n type: \"http\";\n name: string;\n url: string;\n headers: ACPHttpHeader[];\n}\n\n/**\n * SSE transport configuration for MCP.\n */\nexport interface ACPMcpServerSse {\n _meta?: ACPMeta;\n type: \"sse\";\n name: string;\n url: string;\n headers: ACPHttpHeader[];\n}\n\n/**\n * MCP server configuration (union of all transport types).\n */\nexport type ACPMcpServer = ACPMcpServerStdio | ACPMcpServerHttp | ACPMcpServerSse;\n\n// =============================================================================\n// Session Mode\n// =============================================================================\n\n/**\n * A mode the agent can operate in.\n */\nexport interface ACPSessionMode {\n _meta?: ACPMeta;\n id: ACPSessionModeId;\n name: string;\n description?: string | null;\n}\n\n/**\n * The set of modes and the currently active one.\n */\nexport interface ACPSessionModeState {\n _meta?: ACPMeta;\n availableModes: ACPSessionMode[];\n currentModeId: ACPSessionModeId;\n}\n\n// =============================================================================\n// Session Management\n// =============================================================================\n\n/**\n * Request parameters for creating a new session.\n */\nexport interface ACPNewSessionRequest {\n _meta?: ACPMeta;\n /** The working directory for this session. */\n cwd: string;\n /** List of MCP servers to connect to. */\n mcpServers: ACPMcpServer[];\n}\n\n/**\n * Response from creating a new session.\n */\nexport interface ACPNewSessionResponse {\n _meta?: ACPMeta;\n /** Unique identifier for the created session. */\n sessionId: ACPSessionId;\n /** Initial mode state if supported. */\n modes?: ACPSessionModeState | null;\n}\n\n/**\n * Request parameters for loading an existing session.\n */\nexport interface ACPLoadSessionRequest {\n _meta?: ACPMeta;\n /** The ID of the session to load. */\n sessionId: ACPSessionId;\n /** The working directory for this session. */\n cwd: string;\n /** List of MCP servers to connect to. */\n mcpServers: ACPMcpServer[];\n}\n\n/**\n * Response from loading an existing session.\n */\nexport interface ACPLoadSessionResponse {\n _meta?: ACPMeta;\n /** Mode state if supported. */\n modes?: ACPSessionModeState | null;\n}\n\n/**\n * Request parameters for setting a session mode.\n */\nexport interface ACPSetSessionModeRequest {\n _meta?: ACPMeta;\n /** The ID of the session. */\n sessionId: ACPSessionId;\n /** The ID of the mode to set. */\n modeId: ACPSessionModeId;\n}\n\n/**\n * Response to session/set_mode method.\n */\nexport interface ACPSetSessionModeResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// Content Types\n// =============================================================================\n\n/**\n * Optional annotations for content.\n */\nexport interface ACPAnnotations {\n _meta?: ACPMeta;\n audience?: ACPRole[] | null;\n lastModified?: string | null;\n priority?: number | null;\n}\n\n/**\n * Role in a conversation.\n */\nexport type ACPRole = \"assistant\" | \"user\";\n\n/**\n * Text content block.\n */\nexport interface ACPTextContent {\n _meta?: ACPMeta;\n type: \"text\";\n text: string;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Image content block.\n */\nexport interface ACPImageContent {\n _meta?: ACPMeta;\n type: \"image\";\n data: string;\n mimeType: string;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Audio content block.\n */\nexport interface ACPAudioContent {\n _meta?: ACPMeta;\n type: \"audio\";\n data: string;\n mimeType: string;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Resource link content block.\n */\nexport interface ACPResourceLink {\n _meta?: ACPMeta;\n type: \"resource_link\";\n uri: string;\n name: string;\n title?: string | null;\n description?: string | null;\n mimeType?: string | null;\n size?: number | null;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Text resource contents.\n */\nexport interface ACPTextResourceContents {\n _meta?: ACPMeta;\n uri: string;\n text: string;\n mimeType?: string | null;\n}\n\n/**\n * Binary resource contents.\n */\nexport interface ACPBlobResourceContents {\n _meta?: ACPMeta;\n uri: string;\n blob: string;\n mimeType?: string | null;\n}\n\n/**\n * Embedded resource content block.\n */\nexport interface ACPEmbeddedResource {\n _meta?: ACPMeta;\n type: \"resource\";\n resource: ACPTextResourceContents | ACPBlobResourceContents;\n annotations?: ACPAnnotations | null;\n}\n\n/**\n * Union of all content block types.\n */\nexport type ACPContentBlock =\n | ACPTextContent\n | ACPImageContent\n | ACPAudioContent\n | ACPResourceLink\n | ACPEmbeddedResource;\n\n// =============================================================================\n// Prompt\n// =============================================================================\n\n/**\n * Request parameters for sending a user prompt.\n */\nexport interface ACPPromptRequest {\n _meta?: ACPMeta;\n /** The ID of the session. */\n sessionId: ACPSessionId;\n /** The content blocks of the user's message. */\n prompt: ACPContentBlock[];\n}\n\n/**\n * Reasons why an agent stops processing.\n */\nexport type ACPStopReason =\n | \"end_turn\"\n | \"max_tokens\"\n | \"max_turn_requests\"\n | \"refusal\"\n | \"cancelled\";\n\n/**\n * Response from processing a user prompt.\n */\nexport interface ACPPromptResponse {\n _meta?: ACPMeta;\n /** Why the agent stopped processing. */\n stopReason: ACPStopReason;\n}\n\n// =============================================================================\n// Cancel\n// =============================================================================\n\n/**\n * Notification to cancel ongoing operations for a session.\n */\nexport interface ACPCancelNotification {\n _meta?: ACPMeta;\n /** The ID of the session to cancel operations for. */\n sessionId: ACPSessionId;\n}\n\n// =============================================================================\n// Tool Call Types\n// =============================================================================\n\n/**\n * Categories of tools.\n */\nexport type ACPToolKind =\n | \"read\"\n | \"edit\"\n | \"delete\"\n | \"move\"\n | \"search\"\n | \"execute\"\n | \"think\"\n | \"fetch\"\n | \"switch_mode\"\n | \"other\";\n\n/**\n * Execution status of a tool call.\n */\nexport type ACPToolCallStatus = \"pending\" | \"in_progress\" | \"completed\" | \"failed\";\n\n/**\n * A file location being accessed by a tool.\n */\nexport interface ACPToolCallLocation {\n _meta?: ACPMeta;\n path: string;\n line?: number | null;\n}\n\n/**\n * A diff representing file modifications.\n */\nexport interface ACPDiff {\n _meta?: ACPMeta;\n path: string;\n oldText?: string | null;\n newText: string;\n}\n\n/**\n * Terminal reference.\n */\nexport interface ACPTerminal {\n _meta?: ACPMeta;\n terminalId: string;\n}\n\n/**\n * Standard content wrapper.\n */\nexport interface ACPContent {\n _meta?: ACPMeta;\n content: ACPContentBlock;\n}\n\n/**\n * Tool call content types.\n */\nexport type ACPToolCallContent =\n | (ACPContent & { type: \"content\" })\n | (ACPDiff & { type: \"diff\" })\n | (ACPTerminal & { type: \"terminal\" });\n\n/**\n * A tool call requested by the language model.\n */\nexport interface ACPToolCall {\n _meta?: ACPMeta;\n toolCallId: ACPToolCallId;\n title: string;\n kind?: ACPToolKind;\n status?: ACPToolCallStatus;\n rawInput?: unknown;\n rawOutput?: unknown;\n content?: ACPToolCallContent[];\n locations?: ACPToolCallLocation[];\n}\n\n/**\n * An update to an existing tool call.\n */\nexport interface ACPToolCallUpdate {\n _meta?: ACPMeta;\n toolCallId: ACPToolCallId;\n title?: string | null;\n kind?: ACPToolKind | null;\n status?: ACPToolCallStatus | null;\n rawInput?: unknown;\n rawOutput?: unknown;\n content?: ACPToolCallContent[] | null;\n locations?: ACPToolCallLocation[] | null;\n}\n\n// =============================================================================\n// Plan Types\n// =============================================================================\n\n/**\n * Priority levels for plan entries.\n */\nexport type ACPPlanEntryPriority = \"high\" | \"medium\" | \"low\";\n\n/**\n * Status of a plan entry.\n */\nexport type ACPPlanEntryStatus = \"pending\" | \"in_progress\" | \"completed\";\n\n/**\n * A single entry in the execution plan.\n */\nexport interface ACPPlanEntry {\n _meta?: ACPMeta;\n content: string;\n priority: ACPPlanEntryPriority;\n status: ACPPlanEntryStatus;\n}\n\n/**\n * An execution plan.\n */\nexport interface ACPPlan {\n _meta?: ACPMeta;\n entries: ACPPlanEntry[];\n}\n\n// =============================================================================\n// Session Update Types\n// =============================================================================\n\n/**\n * A streamed chunk of content.\n */\nexport interface ACPContentChunk {\n _meta?: ACPMeta;\n content: ACPContentBlock;\n}\n\n/**\n * Available command input type.\n */\nexport interface ACPUnstructuredCommandInput {\n _meta?: ACPMeta;\n}\n\n/**\n * Available command input.\n */\nexport type ACPAvailableCommandInput = ACPUnstructuredCommandInput;\n\n/**\n * Information about an available command.\n */\nexport interface ACPAvailableCommand {\n _meta?: ACPMeta;\n name: string;\n description: string;\n input?: ACPAvailableCommandInput | null;\n}\n\n/**\n * Available commands update.\n */\nexport interface ACPAvailableCommandsUpdate {\n _meta?: ACPMeta;\n availableCommands: ACPAvailableCommand[];\n}\n\n/**\n * Current mode update.\n */\nexport interface ACPCurrentModeUpdate {\n _meta?: ACPMeta;\n currentModeId: ACPSessionModeId;\n}\n\n/**\n * Session info update.\n */\nexport interface ACPSessionInfoUpdate {\n _meta?: ACPMeta;\n title?: string | null;\n updatedAt?: string | null;\n}\n\n/**\n * All session update types.\n */\nexport type ACPSessionUpdate =\n | (ACPContentChunk & { sessionUpdate: \"user_message_chunk\" })\n | (ACPContentChunk & { sessionUpdate: \"agent_message_chunk\" })\n | (ACPContentChunk & { sessionUpdate: \"agent_thought_chunk\" })\n | (ACPToolCall & { sessionUpdate: \"tool_call\" })\n | (ACPToolCallUpdate & { sessionUpdate: \"tool_call_update\" })\n | (ACPPlan & { sessionUpdate: \"plan\" })\n | (ACPAvailableCommandsUpdate & { sessionUpdate: \"available_commands_update\" })\n | (ACPCurrentModeUpdate & { sessionUpdate: \"current_mode_update\" })\n | (ACPSessionInfoUpdate & { sessionUpdate: \"session_info_update\" });\n\n/**\n * Session notification containing an update.\n */\nexport interface ACPSessionNotification {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n update: ACPSessionUpdate;\n}\n\n// =============================================================================\n// Permission Request\n// =============================================================================\n\n/**\n * Permission option kind.\n */\nexport type ACPPermissionOptionKind =\n | \"allow_once\"\n | \"allow_always\"\n | \"reject_once\"\n | \"reject_always\";\n\n/**\n * A permission option.\n */\nexport interface ACPPermissionOption {\n _meta?: ACPMeta;\n optionId: ACPPermissionOptionId;\n name: string;\n kind: ACPPermissionOptionKind;\n}\n\n/**\n * Request for user permission to execute a tool call.\n */\nexport interface ACPRequestPermissionRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n toolCall: ACPToolCallUpdate;\n options: ACPPermissionOption[];\n}\n\n/**\n * Permission outcome when user selected an option.\n */\nexport interface ACPSelectedPermissionOutcome {\n _meta?: ACPMeta;\n outcome: \"selected\";\n optionId: ACPPermissionOptionId;\n}\n\n/**\n * Permission outcome when cancelled.\n */\nexport interface ACPCancelledPermissionOutcome {\n outcome: \"cancelled\";\n}\n\n/**\n * Permission request outcome.\n */\nexport type ACPRequestPermissionOutcome =\n | ACPSelectedPermissionOutcome\n | ACPCancelledPermissionOutcome;\n\n/**\n * Response to a permission request.\n */\nexport interface ACPRequestPermissionResponse {\n _meta?: ACPMeta;\n outcome: ACPRequestPermissionOutcome;\n}\n\n// =============================================================================\n// File System\n// =============================================================================\n\n/**\n * Request to read content from a text file.\n */\nexport interface ACPReadTextFileRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n path: string;\n line?: number | null;\n limit?: number | null;\n}\n\n/**\n * Response containing file contents.\n */\nexport interface ACPReadTextFileResponse {\n _meta?: ACPMeta;\n content: string;\n}\n\n/**\n * Request to write content to a text file.\n */\nexport interface ACPWriteTextFileRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n path: string;\n content: string;\n}\n\n/**\n * Response to write text file.\n */\nexport interface ACPWriteTextFileResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// Terminal\n// =============================================================================\n\n/**\n * Request to create a new terminal.\n */\nexport interface ACPCreateTerminalRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n command: string;\n args?: string[];\n cwd?: string | null;\n env?: ACPEnvVariable[];\n outputByteLimit?: number | null;\n}\n\n/**\n * Response containing the terminal ID.\n */\nexport interface ACPCreateTerminalResponse {\n _meta?: ACPMeta;\n terminalId: string;\n}\n\n/**\n * Request to get terminal output.\n */\nexport interface ACPTerminalOutputRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Terminal exit status.\n */\nexport interface ACPTerminalExitStatus {\n _meta?: ACPMeta;\n exitCode?: number | null;\n signal?: string | null;\n}\n\n/**\n * Response containing terminal output.\n */\nexport interface ACPTerminalOutputResponse {\n _meta?: ACPMeta;\n output: string;\n truncated: boolean;\n exitStatus?: ACPTerminalExitStatus | null;\n}\n\n/**\n * Request to release a terminal.\n */\nexport interface ACPReleaseTerminalRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Response to release terminal.\n */\nexport interface ACPReleaseTerminalResponse {\n _meta?: ACPMeta;\n}\n\n/**\n * Request to wait for terminal exit.\n */\nexport interface ACPWaitForTerminalExitRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Response with terminal exit status.\n */\nexport interface ACPWaitForTerminalExitResponse {\n _meta?: ACPMeta;\n exitCode?: number | null;\n signal?: string | null;\n}\n\n/**\n * Request to kill a terminal command.\n */\nexport interface ACPKillTerminalCommandRequest {\n _meta?: ACPMeta;\n sessionId: ACPSessionId;\n terminalId: string;\n}\n\n/**\n * Response to kill terminal command.\n */\nexport interface ACPKillTerminalCommandResponse {\n _meta?: ACPMeta;\n}\n\n// =============================================================================\n// ACP-over-MAP Envelope\n// =============================================================================\n\n/**\n * Context for ACP messages tunneled through MAP.\n */\nexport interface ACPContext {\n /** Unique identifier for this virtual ACP stream. */\n streamId: string;\n /** ACP session ID (null before session/new is called). */\n sessionId: ACPSessionId | null;\n /** Direction of message flow. */\n direction: \"client-to-agent\" | \"agent-to-client\";\n /** Information about a pending client request (for agent→client requests). */\n pendingClientRequest?: {\n requestId: ACPRequestId;\n method: string;\n timeout?: number;\n };\n}\n\n/**\n * Envelope wrapping ACP JSON-RPC messages for transport through MAP.\n *\n * This is the payload format used when sending ACP messages via MAP's send().\n */\nexport interface ACPEnvelope {\n /**\n * The original ACP JSON-RPC message.\n */\n acp: {\n jsonrpc: \"2.0\";\n id?: ACPRequestId;\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: ACPErrorObject;\n };\n /**\n * ACP-specific routing context.\n */\n acpContext: ACPContext;\n}\n\n// =============================================================================\n// Client Handler Interfaces\n// =============================================================================\n\n/**\n * Handlers that the client provides for agent→client requests.\n */\nexport interface ACPClientHandlers {\n /**\n * Handle permission request from agent.\n */\n requestPermission(\n params: ACPRequestPermissionRequest\n ): Promise<ACPRequestPermissionResponse>;\n\n /**\n * Handle session update notification from agent.\n */\n sessionUpdate(params: ACPSessionNotification): Promise<void>;\n\n /**\n * Handle read text file request (optional, based on capabilities).\n */\n readTextFile?(\n params: ACPReadTextFileRequest\n ): Promise<ACPReadTextFileResponse>;\n\n /**\n * Handle write text file request (optional, based on capabilities).\n */\n writeTextFile?(\n params: ACPWriteTextFileRequest\n ): Promise<ACPWriteTextFileResponse>;\n\n /**\n * Handle create terminal request (optional, based on capabilities).\n */\n createTerminal?(\n params: ACPCreateTerminalRequest\n ): Promise<ACPCreateTerminalResponse>;\n\n /**\n * Handle terminal output request (optional, based on capabilities).\n */\n terminalOutput?(\n params: ACPTerminalOutputRequest\n ): Promise<ACPTerminalOutputResponse>;\n\n /**\n * Handle release terminal request (optional, based on capabilities).\n */\n releaseTerminal?(\n params: ACPReleaseTerminalRequest\n ): Promise<ACPReleaseTerminalResponse>;\n\n /**\n * Handle wait for terminal exit request (optional, based on capabilities).\n */\n waitForTerminalExit?(\n params: ACPWaitForTerminalExitRequest\n ): Promise<ACPWaitForTerminalExitResponse>;\n\n /**\n * Handle kill terminal command request (optional, based on capabilities).\n */\n killTerminal?(\n params: ACPKillTerminalCommandRequest\n ): Promise<ACPKillTerminalCommandResponse>;\n}\n\n// =============================================================================\n// Agent Handler Interfaces\n// =============================================================================\n\n/**\n * Context passed to agent handlers.\n */\nexport interface ACPAgentContext {\n /** The stream ID for this ACP session. */\n streamId: string;\n /** Current ACP session ID (null before newSession). */\n sessionId: ACPSessionId | null;\n /** The MAP participant ID of the client. */\n clientParticipantId: string;\n}\n\n/**\n * Handler interface for agents that support ACP.\n */\nexport interface ACPAgentHandler {\n /**\n * Handle initialize request.\n */\n initialize(\n params: ACPInitializeRequest,\n ctx: ACPAgentContext\n ): Promise<ACPInitializeResponse>;\n\n /**\n * Handle authenticate request (optional).\n */\n authenticate?(\n params: ACPAuthenticateRequest,\n ctx: ACPAgentContext\n ): Promise<ACPAuthenticateResponse>;\n\n /**\n * Handle new session request.\n */\n newSession(\n params: ACPNewSessionRequest,\n ctx: ACPAgentContext\n ): Promise<ACPNewSessionResponse>;\n\n /**\n * Handle load session request (optional).\n */\n loadSession?(\n params: ACPLoadSessionRequest,\n ctx: ACPAgentContext\n ): Promise<ACPLoadSessionResponse>;\n\n /**\n * Handle set session mode request (optional).\n */\n setSessionMode?(\n params: ACPSetSessionModeRequest,\n ctx: ACPAgentContext\n ): Promise<ACPSetSessionModeResponse>;\n\n /**\n * Handle prompt request.\n */\n prompt(\n params: ACPPromptRequest,\n ctx: ACPAgentContext\n ): Promise<ACPPromptResponse>;\n\n /**\n * Handle cancel notification.\n */\n cancel(params: ACPCancelNotification, ctx: ACPAgentContext): Promise<void>;\n}\n\n// =============================================================================\n// ACP Capability Constants\n// =============================================================================\n\n/**\n * Current stable ACP protocol version.\n */\nexport const ACP_PROTOCOL_VERSION = 20241007; // 2024-10-07\n\n/**\n * ACP method names.\n */\nexport const ACP_METHODS = {\n // Lifecycle\n INITIALIZE: \"initialize\",\n AUTHENTICATE: \"authenticate\",\n\n // Session management\n SESSION_NEW: \"session/new\",\n SESSION_LOAD: \"session/load\",\n SESSION_SET_MODE: \"session/set_mode\",\n\n // Prompt\n SESSION_PROMPT: \"session/prompt\",\n SESSION_CANCEL: \"session/cancel\",\n\n // Notifications\n SESSION_UPDATE: \"session/update\",\n\n // Agent→Client requests\n REQUEST_PERMISSION: \"request_permission\",\n FS_READ_TEXT_FILE: \"fs/read_text_file\",\n FS_WRITE_TEXT_FILE: \"fs/write_text_file\",\n TERMINAL_CREATE: \"terminal/create\",\n TERMINAL_OUTPUT: \"terminal/output\",\n TERMINAL_RELEASE: \"terminal/release\",\n TERMINAL_WAIT_FOR_EXIT: \"terminal/wait_for_exit\",\n TERMINAL_KILL: \"terminal/kill\",\n} as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a message is an ACP request.\n */\nexport function isACPRequest(msg: ACPMessage): msg is ACPRequest {\n if (typeof msg !== \"object\" || msg === null) {\n return false;\n }\n return \"method\" in msg && \"id\" in msg && msg.id !== undefined;\n}\n\n/**\n * Check if a message is an ACP notification.\n */\nexport function isACPNotification(msg: ACPMessage): msg is ACPNotification {\n if (typeof msg !== \"object\" || msg === null) {\n return false;\n }\n return \"method\" in msg && !(\"id\" in msg);\n}\n\n/**\n * Check if a message is an ACP response.\n */\nexport function isACPResponse(msg: ACPMessage): msg is ACPResponse {\n if (typeof msg !== \"object\" || msg === null) {\n return false;\n }\n return \"id\" in msg && !(\"method\" in msg);\n}\n\n/**\n * Check if a response is an error response.\n */\nexport function isACPErrorResponse(\n response: ACPResponse\n): response is ACPErrorResponse {\n if (typeof response !== \"object\" || response === null) {\n return false;\n }\n return \"error\" in response;\n}\n\n/**\n * Check if a response is a success response.\n */\nexport function isACPSuccessResponse<T>(\n response: ACPResponse<T>\n): response is ACPSuccessResponse<T> {\n if (typeof response !== \"object\" || response === null) {\n return false;\n }\n return \"result\" in response;\n}\n\n/**\n * Check if a payload is an ACP envelope.\n */\nexport function isACPEnvelope(payload: unknown): payload is ACPEnvelope {\n if (typeof payload !== \"object\" || payload === null) {\n return false;\n }\n const envelope = payload as Record<string, unknown>;\n if (\n typeof envelope.acp !== \"object\" ||\n envelope.acp === null ||\n typeof envelope.acpContext !== \"object\" ||\n envelope.acpContext === null\n ) {\n return false;\n }\n // Validate acpContext has required streamId\n const acpContext = envelope.acpContext as Record<string, unknown>;\n return typeof acpContext.streamId === \"string\";\n}\n","/**\n * ACPStreamConnection - Client-side virtual ACP connection over MAP.\n *\n * Provides a familiar ACP interface while using MAP's send/subscribe\n * primitives for transport. Supports request/response correlation,\n * timeout handling, and session lifecycle management.\n *\n * @module\n */\n\nimport { EventEmitter } from \"events\";\nimport type { ClientConnection } from \"../connection/client\";\nimport type { Subscription } from \"../subscription\";\nimport type { AgentId, Message } from \"../types\";\nimport {\n type ACPSessionId,\n type ACPRequestId,\n type ACPEnvelope,\n type ACPContext,\n type ACPClientHandlers,\n type ACPAgentCapabilities,\n type ACPInitializeRequest,\n type ACPInitializeResponse,\n type ACPAuthenticateRequest,\n type ACPAuthenticateResponse,\n type ACPNewSessionRequest,\n type ACPNewSessionResponse,\n type ACPLoadSessionRequest,\n type ACPLoadSessionResponse,\n type ACPSetSessionModeRequest,\n type ACPSetSessionModeResponse,\n type ACPPromptRequest,\n type ACPPromptResponse,\n type ACPCancelNotification,\n type ACPSessionNotification,\n type ACPRequestPermissionRequest,\n type ACPReadTextFileRequest,\n type ACPWriteTextFileRequest,\n type ACPCreateTerminalRequest,\n type ACPTerminalOutputRequest,\n type ACPReleaseTerminalRequest,\n type ACPWaitForTerminalExitRequest,\n type ACPKillTerminalCommandRequest,\n ACPError,\n ACP_METHODS,\n isACPEnvelope,\n} from \"./types\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for creating an ACP stream connection.\n */\nexport interface ACPStreamOptions {\n /** Target agent that will handle ACP requests */\n targetAgent: AgentId;\n /** Client-side handlers for agent→client requests */\n client: ACPClientHandlers;\n /** Optional: expose MAP events alongside ACP (for observability) */\n exposeMapEvents?: boolean;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * Pending request state for correlation.\n */\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n method: string;\n}\n\n/**\n * Events emitted by ACPStreamConnection.\n */\nexport interface ACPStreamEvents {\n /** Emitted when ACP session is lost after reconnection */\n sessionLost: (info: { sessionId: ACPSessionId; reason: string }) => void;\n /** Emitted when the stream successfully reconnects */\n reconnected: () => void;\n /** Emitted when reconnection is in progress */\n reconnecting: () => void;\n /** Emitted when the stream is closed */\n close: () => void;\n /** Emitted on errors */\n error: (error: Error) => void;\n}\n\n// =============================================================================\n// ACPStreamConnection\n// =============================================================================\n\n/**\n * Virtual ACP connection over MAP.\n *\n * Provides the full ACP client interface, routing all requests through\n * the underlying MAP connection to a target agent.\n *\n * @example\n * ```typescript\n * const acp = new ACPStreamConnection(mapClient, {\n * targetAgent: 'coding-agent-1',\n * client: {\n * requestPermission: async (req) => ({ outcome: { outcome: 'selected', optionId: 'allow' } }),\n * sessionUpdate: async (update) => { console.log(update); },\n * }\n * });\n *\n * await acp.initialize({ protocolVersion: 20241007, clientInfo: { name: 'IDE', version: '1.0' } });\n * const { sessionId } = await acp.newSession({ cwd: '/project', mcpServers: [] });\n * const result = await acp.prompt({ sessionId, prompt: [{ type: 'text', text: 'Hello' }] });\n * ```\n */\nexport class ACPStreamConnection extends EventEmitter {\n readonly #mapClient: ClientConnection;\n readonly #options: ACPStreamOptions;\n readonly #streamId: string;\n readonly #pendingRequests: Map<string, PendingRequest> = new Map();\n\n #subscription: Subscription | null = null;\n #sessionId: ACPSessionId | null = null;\n #initialized = false;\n #capabilities: ACPAgentCapabilities | null = null;\n #closed = false;\n #lastEventId: string | null = null;\n #isReconnecting = false;\n #unsubscribeReconnection: (() => void) | null = null;\n\n /**\n * Create a new ACP stream connection.\n *\n * @param mapClient - The underlying MAP client connection\n * @param options - Stream configuration options\n */\n constructor(mapClient: ClientConnection, options: ACPStreamOptions) {\n super();\n this.#mapClient = mapClient;\n this.#options = options;\n this.#streamId = `acp-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Listen for MAP reconnection events\n this.#unsubscribeReconnection = mapClient.onReconnection((event) => {\n void this.#handleReconnectionEvent(event);\n });\n }\n\n // ===========================================================================\n // Public Properties\n // ===========================================================================\n\n /** Unique identifier for this ACP stream */\n get streamId(): string {\n return this.#streamId;\n }\n\n /** Target agent this stream connects to */\n get targetAgent(): AgentId {\n return this.#options.targetAgent;\n }\n\n /** Current ACP session ID (null until newSession called) */\n get sessionId(): ACPSessionId | null {\n return this.#sessionId;\n }\n\n /** Whether initialize() has been called */\n get initialized(): boolean {\n return this.#initialized;\n }\n\n /** Agent capabilities from initialize response */\n get capabilities(): ACPAgentCapabilities | null {\n return this.#capabilities;\n }\n\n /** Whether the stream is closed */\n get isClosed(): boolean {\n return this.#closed;\n }\n\n /** Last processed event ID (for reconnection support) */\n get lastEventId(): string | null {\n return this.#lastEventId;\n }\n\n /** Whether the stream is currently reconnecting */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n // ===========================================================================\n // Reconnection Handling\n // ===========================================================================\n\n /**\n * Handle MAP reconnection events.\n */\n async #handleReconnectionEvent(event: {\n type: string;\n error?: Error;\n }): Promise<void> {\n if (this.#closed) return;\n\n switch (event.type) {\n case \"disconnected\":\n this.#isReconnecting = true;\n this.emit(\"reconnecting\");\n\n // Reject all pending requests during reconnection\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"Connection lost during ACP request\"));\n this.#pendingRequests.delete(id);\n }\n break;\n\n case \"reconnected\":\n await this.#handleReconnected();\n break;\n\n case \"reconnectFailed\":\n this.#isReconnecting = false;\n this.emit(\"error\", event.error ?? new Error(\"MAP reconnection failed\"));\n break;\n }\n }\n\n /**\n * Handle successful MAP reconnection.\n */\n async #handleReconnected(): Promise<void> {\n // Clear old subscription reference (new one will be created)\n this.#subscription = null;\n\n try {\n // Re-establish subscription\n await this.#setupSubscription();\n\n // If we had a session, verify it's still valid\n if (this.#sessionId) {\n const sessionValid = await this.#verifySessionValid();\n\n if (!sessionValid) {\n const lostSessionId = this.#sessionId;\n this.#sessionId = null;\n this.emit(\"sessionLost\", {\n sessionId: lostSessionId,\n reason: \"Session no longer valid after reconnection\",\n });\n }\n }\n\n this.#isReconnecting = false;\n this.emit(\"reconnected\");\n } catch (error) {\n this.#isReconnecting = false;\n this.emit(\"error\", error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Verify that the current ACP session is still valid.\n *\n * Since ACP doesn't have a dedicated status check method, we attempt\n * a lightweight operation (cancel with no effect) to verify the session.\n */\n async #verifySessionValid(): Promise<boolean> {\n if (!this.#sessionId) return false;\n\n try {\n // Try to send a cancel notification - if the session is invalid,\n // the agent will reject it or we'll get an error\n // This is a non-destructive way to verify session validity\n await this.#sendNotification(ACP_METHODS.SESSION_CANCEL, {\n sessionId: this.#sessionId,\n reason: \"session_verification\",\n });\n return true;\n } catch {\n // If we get an error, the session is likely invalid\n return false;\n }\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Set up the subscription for receiving messages from the target agent.\n */\n async #setupSubscription(): Promise<void> {\n if (this.#subscription) return;\n\n this.#subscription = await this.#mapClient.subscribe({\n fromAgents: [this.#options.targetAgent],\n });\n\n // Process incoming events\n void this.#processEvents();\n }\n\n /**\n * Process incoming events from the subscription.\n */\n async #processEvents(): Promise<void> {\n if (!this.#subscription) return;\n\n try {\n for await (const event of this.#subscription) {\n if (this.#closed) break;\n\n // Track last event ID for reconnection\n if (event.id) {\n this.#lastEventId = event.id;\n }\n\n // Handle message events\n if (event.type === \"message_delivered\" && event.data) {\n const message = (event.data as { message?: Message }).message;\n if (message?.payload) {\n await this.#handleIncomingMessage(message);\n }\n }\n }\n } catch (error) {\n if (!this.#closed) {\n this.emit(\"error\", error);\n }\n }\n }\n\n /**\n * Handle an incoming message from the target agent.\n */\n async #handleIncomingMessage(message: Message): Promise<void> {\n const payload = message.payload;\n if (!isACPEnvelope(payload)) return;\n\n const envelope = payload as ACPEnvelope;\n const { acp, acpContext } = envelope;\n\n // Check if this message is for our stream\n if (acpContext.streamId !== this.#streamId) return;\n\n // Handle response to a pending request\n if (acp.id !== undefined && !acp.method) {\n const requestId = String(acp.id);\n const pending = this.#pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.#pendingRequests.delete(requestId);\n\n if (acp.error) {\n pending.reject(ACPError.fromResponse(acp.error));\n } else {\n pending.resolve(acp.result);\n }\n }\n return;\n }\n\n // Handle notification (no id, has method)\n if (acp.method && acp.id === undefined) {\n await this.#handleNotification(acp.method, acp.params, acpContext);\n return;\n }\n\n // Handle agent→client request (has id and method)\n if (acp.method && acp.id !== undefined) {\n await this.#handleAgentRequest(acp.id, acp.method, acp.params, acpContext, message);\n }\n }\n\n /**\n * Handle an ACP notification from the agent.\n */\n async #handleNotification(\n method: string,\n params: unknown,\n _acpContext: unknown\n ): Promise<void> {\n if (method === ACP_METHODS.SESSION_UPDATE) {\n await this.#options.client.sessionUpdate(params as ACPSessionNotification);\n }\n }\n\n /**\n * Handle an agent→client request.\n */\n async #handleAgentRequest(\n requestId: ACPRequestId,\n method: string,\n params: unknown,\n _ctx: ACPContext,\n originalMessage: Message\n ): Promise<void> {\n let result: unknown;\n let error: ACPError | undefined;\n\n try {\n switch (method) {\n case ACP_METHODS.REQUEST_PERMISSION:\n result = await this.#options.client.requestPermission(\n params as ACPRequestPermissionRequest\n );\n break;\n case ACP_METHODS.FS_READ_TEXT_FILE:\n if (!this.#options.client.readTextFile) {\n throw new ACPError(-32601, \"Method not supported: fs/read_text_file\");\n }\n result = await this.#options.client.readTextFile(\n params as ACPReadTextFileRequest\n );\n break;\n case ACP_METHODS.FS_WRITE_TEXT_FILE:\n if (!this.#options.client.writeTextFile) {\n throw new ACPError(-32601, \"Method not supported: fs/write_text_file\");\n }\n result = await this.#options.client.writeTextFile(\n params as ACPWriteTextFileRequest\n );\n break;\n case ACP_METHODS.TERMINAL_CREATE:\n if (!this.#options.client.createTerminal) {\n throw new ACPError(-32601, \"Method not supported: terminal/create\");\n }\n result = await this.#options.client.createTerminal(\n params as ACPCreateTerminalRequest\n );\n break;\n case ACP_METHODS.TERMINAL_OUTPUT:\n if (!this.#options.client.terminalOutput) {\n throw new ACPError(-32601, \"Method not supported: terminal/output\");\n }\n result = await this.#options.client.terminalOutput(\n params as ACPTerminalOutputRequest\n );\n break;\n case ACP_METHODS.TERMINAL_RELEASE:\n if (!this.#options.client.releaseTerminal) {\n throw new ACPError(-32601, \"Method not supported: terminal/release\");\n }\n result = await this.#options.client.releaseTerminal(\n params as ACPReleaseTerminalRequest\n );\n break;\n case ACP_METHODS.TERMINAL_WAIT_FOR_EXIT:\n if (!this.#options.client.waitForTerminalExit) {\n throw new ACPError(-32601, \"Method not supported: terminal/wait_for_exit\");\n }\n result = await this.#options.client.waitForTerminalExit(\n params as ACPWaitForTerminalExitRequest\n );\n break;\n case ACP_METHODS.TERMINAL_KILL:\n if (!this.#options.client.killTerminal) {\n throw new ACPError(-32601, \"Method not supported: terminal/kill\");\n }\n result = await this.#options.client.killTerminal(\n params as ACPKillTerminalCommandRequest\n );\n break;\n default:\n throw new ACPError(-32601, `Unknown method: ${method}`);\n }\n } catch (e) {\n if (e instanceof ACPError) {\n error = e;\n } else {\n error = new ACPError(-32603, (e as Error).message);\n }\n }\n\n // Send response back to agent\n const responseEnvelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: requestId,\n ...(error ? { error: error.toErrorObject() } : { result }),\n },\n acpContext: {\n streamId: this.#streamId,\n sessionId: this.#sessionId,\n direction: \"client-to-agent\",\n },\n };\n\n await this.#mapClient.send(\n { agent: this.#options.targetAgent },\n responseEnvelope,\n {\n protocol: \"acp\",\n correlationId: originalMessage.id,\n }\n );\n }\n\n /**\n * Send an ACP request and wait for response.\n */\n async #sendRequest<TParams, TResult>(\n method: string,\n params?: TParams\n ): Promise<TResult> {\n if (this.#closed) {\n throw new Error(\"ACP stream is closed\");\n }\n\n // Ensure subscription is set up\n await this.#setupSubscription();\n\n // Check again after await - close() may have been called\n if (this.#closed) {\n throw new Error(\"ACP stream closed\");\n }\n\n const correlationId = `${this.#streamId}-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n const timeout = this.#options.timeout ?? 30000;\n\n // Create the envelope\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: correlationId,\n method,\n ...(params !== undefined && { params }),\n },\n acpContext: {\n streamId: this.#streamId,\n sessionId: this.#sessionId,\n direction: \"client-to-agent\",\n },\n };\n\n // Register the pending request BEFORE sending, so that close() can cancel it\n // even if close() is called while we're awaiting the send\n const resultPromise = new Promise<TResult>((resolve, reject) => {\n const timeoutHandle = setTimeout(() => {\n this.#pendingRequests.delete(correlationId);\n reject(new Error(`ACP request timed out after ${timeout}ms: ${method}`));\n }, timeout);\n\n this.#pendingRequests.set(correlationId, {\n resolve: resolve as (result: unknown) => void,\n reject,\n timeout: timeoutHandle,\n method,\n });\n });\n\n // Send via MAP\n try {\n await this.#mapClient.send({ agent: this.#options.targetAgent }, envelope, {\n protocol: \"acp\",\n correlationId,\n });\n } catch (err) {\n // If send fails, clean up the pending request\n const pending = this.#pendingRequests.get(correlationId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.#pendingRequests.delete(correlationId);\n }\n throw err;\n }\n\n // Check again after send - close() may have been called and already rejected\n // the pending request, in which case resultPromise will reject\n if (this.#closed && !this.#pendingRequests.has(correlationId)) {\n throw new Error(\"ACP stream closed\");\n }\n\n return resultPromise;\n }\n\n /**\n * Send an ACP notification (no response expected).\n */\n async #sendNotification<TParams>(method: string, params?: TParams): Promise<void> {\n if (this.#closed) {\n throw new Error(\"ACP stream is closed\");\n }\n\n await this.#setupSubscription();\n\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n method,\n ...(params !== undefined && { params }),\n },\n acpContext: {\n streamId: this.#streamId,\n sessionId: this.#sessionId,\n direction: \"client-to-agent\",\n },\n };\n\n await this.#mapClient.send({ agent: this.#options.targetAgent }, envelope, {\n protocol: \"acp\",\n });\n }\n\n // ===========================================================================\n // ACP Lifecycle Methods\n // ===========================================================================\n\n /**\n * Initialize the ACP connection with the target agent.\n */\n async initialize(params: ACPInitializeRequest): Promise<ACPInitializeResponse> {\n if (this.#initialized) {\n throw new Error(\"ACP stream already initialized\");\n }\n\n const result = await this.#sendRequest<ACPInitializeRequest, ACPInitializeResponse>(\n ACP_METHODS.INITIALIZE,\n params\n );\n\n this.#initialized = true;\n this.#capabilities = result.agentCapabilities ?? null;\n\n return result;\n }\n\n /**\n * Authenticate with the agent.\n */\n async authenticate(params: ACPAuthenticateRequest): Promise<ACPAuthenticateResponse> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before authenticate()\");\n }\n\n return this.#sendRequest<ACPAuthenticateRequest, ACPAuthenticateResponse>(\n ACP_METHODS.AUTHENTICATE,\n params\n );\n }\n\n // ===========================================================================\n // ACP Session Methods\n // ===========================================================================\n\n /**\n * Create a new ACP session.\n */\n async newSession(params: ACPNewSessionRequest): Promise<ACPNewSessionResponse> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before newSession()\");\n }\n\n const result = await this.#sendRequest<ACPNewSessionRequest, ACPNewSessionResponse>(\n ACP_METHODS.SESSION_NEW,\n params\n );\n\n this.#sessionId = result.sessionId;\n return result;\n }\n\n /**\n * Load an existing ACP session.\n */\n async loadSession(params: ACPLoadSessionRequest): Promise<ACPLoadSessionResponse> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before loadSession()\");\n }\n\n const result = await this.#sendRequest<ACPLoadSessionRequest, ACPLoadSessionResponse>(\n ACP_METHODS.SESSION_LOAD,\n params\n );\n\n this.#sessionId = params.sessionId;\n return result;\n }\n\n /**\n * Set the session mode.\n */\n async setSessionMode(params: ACPSetSessionModeRequest): Promise<ACPSetSessionModeResponse> {\n return this.#sendRequest<ACPSetSessionModeRequest, ACPSetSessionModeResponse>(\n ACP_METHODS.SESSION_SET_MODE,\n params\n );\n }\n\n // ===========================================================================\n // ACP Prompt Methods\n // ===========================================================================\n\n /**\n * Send a prompt to the agent.\n * Updates are received via the sessionUpdate handler.\n */\n async prompt(params: ACPPromptRequest): Promise<ACPPromptResponse> {\n if (!this.#sessionId) {\n throw new Error(\"Must call newSession() or loadSession() before prompt()\");\n }\n\n return this.#sendRequest<ACPPromptRequest, ACPPromptResponse>(\n ACP_METHODS.SESSION_PROMPT,\n params\n );\n }\n\n /**\n * Cancel ongoing operations for the current session.\n */\n async cancel(params?: Partial<ACPCancelNotification>): Promise<void> {\n if (!this.#sessionId) {\n throw new Error(\"No active session to cancel\");\n }\n\n await this.#sendNotification<ACPCancelNotification>(ACP_METHODS.SESSION_CANCEL, {\n sessionId: this.#sessionId,\n ...params,\n });\n }\n\n // ===========================================================================\n // Extension Methods\n // ===========================================================================\n\n /**\n * Call an ACP extension method on the target agent.\n *\n * Extension methods are prefixed with \"_\" (e.g., \"_macro/spawnAgent\").\n * The agent must support the extension for this to succeed.\n *\n * @param method - The extension method name (e.g., \"_macro/spawnAgent\")\n * @param params - Parameters to pass to the extension method\n * @returns The result from the extension method\n *\n * @example\n * ```typescript\n * const result = await acp.callExtension(\"_macro/spawnAgent\", {\n * task: \"Implement feature X\",\n * cwd: \"/project\"\n * });\n * ```\n */\n async callExtension<TParams = unknown, TResult = unknown>(\n method: string,\n params?: TParams\n ): Promise<TResult> {\n if (!this.#initialized) {\n throw new Error(\"Must call initialize() before callExtension()\");\n }\n\n return this.#sendRequest<TParams, TResult>(method, params);\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Close this ACP stream and clean up resources.\n */\n async close(): Promise<void> {\n if (this.#closed) return;\n\n this.#closed = true;\n\n // Unsubscribe from reconnection events\n if (this.#unsubscribeReconnection) {\n this.#unsubscribeReconnection();\n this.#unsubscribeReconnection = null;\n }\n\n // Cancel all pending requests\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"ACP stream closed\"));\n this.#pendingRequests.delete(id);\n }\n\n // Unsubscribe from events\n if (this.#subscription) {\n await this.#subscription.unsubscribe();\n this.#subscription = null;\n }\n\n this.emit(\"close\");\n }\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create an ACP stream connection from a MAP client.\n *\n * @param mapClient - The underlying MAP client connection\n * @param options - Stream configuration options\n * @returns A new ACPStreamConnection instance\n */\nexport function createACPStream(\n mapClient: ClientConnection,\n options: ACPStreamOptions\n): ACPStreamConnection {\n return new ACPStreamConnection(mapClient, options);\n}\n","/**\n * Client connection for MAP protocol\n *\n * Used by clients to connect to a MAP system, query agents,\n * subscribe to events, and send messages.\n */\n\nimport { type Stream, websocketStream, waitForOpen } from '../stream';\nimport type {\n AgenticMeshStreamConfig,\n MeshPeerEndpoint,\n MeshTransportAdapter,\n} from '../stream/agentic-mesh';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { Subscription, createSubscription, type EventHandler } from '../subscription';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport {\n ACPStreamConnection,\n type ACPStreamOptions,\n} from '../acp/stream';\nimport {\n CORE_METHODS,\n OBSERVATION_METHODS,\n STATE_METHODS,\n STEERING_METHODS,\n SESSION_METHODS,\n AUTH_METHODS,\n MAIL_METHODS,\n NOTIFICATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type AgentId,\n type ScopeId,\n type SubscriptionId,\n type Address,\n type Agent,\n type Scope,\n type Message,\n type MessageMeta,\n type SubscriptionFilter,\n type EventNotificationParams,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type SessionListResponseResult,\n type SessionLoadResponseResult,\n type SessionCloseResponseResult,\n type AgentsListRequestParams,\n type AgentsListResponseResult,\n type AgentsGetResponseResult,\n type AgentsGetRequestParams,\n type SendRequestParams,\n type SendResponseResult,\n type SubscribeRequestParams,\n type SubscribeResponseResult,\n type UnsubscribeResponseResult,\n type StructureGraphRequestParams,\n type StructureGraphResponseResult,\n type ScopesListRequestParams,\n type ScopesListResponseResult,\n type ScopesGetResponseResult,\n type ScopesMembersRequestParams,\n type ScopesMembersResponseResult,\n type InjectRequestParams,\n type InjectResponseResult,\n type ReplayRequestParams,\n type ReplayResponseResult,\n type ReplayedEvent,\n type SubscriptionAckParams,\n type AuthenticateRequestParams,\n type AuthenticateResponseResult,\n type AuthPrincipal,\n type ConversationId,\n type ThreadId,\n type MailCreateRequestParams,\n type MailCreateResponseResult,\n type MailGetRequestParams,\n type MailGetResponseResult,\n type MailListRequestParams,\n type MailListResponseResult,\n type MailCloseRequestParams,\n type MailCloseResponseResult,\n type MailJoinRequestParams,\n type MailJoinResponseResult,\n type MailLeaveRequestParams,\n type MailLeaveResponseResult,\n type MailInviteRequestParams,\n type MailInviteResponseResult,\n type MailTurnRequestParams,\n type MailTurnResponseResult,\n type MailTurnsListRequestParams,\n type MailTurnsListResponseResult,\n type MailThreadCreateRequestParams,\n type MailThreadCreateResponseResult,\n type MailThreadListRequestParams,\n type MailThreadListResponseResult,\n type MailSummaryRequestParams,\n type MailSummaryResponseResult,\n type MailReplayRequestParams,\n type MailReplayResponseResult,\n} from '../types';\n\n/**\n * Options for automatic reconnection\n */\nexport interface ReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n /** Restore subscriptions after reconnect (default: true) */\n restoreSubscriptions?: boolean;\n /** Replay missed events on restore (default: true) */\n replayOnRestore?: boolean;\n /** Maximum events to replay per subscription (default: 1000) */\n maxReplayEventsPerSubscription?: number;\n}\n\n/**\n * State tracked for subscription restoration\n */\ninterface SubscriptionState {\n filter?: SubscriptionFilter;\n lastEventId?: string;\n handlers: Set<EventHandler>;\n}\n\n/**\n * Reconnection event types\n */\nexport type ReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed'\n | 'subscriptionRestored'\n | 'subscriptionRestoreFailed';\n\n/**\n * Handler for reconnection events\n */\nexport type ReconnectionEventHandler = (event: {\n type: ReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n subscriptionId?: SubscriptionId;\n newSubscriptionId?: SubscriptionId;\n}) => void;\n\n/**\n * Options for client connection\n */\nexport interface ClientConnectionOptions extends BaseConnectionOptions {\n /** Client name for identification */\n name?: string;\n /** Client capabilities */\n capabilities?: ParticipantCapabilities;\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: ReconnectionOptions;\n}\n\n/**\n * Options for ClientConnection.connect() static method\n */\nexport interface ClientConnectOptions {\n /** Client name for identification */\n name?: string;\n /** Client capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `ReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | ReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n}\n\n/**\n * Options for ClientConnection.connectMesh() static method\n */\nexport interface MeshConnectOptions {\n /** The agentic-mesh transport adapter (Nebula, Tailscale, etc.) */\n transport: MeshTransportAdapter;\n /** Remote peer to connect to */\n peer: MeshPeerEndpoint;\n /** Local peer ID for identification */\n localPeerId: string;\n /** Client name for identification */\n name?: string;\n /** Client capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `ReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | ReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n timeout?: number;\n}\n\n/**\n * Client connection to a MAP system.\n *\n * Provides methods for:\n * - Querying agents and structure\n * - Subscribing to events\n * - Sending messages to agents\n * - (With permissions) Steering agents\n *\n * ## Response Shape Patterns\n *\n * Methods follow consistent response shape conventions:\n *\n * **Create Operations** return the full entity that was created:\n * - `registerAgent()` → `{ agent: Agent }`\n * - `createScope()` → `{ scope: Scope }`\n * - `subscribe()` → `Subscription` (full subscription object)\n *\n * **Query Operations** return the requested data:\n * - `listAgents()` → `{ agents: Agent[] }`\n * - `getAgent()` → `{ agent: Agent, children?: Agent[] }`\n * - `getScope()` → `Scope`\n * - `listScopes()` → `{ scopes: Scope[] }`\n *\n * **Action Operations** return confirmation with reference ID:\n * - `send()` → `{ messageId: string }`\n * - `inject()` → `{ accepted: boolean }`\n *\n * **Lifecycle Operations** return status:\n * - `connect()` → `ConnectResponseResult` (session info, capabilities, auth status)\n * - `disconnect()` → `string | undefined` (resume token)\n * - `authenticate()` → `{ success: boolean, principal?: AuthPrincipal }`\n */\nexport class ClientConnection {\n #connection: BaseConnection;\n readonly #subscriptions: Map<SubscriptionId, Subscription> = new Map();\n readonly #subscriptionStates: Map<SubscriptionId, SubscriptionState> = new Map();\n readonly #reconnectionHandlers: Set<ReconnectionEventHandler> = new Set();\n readonly #acpStreams: Map<string, ACPStreamConnection> = new Map();\n readonly #options: ClientConnectionOptions;\n\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #connected = false;\n #lastConnectOptions?: {\n sessionId?: SessionId;\n resumeToken?: string;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; credential?: string };\n };\n #isReconnecting = false;\n #lastResumeToken?: string;\n #onTokenExpiring?: (expiresAt: number) => Promise<{ method: string; credential: string } | void>;\n\n constructor(stream: Stream, options: ClientConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Set up notification handler for events\n this.#connection.setNotificationHandler(this.#handleNotification.bind(this));\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Static Factory Methods\n // ===========================================================================\n\n /**\n * Connect to a MAP server via WebSocket URL.\n *\n * Handles:\n * - WebSocket creation and connection\n * - Stream wrapping\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n *\n * @param url - WebSocket URL (ws:// or wss://)\n * @param options - Connection options\n * @returns Connected ClientConnection instance\n *\n * @example\n * ```typescript\n * const client = await ClientConnection.connect('ws://localhost:8080', {\n * name: 'MyClient',\n * reconnection: true\n * });\n *\n * // Already connected, ready to use\n * const agents = await client.listAgents();\n * ```\n */\n static async connect(\n url: string,\n options?: ClientConnectOptions\n ): Promise<ClientConnection> {\n // Validate URL\n const parsedUrl = new URL(url);\n if (!['ws:', 'wss:'].includes(parsedUrl.protocol)) {\n throw new Error(\n `Unsupported protocol: ${parsedUrl.protocol}. Use ws: or wss:`\n );\n }\n\n const timeout = options?.connectTimeout ?? 10000;\n\n // Create and connect WebSocket\n const ws = new WebSocket(url);\n await waitForOpen(ws, timeout);\n const stream = websocketStream(ws);\n\n // Configure createStream for reconnection\n const createStream = async () => {\n const newWs = new WebSocket(url);\n await waitForOpen(newWs, timeout);\n return websocketStream(newWs);\n };\n\n // Normalize reconnection option\n const reconnection =\n options?.reconnection === true\n ? { enabled: true }\n : typeof options?.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const client = new ClientConnection(stream, {\n name: options?.name,\n capabilities: options?.capabilities,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake\n await client.connect({ auth: options?.auth });\n\n return client;\n }\n\n /**\n * Connect to a MAP server via agentic-mesh transport.\n *\n * Handles:\n * - Dynamic import of agentic-mesh (optional peer dependency)\n * - Stream creation over encrypted mesh tunnel\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param options - Mesh connection options\n * @returns Connected ClientConnection instance\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n *\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * const client = await ClientConnection.connectMesh({\n * transport,\n * peer: { peerId: 'server', address: '10.0.0.1', port: 4242 },\n * localPeerId: 'my-client',\n * name: 'MeshClient',\n * reconnection: true\n * });\n *\n * const agents = await client.listAgents();\n * ```\n */\n static async connectMesh(options: MeshConnectOptions): Promise<ClientConnection> {\n // Dynamic import for optional peer dependency\n const { agenticMeshStream } = await import('../stream/agentic-mesh');\n\n const streamConfig: AgenticMeshStreamConfig = {\n transport: options.transport,\n peer: options.peer,\n localPeerId: options.localPeerId,\n timeout: options.timeout,\n };\n\n // Create initial stream\n const stream = await agenticMeshStream(streamConfig);\n\n // Configure createStream for reconnection\n const createStream = async () => agenticMeshStream(streamConfig);\n\n // Normalize reconnection option\n const reconnection =\n options.reconnection === true\n ? { enabled: true }\n : typeof options.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const client = new ClientConnection(stream, {\n name: options.name,\n capabilities: options.capabilities,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake\n await client.connect({ auth: options.auth });\n\n return client;\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the MAP system\n *\n * @param options - Connection options\n * @param options.sessionId - Specific session ID to use\n * @param options.resumeToken - Token to resume a previously disconnected session\n * @param options.auth - Authentication credentials\n * @param options.onTokenExpiring - Callback invoked before token expires for proactive refresh\n */\n async connect(options?: {\n sessionId?: SessionId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n /** Authentication credentials */\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; credential?: string };\n /** Callback invoked when token is about to expire. Return new credentials to refresh. */\n onTokenExpiring?: (expiresAt: number) => Promise<{ method: string; credential: string } | void>;\n }): Promise<ConnectResponseResult> {\n const params: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'client',\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n sessionId: options?.sessionId,\n resumeToken: options?.resumeToken,\n auth: options?.auth,\n };\n\n const result = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, params);\n\n this.#sessionId = result.sessionId;\n this.#serverCapabilities = result.capabilities;\n this.#connected = true;\n\n // Store resume token if provided in response\n if (result.resumeToken) {\n this.#lastResumeToken = result.resumeToken;\n }\n\n // Store token expiring callback\n if (options?.onTokenExpiring) {\n this.#onTokenExpiring = options.onTokenExpiring;\n this.#setupTokenExpiryMonitoring(result);\n }\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n return result;\n }\n\n /**\n * Get the resume token for this session.\n * Can be used to reconnect and restore session state after disconnection.\n *\n * @returns The resume token, or undefined if not available\n */\n getResumeToken(): string | undefined {\n return this.#lastResumeToken;\n }\n\n /**\n * Reconnect to the server, optionally using a resume token to restore session.\n *\n * @param resumeToken - Token to resume previous session. If not provided, uses the last known token.\n * @returns Connect response result\n *\n * @example\n * ```typescript\n * // Save token before disconnect\n * const token = await client.disconnect();\n *\n * // Later, reconnect with the token\n * const result = await client.reconnect(token);\n * console.log('Reconnected:', result.reconnected);\n * ```\n */\n async reconnect(resumeToken?: string): Promise<ConnectResponseResult> {\n const tokenToUse = resumeToken ?? this.#lastResumeToken;\n\n return this.connect({\n ...this.#lastConnectOptions,\n resumeToken: tokenToUse,\n });\n }\n\n /**\n * Set up monitoring for token expiration\n */\n #setupTokenExpiryMonitoring(connectResult: ConnectResponseResult): void {\n const principal = connectResult.principal;\n if (!principal?.expiresAt || !this.#onTokenExpiring) {\n return;\n }\n\n const expiresAt = principal.expiresAt;\n const now = Date.now();\n\n // Trigger callback 60 seconds before expiration\n const warningTime = expiresAt - 60000;\n const delay = warningTime - now;\n\n if (delay > 0) {\n setTimeout(async () => {\n if (!this.#connected || !this.#onTokenExpiring) return;\n\n try {\n const newCredentials = await this.#onTokenExpiring(expiresAt);\n if (newCredentials) {\n const refreshResult = await this.refreshAuth({\n method: newCredentials.method as 'bearer' | 'api-key' | 'mtls' | 'none',\n credential: newCredentials.credential,\n });\n\n // If refresh succeeded and we got a new expiry, set up monitoring again\n if (refreshResult.success && refreshResult.principal?.expiresAt) {\n this.#setupTokenExpiryMonitoring({\n ...connectResult,\n principal: refreshResult.principal\n } as ConnectResponseResult);\n }\n }\n } catch {\n // Token refresh failed - let the connection handle expiration naturally\n }\n }, delay);\n }\n }\n\n /**\n * Authenticate with the server after connection.\n *\n * Use this when the server returns `authRequired` in the connect response,\n * indicating that authentication is needed before accessing protected resources.\n *\n * @param auth - Authentication credentials\n * @returns Authentication result with principal if successful\n *\n * @example\n * ```typescript\n * const connectResult = await client.connect();\n *\n * if (connectResult.authRequired) {\n * const authResult = await client.authenticate({\n * method: 'api-key',\n * credential: process.env.API_KEY,\n * });\n *\n * if (authResult.success) {\n * console.log('Authenticated as:', authResult.principal?.id);\n * }\n * }\n * ```\n */\n async authenticate(auth: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n credential?: string;\n }): Promise<AuthenticateResponseResult> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.credential,\n };\n\n const result = await this.#connection.sendRequest<\n AuthenticateRequestParams,\n AuthenticateResponseResult\n >(AUTH_METHODS.AUTHENTICATE, params);\n\n // Update session info if auth succeeded\n if (result.success && result.sessionId) {\n this.#sessionId = result.sessionId;\n }\n\n return result;\n }\n\n /**\n * Refresh authentication credentials.\n *\n * Use this to update credentials before they expire for long-lived connections.\n *\n * @param auth - New authentication credentials\n * @returns Updated principal information\n */\n async refreshAuth(auth: {\n method: \"bearer\" | \"api-key\" | \"mtls\" | \"none\";\n credential?: string;\n }): Promise<{\n success: boolean;\n principal?: AuthPrincipal;\n error?: { code: string; message: string };\n }> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.credential,\n };\n\n return this.#connection.sendRequest(AUTH_METHODS.AUTH_REFRESH, params);\n }\n\n /**\n * Disconnect from the MAP system\n * @param reason - Optional reason for disconnecting\n * @returns Resume token that can be used to resume this session later\n */\n async disconnect(reason?: string): Promise<string | undefined> {\n if (!this.#connected) return undefined;\n\n let resumeToken: string | undefined;\n try {\n const result = await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n resumeToken = result.resumeToken;\n\n // Store resume token for potential reconnection\n if (resumeToken) {\n this.#lastResumeToken = resumeToken;\n }\n } finally {\n // Close all ACP streams\n for (const stream of this.#acpStreams.values()) {\n await stream.close();\n }\n this.#acpStreams.clear();\n\n // Close all subscriptions\n for (const subscription of this.#subscriptions.values()) {\n subscription._close();\n }\n this.#subscriptions.clear();\n\n await this.#connection.close();\n this.#connected = false;\n }\n return resumeToken;\n }\n\n /**\n * Whether the client is connected\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Session Management\n // ===========================================================================\n\n /**\n * List available sessions\n */\n async listSessions(): Promise<SessionListResponseResult> {\n return this.#connection.sendRequest(SESSION_METHODS.SESSION_LIST);\n }\n\n /**\n * Load an existing session\n */\n async loadSession(sessionId: SessionId): Promise<SessionLoadResponseResult> {\n return this.#connection.sendRequest(SESSION_METHODS.SESSION_LOAD, { sessionId });\n }\n\n /**\n * Close the current session\n */\n async closeSession(sessionId?: SessionId): Promise<SessionCloseResponseResult> {\n return this.#connection.sendRequest(SESSION_METHODS.SESSION_CLOSE, { sessionId });\n }\n\n // ===========================================================================\n // Agent Queries\n // ===========================================================================\n\n /**\n * List agents with optional filters\n */\n async listAgents(options?: AgentsListRequestParams): Promise<AgentsListResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.AGENTS_LIST, options);\n }\n\n /**\n * Get a single agent by ID\n */\n async getAgent(\n agentId: AgentId,\n options?: { include?: { children?: boolean; descendants?: boolean } }\n ): Promise<AgentsGetResponseResult> {\n const params: AgentsGetRequestParams = { agentId, ...options };\n return this.#connection.sendRequest<AgentsGetRequestParams, AgentsGetResponseResult>(\n OBSERVATION_METHODS.AGENTS_GET,\n params\n );\n }\n\n /**\n * Get the agent structure/hierarchy graph\n */\n async getStructureGraph(\n options?: StructureGraphRequestParams\n ): Promise<StructureGraphResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.STRUCTURE_GRAPH, options);\n }\n\n // ===========================================================================\n // Scope Queries\n // ===========================================================================\n\n /**\n * List scopes\n */\n async listScopes(options?: ScopesListRequestParams): Promise<ScopesListResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.SCOPES_LIST, options);\n }\n\n /**\n * Get a single scope by ID\n */\n async getScope(scopeId: ScopeId): Promise<Scope> {\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId },\n ScopesGetResponseResult\n >(OBSERVATION_METHODS.SCOPES_GET, { scopeId });\n return result.scope;\n }\n\n /**\n * List members of a scope\n */\n async getScopeMembers(\n scopeId: ScopeId,\n options?: Omit<ScopesMembersRequestParams, 'scopeId'>\n ): Promise<ScopesMembersResponseResult> {\n return this.#connection.sendRequest(OBSERVATION_METHODS.SCOPES_MEMBERS, {\n scopeId,\n ...options,\n });\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send a message to an address\n */\n async send(\n to: Address,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n const params: SendRequestParams = { to };\n if (payload !== undefined) params.payload = payload;\n if (meta) params.meta = meta;\n\n return this.#connection.sendRequest(CORE_METHODS.SEND, params);\n }\n\n /**\n * Send a message to a specific agent\n */\n async sendToAgent(\n agentId: AgentId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: agentId }, payload, meta);\n }\n\n /**\n * Send a message to all agents in a scope\n */\n async sendToScope(\n scopeId: ScopeId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ scope: scopeId }, payload, meta);\n }\n\n /**\n * Send a message to agents with a specific role\n */\n async sendToRole(\n role: string,\n payload?: unknown,\n meta?: MessageMeta,\n withinScope?: ScopeId\n ): Promise<SendResponseResult> {\n return this.send({ role, within: withinScope }, payload, meta);\n }\n\n /**\n * Broadcast a message to all agents\n */\n async broadcast(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ broadcast: true }, payload, meta);\n }\n\n /**\n * Send a request and wait for a correlated response\n *\n * This is a higher-level pattern for request/response messaging.\n * A correlationId is automatically generated.\n */\n async request<T = unknown>(\n to: Address,\n payload?: unknown,\n options?: { timeout?: number; meta?: MessageMeta }\n ): Promise<Message<T>> {\n const correlationId = `req-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n // Subscribe to responses with this correlation ID\n const responseSub = await this.subscribe({\n // We'll filter in the handler since subscription filters don't support correlationId\n });\n\n try {\n // Send the request\n await this.send(to, payload, {\n ...options?.meta,\n expectsResponse: true,\n correlationId,\n });\n\n // Wait for response with matching correlationId\n const timeout = options?.timeout ?? 30000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(`Request timed out after ${timeout}ms`)), timeout);\n });\n\n const responsePromise = (async () => {\n for await (const event of responseSub) {\n if (\n event.type === 'message_delivered' &&\n event.data &&\n (event.data as { correlationId?: string }).correlationId === correlationId\n ) {\n return (event.data as { message: Message<T> }).message;\n }\n }\n throw new Error('Subscription closed before response received');\n })();\n\n return await Promise.race([responsePromise, timeoutPromise]);\n } finally {\n await responseSub.unsubscribe();\n }\n }\n\n // ===========================================================================\n // ACP Streams\n // ===========================================================================\n\n /**\n * Create a virtual ACP stream connection to an agent.\n *\n * This allows clients to interact with ACP-compatible agents using the\n * familiar ACP interface while routing all messages through MAP.\n *\n * @param options - Stream configuration options\n * @returns ACPStreamConnection instance ready for initialize()\n *\n * @example\n * ```typescript\n * const acp = client.createACPStream({\n * targetAgent: 'coding-agent-1',\n * client: {\n * requestPermission: async (req) => ({\n * outcome: { outcome: 'selected', optionId: 'allow' }\n * }),\n * sessionUpdate: async (update) => {\n * console.log('Agent update:', update);\n * }\n * }\n * });\n *\n * await acp.initialize({\n * protocolVersion: 20241007,\n * clientInfo: { name: 'IDE', version: '1.0' }\n * });\n * const { sessionId } = await acp.newSession({ cwd: '/project', mcpServers: [] });\n * const result = await acp.prompt({\n * sessionId,\n * prompt: [{ type: 'text', text: 'Hello' }]\n * });\n *\n * await acp.close();\n * ```\n */\n createACPStream(options: Omit<ACPStreamOptions, 'mapClient'>): ACPStreamConnection {\n const stream = new ACPStreamConnection(this, options);\n\n // Track the stream\n this.#acpStreams.set(stream.streamId, stream);\n\n // Remove from tracking when closed\n stream.on('close', () => {\n this.#acpStreams.delete(stream.streamId);\n });\n\n return stream;\n }\n\n /**\n * Get an active ACP stream by ID.\n */\n getACPStream(streamId: string): ACPStreamConnection | undefined {\n return this.#acpStreams.get(streamId);\n }\n\n /**\n * Get all active ACP streams.\n */\n get acpStreams(): ReadonlyMap<string, ACPStreamConnection> {\n return this.#acpStreams;\n }\n\n // ===========================================================================\n // Subscriptions\n // ===========================================================================\n\n /**\n * Subscribe to events\n */\n async subscribe(filter?: SubscriptionFilter): Promise<Subscription> {\n const params: SubscribeRequestParams = {};\n if (filter) params.filter = filter;\n\n const result = await this.#connection.sendRequest<\n SubscribeRequestParams,\n SubscribeResponseResult\n >(CORE_METHODS.SUBSCRIBE, params);\n\n // Create sendAck callback if server supports it\n const serverSupportsAck = this.#serverCapabilities?.streaming?.supportsAck === true;\n const sendAck = serverSupportsAck\n ? (ackParams: SubscriptionAckParams) => {\n this.#connection.sendNotification(NOTIFICATION_METHODS.SUBSCRIBE_ACK, ackParams);\n }\n : undefined;\n\n const subscription = createSubscription(\n result.subscriptionId,\n () => this.unsubscribe(result.subscriptionId),\n { filter },\n sendAck\n );\n\n // Set server support flag on the subscription\n if (serverSupportsAck) {\n subscription._setServerSupportsAck(true);\n }\n\n this.#subscriptions.set(result.subscriptionId, subscription);\n\n // Track subscription state for potential restoration\n if (this.#options.reconnection?.restoreSubscriptions !== false) {\n this.#subscriptionStates.set(result.subscriptionId, {\n filter,\n handlers: new Set(),\n });\n\n // Update lastEventId when events are received\n const originalPushEvent = subscription._pushEvent.bind(subscription);\n subscription._pushEvent = (event: EventNotificationParams) => {\n const state = this.#subscriptionStates.get(result.subscriptionId);\n if (state && event.eventId) {\n state.lastEventId = event.eventId;\n }\n originalPushEvent(event);\n };\n }\n\n return subscription;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(subscriptionId: SubscriptionId): Promise<void> {\n const subscription = this.#subscriptions.get(subscriptionId);\n if (subscription) {\n subscription._close();\n this.#subscriptions.delete(subscriptionId);\n }\n\n // Clean up subscription state\n this.#subscriptionStates.delete(subscriptionId);\n\n await this.#connection.sendRequest<\n { subscriptionId: SubscriptionId },\n UnsubscribeResponseResult\n >(CORE_METHODS.UNSUBSCRIBE, { subscriptionId });\n }\n\n // ===========================================================================\n // Event Replay\n // ===========================================================================\n\n /**\n * Replay historical events.\n *\n * Uses keyset pagination - pass the last eventId from the previous\n * response to get the next page.\n *\n * @example\n * ```typescript\n * // Replay all events from the last hour\n * const result = await client.replay({\n * fromTimestamp: Date.now() - 3600000,\n * filter: { eventTypes: ['agent.registered'] },\n * limit: 100\n * });\n *\n * // Paginate through results\n * let afterEventId: string | undefined;\n * do {\n * const page = await client.replay({ afterEventId, limit: 100 });\n * for (const item of page.events) {\n * console.log(item.eventId, item.event);\n * }\n * afterEventId = page.events.at(-1)?.eventId;\n * } while (page.hasMore);\n * ```\n */\n async replay(params: ReplayRequestParams = {}): Promise<ReplayResponseResult> {\n // Validate and cap limit\n const limit = Math.min(params.limit ?? 100, 1000);\n\n return this.#connection.sendRequest<ReplayRequestParams, ReplayResponseResult>(\n CORE_METHODS.REPLAY,\n { ...params, limit }\n );\n }\n\n /**\n * Replay all events matching filter, handling pagination automatically.\n *\n * Returns an async generator for streaming through all results.\n *\n * @example\n * ```typescript\n * for await (const item of client.replayAll({\n * filter: { eventTypes: ['agent.registered'] }\n * })) {\n * console.log(item.eventId, item.event);\n * }\n * ```\n */\n async *replayAll(\n params: Omit<ReplayRequestParams, 'afterEventId'> = {}\n ): AsyncGenerator<ReplayedEvent> {\n let afterEventId: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const result = await this.replay({ ...params, afterEventId });\n\n for (const item of result.events) {\n yield item;\n }\n\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: if no events returned but hasMore is true, break to avoid infinite loop\n if (result.events.length === 0) {\n break;\n }\n }\n }\n\n // ===========================================================================\n // Steering (requires canSteer capability)\n // ===========================================================================\n\n /**\n * Inject context into a running agent\n */\n async inject(\n agentId: AgentId,\n content: unknown,\n delivery?: 'interrupt' | 'queue' | 'best-effort'\n ): Promise<InjectResponseResult> {\n const params: InjectRequestParams = { agentId, content };\n if (delivery) params.delivery = delivery;\n\n return this.#connection.sendRequest(STEERING_METHODS.INJECT, params);\n }\n\n // ===========================================================================\n // Lifecycle Control (requires canStop capability)\n // ===========================================================================\n\n /**\n * Request an agent to stop\n */\n async stopAgent(\n agentId: AgentId,\n options?: { reason?: string; force?: boolean }\n ): Promise<{ stopping: boolean; agent?: Agent }> {\n return this.#connection.sendRequest(STATE_METHODS.AGENTS_STOP, {\n agentId,\n ...options,\n });\n }\n\n /**\n * Suspend an agent\n */\n async suspendAgent(\n agentId: AgentId,\n reason?: string\n ): Promise<{ suspended: boolean; agent?: Agent }> {\n return this.#connection.sendRequest(STATE_METHODS.AGENTS_SUSPEND, {\n agentId,\n reason,\n });\n }\n\n /**\n * Resume a suspended agent\n */\n async resumeAgent(agentId: AgentId): Promise<{ resumed: boolean; agent?: Agent }> {\n return this.#connection.sendRequest(STATE_METHODS.AGENTS_RESUME, { agentId });\n }\n\n // ===========================================================================\n // Mail\n // ===========================================================================\n\n /**\n * Create a new mail conversation.\n *\n * @param params - Conversation creation parameters\n * @returns Created conversation and participant info\n */\n async createConversation(\n params?: Omit<MailCreateRequestParams, '_meta'>\n ): Promise<MailCreateResponseResult> {\n return this.#connection.sendRequest<MailCreateRequestParams, MailCreateResponseResult>(\n MAIL_METHODS.MAIL_CREATE,\n params ?? {}\n );\n }\n\n /**\n * Get a conversation by ID with optional includes.\n *\n * @param conversationId - ID of the conversation to retrieve\n * @param include - Optional fields to include (participants, threads, recentTurns, stats)\n * @returns Conversation details with requested includes\n */\n async getConversation(\n conversationId: ConversationId,\n include?: MailGetRequestParams['include']\n ): Promise<MailGetResponseResult> {\n return this.#connection.sendRequest<MailGetRequestParams, MailGetResponseResult>(\n MAIL_METHODS.MAIL_GET,\n { conversationId, include }\n );\n }\n\n /**\n * List conversations with optional filters.\n *\n * @param params - Optional filter, limit, and cursor parameters\n * @returns Paginated list of conversations\n */\n async listConversations(\n params?: Omit<MailListRequestParams, '_meta'>\n ): Promise<MailListResponseResult> {\n return this.#connection.sendRequest<MailListRequestParams, MailListResponseResult>(\n MAIL_METHODS.MAIL_LIST,\n params ?? {}\n );\n }\n\n /**\n * Close a conversation.\n *\n * @param conversationId - ID of the conversation to close\n * @param reason - Optional reason for closing\n * @returns The closed conversation\n */\n async closeConversation(\n conversationId: ConversationId,\n reason?: string\n ): Promise<MailCloseResponseResult> {\n return this.#connection.sendRequest<MailCloseRequestParams, MailCloseResponseResult>(\n MAIL_METHODS.MAIL_CLOSE,\n { conversationId, reason }\n );\n }\n\n /**\n * Join an existing conversation.\n *\n * @param params - Join parameters including conversationId and optional catch-up config\n * @returns Conversation, participant, and optional history\n */\n async joinConversation(\n params: Omit<MailJoinRequestParams, '_meta'>\n ): Promise<MailJoinResponseResult> {\n return this.#connection.sendRequest<MailJoinRequestParams, MailJoinResponseResult>(\n MAIL_METHODS.MAIL_JOIN,\n params\n );\n }\n\n /**\n * Leave a conversation.\n *\n * @param conversationId - ID of the conversation to leave\n * @param reason - Optional reason for leaving\n * @returns Leave confirmation with timestamp\n */\n async leaveConversation(\n conversationId: ConversationId,\n reason?: string\n ): Promise<MailLeaveResponseResult> {\n return this.#connection.sendRequest<MailLeaveRequestParams, MailLeaveResponseResult>(\n MAIL_METHODS.MAIL_LEAVE,\n { conversationId, reason }\n );\n }\n\n /**\n * Invite a participant to a conversation.\n *\n * @param params - Invite parameters including conversationId and participant info\n * @returns Invite result\n */\n async inviteToConversation(\n params: Omit<MailInviteRequestParams, '_meta'>\n ): Promise<MailInviteResponseResult> {\n return this.#connection.sendRequest<MailInviteRequestParams, MailInviteResponseResult>(\n MAIL_METHODS.MAIL_INVITE,\n params\n );\n }\n\n /**\n * Record a turn (message) in a conversation.\n *\n * @param params - Turn parameters including conversationId, contentType, and content\n * @returns The created turn\n */\n async recordTurn(\n params: Omit<MailTurnRequestParams, '_meta'>\n ): Promise<MailTurnResponseResult> {\n return this.#connection.sendRequest<MailTurnRequestParams, MailTurnResponseResult>(\n MAIL_METHODS.MAIL_TURN,\n params\n );\n }\n\n /**\n * List turns in a conversation with optional filters.\n *\n * @param params - List parameters including conversationId and optional filters\n * @returns Paginated list of turns\n */\n async listTurns(\n params: Omit<MailTurnsListRequestParams, '_meta'>\n ): Promise<MailTurnsListResponseResult> {\n return this.#connection.sendRequest<MailTurnsListRequestParams, MailTurnsListResponseResult>(\n MAIL_METHODS.MAIL_TURNS_LIST,\n params\n );\n }\n\n /**\n * Create a thread in a conversation.\n *\n * @param params - Thread creation parameters including conversationId and rootTurnId\n * @returns The created thread\n */\n async createThread(\n params: Omit<MailThreadCreateRequestParams, '_meta'>\n ): Promise<MailThreadCreateResponseResult> {\n return this.#connection.sendRequest<MailThreadCreateRequestParams, MailThreadCreateResponseResult>(\n MAIL_METHODS.MAIL_THREAD_CREATE,\n params\n );\n }\n\n /**\n * List threads in a conversation.\n *\n * @param params - List parameters including conversationId\n * @returns Paginated list of threads\n */\n async listThreads(\n params: Omit<MailThreadListRequestParams, '_meta'>\n ): Promise<MailThreadListResponseResult> {\n return this.#connection.sendRequest<MailThreadListRequestParams, MailThreadListResponseResult>(\n MAIL_METHODS.MAIL_THREAD_LIST,\n params\n );\n }\n\n /**\n * Get a summary of a conversation.\n *\n * @param params - Summary parameters including conversationId and optional scope/includes\n * @returns Generated summary with optional key points, decisions, and questions\n */\n async getConversationSummary(\n params: Omit<MailSummaryRequestParams, '_meta'>\n ): Promise<MailSummaryResponseResult> {\n return this.#connection.sendRequest<MailSummaryRequestParams, MailSummaryResponseResult>(\n MAIL_METHODS.MAIL_SUMMARY,\n params\n );\n }\n\n /**\n * Replay turns from a conversation, optionally from a specific point.\n *\n * @param params - Replay parameters including conversationId and optional starting point\n * @returns Replayed turns with pagination info\n */\n async replayConversation(\n params: Omit<MailReplayRequestParams, '_meta'>\n ): Promise<MailReplayResponseResult> {\n return this.#connection.sendRequest<MailReplayRequestParams, MailReplayResponseResult>(\n MAIL_METHODS.MAIL_REPLAY,\n params\n );\n }\n\n /**\n * Send a message to an address with mail context attached.\n *\n * Wraps the standard `send()` method, automatically attaching `meta.mail`\n * with the specified conversationId so the message is recorded as a turn\n * in the conversation.\n *\n * @param to - Target address\n * @param payload - Message payload\n * @param conversationId - Conversation to associate with\n * @param options - Optional threadId and additional message meta\n * @returns Send result\n */\n async sendWithMail(\n to: Address,\n payload: unknown,\n conversationId: ConversationId,\n options?: { threadId?: ThreadId; meta?: MessageMeta }\n ): Promise<SendResponseResult> {\n return this.send(to, payload, {\n ...options?.meta,\n mail: { conversationId, threadId: options?.threadId },\n });\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n *\n * @example\n * ```typescript\n * const unsubscribe = client.onReconnection((event) => {\n * switch (event.type) {\n * case 'disconnected':\n * console.log('Connection lost');\n * break;\n * case 'reconnecting':\n * console.log(`Reconnecting, attempt ${event.attempt}`);\n * break;\n * case 'reconnected':\n * console.log('Reconnected successfully');\n * break;\n * case 'reconnectFailed':\n * console.log('Failed to reconnect:', event.error);\n * break;\n * }\n * });\n * ```\n */\n onReconnection(handler: ReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Handle incoming notifications\n */\n async #handleNotification(method: string, params: unknown): Promise<void> {\n switch (method) {\n case NOTIFICATION_METHODS.EVENT: {\n const eventParams = params as EventNotificationParams;\n const subscription = this.#subscriptions.get(eventParams.subscriptionId);\n if (subscription) {\n subscription._pushEvent(eventParams);\n } else {\n console.warn('MAP: Event for unknown subscription:', eventParams.subscriptionId);\n }\n break;\n }\n\n case NOTIFICATION_METHODS.MESSAGE: {\n // Message notifications could be handled here if needed\n // For now, they're delivered through event subscriptions\n break;\n }\n\n default:\n console.warn('MAP: Unknown notification:', method);\n }\n }\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<ReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-authenticate\n const connectResult = await this.connect(this.#lastConnectOptions);\n\n // Update stored values\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Restore subscriptions if enabled\n if (options.restoreSubscriptions !== false) {\n await this.#restoreSubscriptions();\n }\n }\n\n /**\n * Restore subscriptions after reconnection\n */\n async #restoreSubscriptions(): Promise<void> {\n const options = this.#options.reconnection!;\n const subscriptionEntries = Array.from(this.#subscriptionStates.entries());\n\n // Clear old subscription tracking (IDs will change)\n this.#subscriptions.clear();\n this.#subscriptionStates.clear();\n\n for (const [oldId, state] of subscriptionEntries) {\n try {\n // Create new subscription with same filter\n const newSubscription = await this.subscribe(state.filter);\n const newId = newSubscription.id;\n\n // Replay missed events if enabled\n if (options.replayOnRestore !== false && state.lastEventId) {\n const maxEvents = options.maxReplayEventsPerSubscription ?? 1000;\n\n try {\n let replayedCount = 0;\n let afterEventId: string | undefined = state.lastEventId;\n let hasMore = true;\n\n // Paginate through replayed events\n while (hasMore && replayedCount < maxEvents) {\n const result = await this.replay({\n afterEventId,\n filter: state.filter,\n limit: Math.min(100, maxEvents - replayedCount),\n });\n\n for (const replayedEvent of result.events) {\n if (replayedCount >= maxEvents) break;\n\n // Push replayed event to the new subscription\n newSubscription._pushEvent({\n subscriptionId: newId,\n sequenceNumber: replayedCount + 1,\n eventId: replayedEvent.eventId,\n timestamp: replayedEvent.timestamp,\n event: replayedEvent.event,\n });\n\n replayedCount++;\n }\n\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: if no events returned but hasMore is true, break\n if (result.events.length === 0) {\n break;\n }\n }\n } catch (replayError) {\n // Replay is best-effort, log but don't fail restoration\n console.warn('MAP: Failed to replay events for subscription:', oldId, replayError);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'subscriptionRestored',\n subscriptionId: oldId,\n newSubscriptionId: newId,\n });\n } catch (error) {\n this.#emitReconnectionEvent({\n type: 'subscriptionRestoreFailed',\n subscriptionId: oldId,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n }\n}\n","/**\n * Agent connection for MAP protocol\n *\n * Used by agents to connect to a MAP system, receive messages,\n * update state, spawn children, and communicate with peers.\n */\n\nimport { type Stream, websocketStream, waitForOpen } from '../stream';\nimport type {\n AgenticMeshStreamConfig,\n MeshPeerEndpoint,\n MeshTransportAdapter,\n} from '../stream/agentic-mesh';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport { Subscription, createSubscription } from '../subscription';\nimport {\n CORE_METHODS,\n LIFECYCLE_METHODS,\n STATE_METHODS,\n SCOPE_METHODS,\n AUTH_METHODS,\n MAIL_METHODS,\n NOTIFICATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type AgentId,\n type ScopeId,\n type SubscriptionId,\n type Address,\n type Agent,\n type AgentState,\n type AgentVisibility,\n type Scope,\n type Message,\n type MessageMeta,\n type SubscriptionFilter,\n type EventNotificationParams,\n type MessageNotificationParams,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type AgentsRegisterRequestParams,\n type AgentsRegisterResponseResult,\n type AgentsSpawnRequestParams,\n type AgentsSpawnResponseResult,\n type AgentsUpdateResponseResult,\n type AgentsUnregisterResponseResult,\n type SendRequestParams,\n type SendResponseResult,\n type SubscribeRequestParams,\n type SubscribeResponseResult,\n type UnsubscribeResponseResult,\n type ScopesCreateRequestParams,\n type ScopesCreateResponseResult,\n type ScopesJoinResponseResult,\n type ScopesLeaveResponseResult,\n type AuthenticateRequestParams,\n type AuthenticateResponseResult,\n type AuthPrincipal,\n type ConversationId,\n type ThreadId,\n type MailCreateRequestParams,\n type MailCreateResponseResult,\n type MailGetRequestParams,\n type MailGetResponseResult,\n type MailListRequestParams,\n type MailListResponseResult,\n type MailCloseRequestParams,\n type MailCloseResponseResult,\n type MailJoinRequestParams,\n type MailJoinResponseResult,\n type MailLeaveRequestParams,\n type MailLeaveResponseResult,\n type MailInviteRequestParams,\n type MailInviteResponseResult,\n type MailTurnRequestParams,\n type MailTurnResponseResult,\n type MailTurnsListRequestParams,\n type MailTurnsListResponseResult,\n type MailThreadCreateRequestParams,\n type MailThreadCreateResponseResult,\n type MailThreadListRequestParams,\n type MailThreadListResponseResult,\n type MailSummaryRequestParams,\n type MailSummaryResponseResult,\n type MailReplayRequestParams,\n type MailReplayResponseResult,\n} from '../types';\n\n/**\n * Handler for incoming messages addressed to this agent\n */\nexport type MessageHandler = (message: Message) => void | Promise<void>;\n\n/**\n * Options for automatic reconnection\n */\nexport interface AgentReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n /** Restore scope memberships after reconnect (default: true) */\n restoreScopeMemberships?: boolean;\n}\n\n/**\n * Agent reconnection event types\n */\nexport type AgentReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed';\n\n/**\n * Handler for reconnection events\n */\nexport type AgentReconnectionEventHandler = (event: {\n type: AgentReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n}) => void;\n\n/**\n * Options for agent connection\n */\nexport interface AgentConnectionOptions extends BaseConnectionOptions {\n /** Agent name */\n name?: string;\n /** Agent role */\n role?: string;\n /** Agent capabilities */\n capabilities?: ParticipantCapabilities;\n /** Agent visibility */\n visibility?: AgentVisibility;\n /** Parent agent ID (if this is a child agent) */\n parent?: AgentId;\n /** Initial scopes to join */\n scopes?: ScopeId[];\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: AgentReconnectionOptions;\n}\n\n/**\n * Options for AgentConnection.connect() static method\n */\nexport interface AgentConnectOptions {\n /** Agent name */\n name?: string;\n /** Agent role */\n role?: string;\n /** Agent capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Agent visibility settings */\n visibility?: AgentVisibility;\n /** Parent agent ID (for child agents) */\n parent?: AgentId;\n /** Initial scopes to join */\n scopes?: ScopeId[];\n /** Initial metadata */\n metadata?: Record<string, unknown>;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `AgentReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | AgentReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n}\n\n/**\n * Options for AgentConnection.connectMesh() static method\n */\nexport interface AgentMeshConnectOptions {\n /** The agentic-mesh transport adapter (Nebula, Tailscale, etc.) */\n transport: MeshTransportAdapter;\n /** Remote peer to connect to */\n peer: MeshPeerEndpoint;\n /** Local peer ID for identification */\n localPeerId: string;\n /** Agent name */\n name?: string;\n /** Agent role */\n role?: string;\n /** Agent capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Agent visibility settings */\n visibility?: AgentVisibility;\n /** Parent agent ID (for child agents) */\n parent?: AgentId;\n /** Initial scopes to join */\n scopes?: ScopeId[];\n /** Initial metadata */\n metadata?: Record<string, unknown>;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `AgentReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | AgentReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n timeout?: number;\n}\n\n/**\n * Agent connection to a MAP system.\n *\n * Provides methods for:\n * - Registering self with the system\n * - Receiving and handling messages\n * - Sending messages to other agents\n * - Spawning child agents\n * - Updating own state\n * - Managing scope memberships\n */\nexport class AgentConnection {\n #connection: BaseConnection;\n readonly #subscriptions: Map<SubscriptionId, Subscription> = new Map();\n readonly #options: AgentConnectionOptions;\n readonly #messageHandlers: Set<MessageHandler> = new Set();\n readonly #reconnectionHandlers: Set<AgentReconnectionEventHandler> = new Set();\n readonly #scopeMemberships: Set<ScopeId> = new Set();\n\n #agentId: AgentId | null = null;\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #currentState: AgentState = 'registered';\n #connected = false;\n #lastConnectOptions?: {\n agentId?: AgentId;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n #isReconnecting = false;\n\n constructor(stream: Stream, options: AgentConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Set up notification handler for events and messages\n this.#connection.setNotificationHandler(this.#handleNotification.bind(this));\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Static Factory Methods\n // ===========================================================================\n\n /**\n * Connect and register an agent via WebSocket URL.\n *\n * Handles:\n * - WebSocket creation and connection\n * - Stream wrapping\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n * - Agent registration\n *\n * @param url - WebSocket URL (ws:// or wss://)\n * @param options - Connection and agent options\n * @returns Connected and registered AgentConnection instance\n *\n * @example\n * ```typescript\n * const agent = await AgentConnection.connect('ws://localhost:8080', {\n * name: 'Worker',\n * role: 'processor',\n * reconnection: true\n * });\n *\n * // Already registered, ready to work\n * agent.onMessage(handleMessage);\n * await agent.busy();\n * ```\n */\n static async connect(\n url: string,\n options?: AgentConnectOptions\n ): Promise<AgentConnection> {\n // Validate URL\n const parsedUrl = new URL(url);\n if (!['ws:', 'wss:'].includes(parsedUrl.protocol)) {\n throw new Error(\n `Unsupported protocol: ${parsedUrl.protocol}. Use ws: or wss:`\n );\n }\n\n const timeout = options?.connectTimeout ?? 10000;\n\n // Create and connect WebSocket\n const ws = new WebSocket(url);\n await waitForOpen(ws, timeout);\n const stream = websocketStream(ws);\n\n // Configure createStream for reconnection\n const createStream = async () => {\n const newWs = new WebSocket(url);\n await waitForOpen(newWs, timeout);\n return websocketStream(newWs);\n };\n\n // Normalize reconnection option\n const reconnection =\n options?.reconnection === true\n ? { enabled: true }\n : typeof options?.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const agent = new AgentConnection(stream, {\n name: options?.name,\n role: options?.role,\n capabilities: options?.capabilities,\n visibility: options?.visibility,\n parent: options?.parent,\n scopes: options?.scopes,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake and registration\n await agent.connect({ auth: options?.auth });\n\n return agent;\n }\n\n /**\n * Connect and register an agent via agentic-mesh transport.\n *\n * Handles:\n * - Dynamic import of agentic-mesh (optional peer dependency)\n * - Stream creation over encrypted mesh tunnel\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n * - Agent registration\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param options - Mesh connection and agent options\n * @returns Connected and registered AgentConnection instance\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n *\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * const agent = await AgentConnection.connectMesh({\n * transport,\n * peer: { peerId: 'server', address: '10.0.0.1', port: 4242 },\n * localPeerId: 'my-agent',\n * name: 'MeshWorker',\n * role: 'processor',\n * reconnection: true\n * });\n *\n * agent.onMessage(handleMessage);\n * await agent.busy();\n * ```\n */\n static async connectMesh(options: AgentMeshConnectOptions): Promise<AgentConnection> {\n // Dynamic import for optional peer dependency\n const { agenticMeshStream } = await import('../stream/agentic-mesh');\n\n const streamConfig: AgenticMeshStreamConfig = {\n transport: options.transport,\n peer: options.peer,\n localPeerId: options.localPeerId,\n timeout: options.timeout,\n };\n\n // Create initial stream\n const stream = await agenticMeshStream(streamConfig);\n\n // Configure createStream for reconnection\n const createStream = async () => agenticMeshStream(streamConfig);\n\n // Normalize reconnection option\n const reconnection =\n options.reconnection === true\n ? { enabled: true }\n : typeof options.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const agent = new AgentConnection(stream, {\n name: options.name,\n role: options.role,\n capabilities: options.capabilities,\n visibility: options.visibility,\n parent: options.parent,\n scopes: options.scopes,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake and registration\n await agent.connect({ auth: options.auth });\n\n return agent;\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect and register with the MAP system\n */\n async connect(options?: {\n agentId?: AgentId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n }): Promise<{ connection: ConnectResponseResult; agent: Agent }> {\n // First, establish the connection\n const connectParams: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'agent',\n participantId: options?.agentId,\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n resumeToken: options?.resumeToken,\n auth: options?.auth,\n };\n\n const connectResult = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, connectParams);\n\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n this.#connected = true;\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n // Then register as an agent\n const registerParams: AgentsRegisterRequestParams = {\n agentId: options?.agentId,\n name: this.#options.name,\n role: this.#options.role,\n parent: this.#options.parent,\n scopes: this.#options.scopes,\n visibility: this.#options.visibility,\n capabilities: this.#options.capabilities,\n };\n\n const registerResult = await this.#connection.sendRequest<\n AgentsRegisterRequestParams,\n AgentsRegisterResponseResult\n >(LIFECYCLE_METHODS.AGENTS_REGISTER, registerParams);\n\n this.#agentId = registerResult.agent.id;\n this.#currentState = registerResult.agent.state;\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n return { connection: connectResult, agent: registerResult.agent };\n }\n\n /**\n * Authenticate with the server after connection.\n *\n * Use this when the server returns `authRequired` in the connect response,\n * indicating that authentication is needed before registering or accessing\n * protected resources.\n *\n * @param auth - Authentication credentials\n * @returns Authentication result with principal if successful\n *\n * @example\n * ```typescript\n * const agent = new AgentConnection(stream, { name: 'MyAgent' });\n *\n * // First connect to get auth requirements\n * const connectResult = await agent.connectOnly();\n *\n * if (connectResult.authRequired) {\n * const authResult = await agent.authenticate({\n * method: 'api-key',\n * token: process.env.AGENT_API_KEY,\n * });\n *\n * if (authResult.success) {\n * // Now register the agent\n * await agent.register({ name: 'MyAgent', role: 'worker' });\n * }\n * }\n * ```\n */\n async authenticate(auth: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n }): Promise<AuthenticateResponseResult> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.token,\n };\n\n const result = await this.#connection.sendRequest<\n AuthenticateRequestParams,\n AuthenticateResponseResult\n >(AUTH_METHODS.AUTHENTICATE, params);\n\n // Update session info if auth succeeded\n if (result.success && result.sessionId) {\n this.#sessionId = result.sessionId;\n }\n\n return result;\n }\n\n /**\n * Refresh authentication credentials.\n *\n * Use this to update credentials before they expire for long-lived connections.\n *\n * @param auth - New authentication credentials\n * @returns Updated principal information\n */\n async refreshAuth(auth: {\n method: \"bearer\" | \"api-key\" | \"mtls\" | \"none\";\n token?: string;\n }): Promise<{\n success: boolean;\n principal?: AuthPrincipal;\n error?: { code: string; message: string };\n }> {\n const params: AuthenticateRequestParams = {\n method: auth.method,\n credential: auth.token,\n };\n\n return this.#connection.sendRequest(AUTH_METHODS.AUTH_REFRESH, params);\n }\n\n /**\n * Disconnect from the MAP system\n * @param reason - Optional reason for disconnecting\n * @returns Resume token that can be used to resume this session later\n */\n async disconnect(reason?: string): Promise<string | undefined> {\n if (!this.#connected) return undefined;\n\n let resumeToken: string | undefined;\n try {\n // Unregister the agent first\n if (this.#agentId) {\n await this.#connection.sendRequest<\n { agentId: AgentId; reason?: string },\n AgentsUnregisterResponseResult\n >(LIFECYCLE_METHODS.AGENTS_UNREGISTER, {\n agentId: this.#agentId,\n reason,\n });\n }\n\n // Then disconnect\n const result = await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n resumeToken = result.resumeToken;\n } finally {\n // Close all subscriptions\n for (const subscription of this.#subscriptions.values()) {\n subscription._close();\n }\n this.#subscriptions.clear();\n\n await this.#connection.close();\n this.#connected = false;\n }\n return resumeToken;\n }\n\n /**\n * Whether the agent is connected\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * This agent's ID\n */\n get agentId(): AgentId | null {\n return this.#agentId;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * Current agent state\n */\n get state(): AgentState {\n return this.#currentState;\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Message Handling\n // ===========================================================================\n\n /**\n * Register a handler for incoming messages\n */\n onMessage(handler: MessageHandler): this {\n this.#messageHandlers.add(handler);\n return this;\n }\n\n /**\n * Remove a message handler\n */\n offMessage(handler: MessageHandler): this {\n this.#messageHandlers.delete(handler);\n return this;\n }\n\n // ===========================================================================\n // State Management\n // ===========================================================================\n\n /**\n * Update this agent's state\n */\n async updateState(state: AgentState): Promise<Agent> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { agentId: AgentId; state: AgentState },\n AgentsUpdateResponseResult\n >(STATE_METHODS.AGENTS_UPDATE, {\n agentId: this.#agentId,\n state,\n });\n\n this.#currentState = result.agent.state;\n return result.agent;\n }\n\n /**\n * Update this agent's metadata\n */\n async updateMetadata(metadata: Record<string, unknown>): Promise<Agent> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { agentId: AgentId; metadata: Record<string, unknown> },\n AgentsUpdateResponseResult\n >(STATE_METHODS.AGENTS_UPDATE, {\n agentId: this.#agentId,\n metadata,\n });\n\n return result.agent;\n }\n\n /**\n * Mark this agent as busy\n */\n async busy(): Promise<Agent> {\n return this.updateState('busy');\n }\n\n /**\n * Mark this agent as idle\n */\n async idle(): Promise<Agent> {\n return this.updateState('idle');\n }\n\n /**\n * Mark this agent as done/stopped\n */\n async done(result?: { exitCode?: number; exitReason?: string }): Promise<void> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n await this.updateState('stopped');\n\n // Optionally update metadata with result\n if (result) {\n await this.updateMetadata({\n exitCode: result.exitCode,\n exitReason: result.exitReason,\n });\n }\n }\n\n // ===========================================================================\n // Child Agent Management\n // ===========================================================================\n\n /**\n * Spawn a child agent\n */\n async spawn(options: {\n agentId?: AgentId;\n name?: string;\n role?: string;\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n scopes?: ScopeId[];\n initialMessage?: Message;\n metadata?: Record<string, unknown>;\n }): Promise<AgentsSpawnResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const params: AgentsSpawnRequestParams = {\n ...options,\n parent: this.#agentId,\n };\n\n return this.#connection.sendRequest<\n AgentsSpawnRequestParams,\n AgentsSpawnResponseResult\n >(LIFECYCLE_METHODS.AGENTS_SPAWN, params);\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send a message to an address\n */\n async send(\n to: Address,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n const params: SendRequestParams = { to };\n if (payload !== undefined) params.payload = payload;\n if (meta) params.meta = meta;\n\n return this.#connection.sendRequest(CORE_METHODS.SEND, params);\n }\n\n /**\n * Send a message to the parent agent\n */\n async sendToParent(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ parent: true }, payload, {\n ...meta,\n relationship: 'child-to-parent',\n });\n }\n\n /**\n * Send a message to child agents\n */\n async sendToChildren(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ children: true }, payload, {\n ...meta,\n relationship: 'parent-to-child',\n });\n }\n\n /**\n * Send a message to a specific agent\n */\n async sendToAgent(\n agentId: AgentId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: agentId }, payload, meta);\n }\n\n /**\n * Send a message to all agents in a scope\n */\n async sendToScope(\n scopeId: ScopeId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ scope: scopeId }, payload, meta);\n }\n\n /**\n * Send a message to sibling agents\n */\n async sendToSiblings(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ siblings: true }, payload, {\n ...meta,\n relationship: 'peer',\n });\n }\n\n /**\n * Reply to a message (uses correlationId from original)\n */\n async reply(\n originalMessage: Message,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: originalMessage.from as AgentId }, payload, {\n ...meta,\n correlationId: originalMessage.meta?.correlationId ?? originalMessage.id,\n isResult: true,\n });\n }\n\n // ===========================================================================\n // Scope Management\n // ===========================================================================\n\n /**\n * Create a new scope\n */\n async createScope(options: ScopesCreateRequestParams): Promise<Scope> {\n const result = await this.#connection.sendRequest<\n ScopesCreateRequestParams,\n ScopesCreateResponseResult\n >(SCOPE_METHODS.SCOPES_CREATE, options);\n return result.scope;\n }\n\n /**\n * Join a scope\n */\n async joinScope(scopeId: ScopeId): Promise<ScopesJoinResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId; agentId: AgentId },\n ScopesJoinResponseResult\n >(SCOPE_METHODS.SCOPES_JOIN, {\n scopeId,\n agentId: this.#agentId,\n });\n\n // Track scope membership for potential restoration\n this.#scopeMemberships.add(scopeId);\n\n return result;\n }\n\n /**\n * Leave a scope\n */\n async leaveScope(scopeId: ScopeId): Promise<ScopesLeaveResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId; agentId: AgentId },\n ScopesLeaveResponseResult\n >(SCOPE_METHODS.SCOPES_LEAVE, {\n scopeId,\n agentId: this.#agentId,\n });\n\n // Remove from tracked scope memberships\n this.#scopeMemberships.delete(scopeId);\n\n return result;\n }\n\n // ===========================================================================\n // Subscriptions\n // ===========================================================================\n\n /**\n * Subscribe to events\n */\n async subscribe(filter?: SubscriptionFilter): Promise<Subscription> {\n const params: SubscribeRequestParams = {};\n if (filter) params.filter = filter;\n\n const result = await this.#connection.sendRequest<\n SubscribeRequestParams,\n SubscribeResponseResult\n >(CORE_METHODS.SUBSCRIBE, params);\n\n const subscription = createSubscription(\n result.subscriptionId,\n () => this.unsubscribe(result.subscriptionId),\n { filter }\n );\n\n this.#subscriptions.set(result.subscriptionId, subscription);\n\n return subscription;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(subscriptionId: SubscriptionId): Promise<void> {\n const subscription = this.#subscriptions.get(subscriptionId);\n if (subscription) {\n subscription._close();\n this.#subscriptions.delete(subscriptionId);\n }\n\n await this.#connection.sendRequest<\n { subscriptionId: SubscriptionId },\n UnsubscribeResponseResult\n >(CORE_METHODS.UNSUBSCRIBE, { subscriptionId });\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get connectionState(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n */\n onReconnection(handler: AgentReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Mail\n // ===========================================================================\n\n /**\n * Create a new mail conversation.\n *\n * @param params - Conversation creation parameters\n * @returns Created conversation and participant info\n */\n async createConversation(\n params?: Omit<MailCreateRequestParams, '_meta'>\n ): Promise<MailCreateResponseResult> {\n return this.#connection.sendRequest<MailCreateRequestParams, MailCreateResponseResult>(\n MAIL_METHODS.MAIL_CREATE,\n params ?? {}\n );\n }\n\n /**\n * Get a conversation by ID with optional includes.\n *\n * @param conversationId - ID of the conversation to retrieve\n * @param include - Optional fields to include (participants, threads, recentTurns, stats)\n * @returns Conversation details with requested includes\n */\n async getConversation(\n conversationId: ConversationId,\n include?: MailGetRequestParams['include']\n ): Promise<MailGetResponseResult> {\n return this.#connection.sendRequest<MailGetRequestParams, MailGetResponseResult>(\n MAIL_METHODS.MAIL_GET,\n { conversationId, include }\n );\n }\n\n /**\n * List conversations with optional filters.\n *\n * @param params - Optional filter, limit, and cursor parameters\n * @returns Paginated list of conversations\n */\n async listConversations(\n params?: Omit<MailListRequestParams, '_meta'>\n ): Promise<MailListResponseResult> {\n return this.#connection.sendRequest<MailListRequestParams, MailListResponseResult>(\n MAIL_METHODS.MAIL_LIST,\n params ?? {}\n );\n }\n\n /**\n * Close a conversation.\n *\n * @param conversationId - ID of the conversation to close\n * @param reason - Optional reason for closing\n * @returns The closed conversation\n */\n async closeConversation(\n conversationId: ConversationId,\n reason?: string\n ): Promise<MailCloseResponseResult> {\n return this.#connection.sendRequest<MailCloseRequestParams, MailCloseResponseResult>(\n MAIL_METHODS.MAIL_CLOSE,\n { conversationId, reason }\n );\n }\n\n /**\n * Join an existing conversation.\n *\n * @param params - Join parameters including conversationId and optional catch-up config\n * @returns Conversation, participant, and optional history\n */\n async joinConversation(\n params: Omit<MailJoinRequestParams, '_meta'>\n ): Promise<MailJoinResponseResult> {\n return this.#connection.sendRequest<MailJoinRequestParams, MailJoinResponseResult>(\n MAIL_METHODS.MAIL_JOIN,\n params\n );\n }\n\n /**\n * Leave a conversation.\n *\n * @param conversationId - ID of the conversation to leave\n * @param reason - Optional reason for leaving\n * @returns Leave confirmation with timestamp\n */\n async leaveConversation(\n conversationId: ConversationId,\n reason?: string\n ): Promise<MailLeaveResponseResult> {\n return this.#connection.sendRequest<MailLeaveRequestParams, MailLeaveResponseResult>(\n MAIL_METHODS.MAIL_LEAVE,\n { conversationId, reason }\n );\n }\n\n /**\n * Invite a participant to a conversation.\n *\n * @param params - Invite parameters including conversationId and participant info\n * @returns Invite result\n */\n async inviteToConversation(\n params: Omit<MailInviteRequestParams, '_meta'>\n ): Promise<MailInviteResponseResult> {\n return this.#connection.sendRequest<MailInviteRequestParams, MailInviteResponseResult>(\n MAIL_METHODS.MAIL_INVITE,\n params\n );\n }\n\n /**\n * Record a turn (message) in a conversation.\n *\n * @param params - Turn parameters including conversationId, contentType, and content\n * @returns The created turn\n */\n async recordTurn(\n params: Omit<MailTurnRequestParams, '_meta'>\n ): Promise<MailTurnResponseResult> {\n return this.#connection.sendRequest<MailTurnRequestParams, MailTurnResponseResult>(\n MAIL_METHODS.MAIL_TURN,\n params\n );\n }\n\n /**\n * List turns in a conversation with optional filters.\n *\n * @param params - List parameters including conversationId and optional filters\n * @returns Paginated list of turns\n */\n async listTurns(\n params: Omit<MailTurnsListRequestParams, '_meta'>\n ): Promise<MailTurnsListResponseResult> {\n return this.#connection.sendRequest<MailTurnsListRequestParams, MailTurnsListResponseResult>(\n MAIL_METHODS.MAIL_TURNS_LIST,\n params\n );\n }\n\n /**\n * Create a thread in a conversation.\n *\n * @param params - Thread creation parameters including conversationId and rootTurnId\n * @returns The created thread\n */\n async createThread(\n params: Omit<MailThreadCreateRequestParams, '_meta'>\n ): Promise<MailThreadCreateResponseResult> {\n return this.#connection.sendRequest<MailThreadCreateRequestParams, MailThreadCreateResponseResult>(\n MAIL_METHODS.MAIL_THREAD_CREATE,\n params\n );\n }\n\n /**\n * List threads in a conversation.\n *\n * @param params - List parameters including conversationId\n * @returns Paginated list of threads\n */\n async listThreads(\n params: Omit<MailThreadListRequestParams, '_meta'>\n ): Promise<MailThreadListResponseResult> {\n return this.#connection.sendRequest<MailThreadListRequestParams, MailThreadListResponseResult>(\n MAIL_METHODS.MAIL_THREAD_LIST,\n params\n );\n }\n\n /**\n * Get a summary of a conversation.\n *\n * @param params - Summary parameters including conversationId and optional scope/includes\n * @returns Generated summary with optional key points, decisions, and questions\n */\n async getConversationSummary(\n params: Omit<MailSummaryRequestParams, '_meta'>\n ): Promise<MailSummaryResponseResult> {\n return this.#connection.sendRequest<MailSummaryRequestParams, MailSummaryResponseResult>(\n MAIL_METHODS.MAIL_SUMMARY,\n params\n );\n }\n\n /**\n * Replay turns from a conversation, optionally from a specific point.\n *\n * @param params - Replay parameters including conversationId and optional starting point\n * @returns Replayed turns with pagination info\n */\n async replayConversation(\n params: Omit<MailReplayRequestParams, '_meta'>\n ): Promise<MailReplayResponseResult> {\n return this.#connection.sendRequest<MailReplayRequestParams, MailReplayResponseResult>(\n MAIL_METHODS.MAIL_REPLAY,\n params\n );\n }\n\n /**\n * Send a message to an agent with mail context attached.\n *\n * Wraps the standard `send()` method, automatically attaching `meta.mail`\n * with the specified conversationId so the message is recorded as a turn\n * in the conversation.\n *\n * @param to - Target address\n * @param payload - Message payload\n * @param conversationId - Conversation to associate with\n * @param options - Optional threadId and additional message meta\n * @returns Send result\n */\n async sendWithMail(\n to: Address,\n payload: unknown,\n conversationId: ConversationId,\n options?: { threadId?: ThreadId; meta?: MessageMeta }\n ): Promise<SendResponseResult> {\n return this.send(to, payload, {\n ...options?.meta,\n mail: { conversationId, threadId: options?.threadId },\n });\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Handle incoming notifications\n */\n async #handleNotification(method: string, params: unknown): Promise<void> {\n switch (method) {\n case NOTIFICATION_METHODS.EVENT: {\n const eventParams = params as EventNotificationParams;\n const subscription = this.#subscriptions.get(eventParams.subscriptionId);\n if (subscription) {\n subscription._pushEvent(eventParams);\n }\n break;\n }\n\n case NOTIFICATION_METHODS.MESSAGE: {\n const messageParams = params as MessageNotificationParams;\n // Deliver to message handlers\n for (const handler of this.#messageHandlers) {\n try {\n await handler(messageParams.message);\n } catch (error) {\n console.error('MAP: Message handler error:', error);\n }\n }\n break;\n }\n\n default:\n console.warn('MAP: Unknown notification:', method);\n }\n }\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<AgentReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n // Store current scopes for restoration\n const scopesToRestore = Array.from(this.#scopeMemberships);\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-establish connection and registration\n // Use the stored agentId to try to reclaim the same identity\n const result = await this.connect({\n agentId: this.#agentId ?? this.#lastConnectOptions?.agentId,\n auth: this.#lastConnectOptions?.auth,\n });\n\n // Update stored values\n this.#agentId = result.agent.id;\n this.#sessionId = result.connection.sessionId;\n this.#serverCapabilities = result.connection.capabilities;\n this.#currentState = result.agent.state;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Restore scope memberships if enabled\n if (options.restoreScopeMemberships !== false) {\n await this.#restoreScopeMemberships(scopesToRestore);\n }\n }\n\n /**\n * Restore scope memberships after reconnection\n */\n async #restoreScopeMemberships(scopes: ScopeId[]): Promise<void> {\n // Clear tracked memberships (will be re-added by joinScope)\n this.#scopeMemberships.clear();\n\n for (const scopeId of scopes) {\n try {\n await this.joinScope(scopeId);\n } catch (error) {\n console.warn('MAP: Failed to restore scope membership:', scopeId, error);\n }\n }\n }\n}\n","/**\n * Federation Envelope Utilities\n *\n * Provides functions for creating and processing federation envelopes\n * for routing messages between federated MAP systems.\n */\n\nimport type { FederationEnvelope, FederationRoutingConfig } from '../types';\nimport { ERROR_CODES } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for creating a federation envelope.\n */\nexport interface CreateEnvelopeOptions {\n /** Correlation ID for cross-system tracing */\n correlationId?: string;\n /** Maximum number of hops before rejection */\n maxHops?: number;\n /** Whether to track the full routing path */\n trackPath?: boolean;\n}\n\n/**\n * Result of processing a federation envelope.\n */\nexport type ProcessEnvelopeResult<T> =\n | {\n success: true;\n envelope: FederationEnvelope<T>;\n }\n | {\n success: false;\n errorCode: number;\n errorMessage: string;\n };\n\n// =============================================================================\n// Envelope Creation\n// =============================================================================\n\n/**\n * Create a new federation envelope for outbound messages.\n *\n * @param payload - The payload to wrap (typically a Message)\n * @param sourceSystem - ID of the originating system\n * @param targetSystem - ID of the destination system\n * @param options - Optional envelope options\n * @returns A new federation envelope\n *\n * @example\n * ```typescript\n * const envelope = createFederationEnvelope(\n * message,\n * 'system-alpha',\n * 'system-beta',\n * { trackPath: true, correlationId: 'req-123' }\n * );\n * ```\n */\nexport function createFederationEnvelope<T>(\n payload: T,\n sourceSystem: string,\n targetSystem: string,\n options?: CreateEnvelopeOptions\n): FederationEnvelope<T> {\n return {\n payload,\n federation: {\n sourceSystem,\n targetSystem,\n hopCount: 0,\n maxHops: options?.maxHops,\n path: options?.trackPath ? [sourceSystem] : undefined,\n originTimestamp: Date.now(),\n correlationId: options?.correlationId,\n },\n };\n}\n\n// =============================================================================\n// Envelope Processing\n// =============================================================================\n\n/**\n * Process an incoming federation envelope for forwarding.\n *\n * Validates the envelope against routing configuration and returns\n * an updated envelope ready for forwarding, or an error if routing\n * should be rejected.\n *\n * Checks performed:\n * 1. Hop count hasn't exceeded maximum\n * 2. No routing loops (if path tracking enabled)\n * 3. Source system is in allowed sources (if configured)\n * 4. Target system is in allowed targets (if configured)\n *\n * @param envelope - The incoming envelope\n * @param config - Routing configuration for this system\n * @returns Updated envelope or error result\n *\n * @example\n * ```typescript\n * const result = processFederationEnvelope(envelope, {\n * systemId: 'system-gamma',\n * maxHops: 5,\n * trackPath: true,\n * });\n *\n * if (result.success) {\n * forwardToNext(result.envelope);\n * } else {\n * rejectWithError(result.errorCode, result.errorMessage);\n * }\n * ```\n */\nexport function processFederationEnvelope<T>(\n envelope: FederationEnvelope<T>,\n config: FederationRoutingConfig\n): ProcessEnvelopeResult<T> {\n const { federation } = envelope;\n const maxHops = federation.maxHops ?? config.maxHops ?? 10;\n\n // Check hop count\n if (federation.hopCount >= maxHops) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_MAX_HOPS_EXCEEDED,\n errorMessage: `Message exceeded maximum hop count of ${maxHops}`,\n };\n }\n\n // Check for loops (if path tracking enabled)\n if (federation.path?.includes(config.systemId)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_LOOP_DETECTED,\n errorMessage: `Loop detected: message already visited ${config.systemId}`,\n };\n }\n\n // Check source allowlist\n if (config.allowedSources && !config.allowedSources.includes(federation.sourceSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Source system ${federation.sourceSystem} not in allowed sources`,\n };\n }\n\n // Check target allowlist\n if (config.allowedTargets && !config.allowedTargets.includes(federation.targetSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Target system ${federation.targetSystem} not in allowed targets`,\n };\n }\n\n // Update for forwarding\n return {\n success: true,\n envelope: {\n payload: envelope.payload,\n federation: {\n ...federation,\n hopCount: federation.hopCount + 1,\n path: config.trackPath ? [...(federation.path ?? []), config.systemId] : federation.path,\n },\n },\n };\n}\n\n// =============================================================================\n// Envelope Utilities\n// =============================================================================\n\n/**\n * Check if an envelope has reached its final destination.\n *\n * @param envelope - The envelope to check\n * @param currentSystemId - ID of the current system\n * @returns true if this is the target system\n */\nexport function isEnvelopeAtDestination(\n envelope: FederationEnvelope<unknown>,\n currentSystemId: string\n): boolean {\n return envelope.federation.targetSystem === currentSystemId;\n}\n\n/**\n * Extract the payload from a federation envelope.\n *\n * @param envelope - The envelope to unwrap\n * @returns The payload\n */\nexport function unwrapEnvelope<T>(envelope: FederationEnvelope<T>): T {\n return envelope.payload;\n}\n\n/**\n * Get routing metadata for logging/debugging.\n *\n * @param envelope - The envelope to inspect\n * @returns Routing information\n */\nexport function getEnvelopeRoutingInfo(envelope: FederationEnvelope<unknown>): {\n source: string;\n target: string;\n hops: number;\n path?: string[];\n age: number;\n correlationId?: string;\n} {\n const { federation } = envelope;\n return {\n source: federation.sourceSystem,\n target: federation.targetSystem,\n hops: federation.hopCount,\n path: federation.path,\n age: Date.now() - federation.originTimestamp,\n correlationId: federation.correlationId,\n };\n}\n\n/**\n * Validate that an object is a valid federation envelope.\n *\n * @param obj - Object to validate\n * @returns true if valid envelope structure\n */\nexport function isValidEnvelope(obj: unknown): obj is FederationEnvelope<unknown> {\n if (!obj || typeof obj !== 'object') return false;\n\n const envelope = obj as Record<string, unknown>;\n if (!('payload' in envelope) || !('federation' in envelope)) return false;\n\n const federation = envelope.federation as Record<string, unknown>;\n if (!federation || typeof federation !== 'object') return false;\n\n return (\n typeof federation.sourceSystem === 'string' &&\n typeof federation.targetSystem === 'string' &&\n typeof federation.hopCount === 'number' &&\n typeof federation.originTimestamp === 'number'\n );\n}\n\n/**\n * Create an updated envelope with a new payload (for transformations).\n *\n * @param envelope - Original envelope\n * @param newPayload - New payload\n * @returns New envelope with same metadata but new payload\n */\nexport function withPayload<T, U>(\n envelope: FederationEnvelope<T>,\n newPayload: U\n): FederationEnvelope<U> {\n return {\n payload: newPayload,\n federation: envelope.federation,\n };\n}\n","/**\n * Federation Outage Buffer\n *\n * Buffers outbound messages during federation outages for later delivery\n * when the peer reconnects.\n */\n\nimport type {\n FederationEnvelope,\n FederationBufferConfig,\n Message,\n Timestamp,\n} from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * A buffered message with metadata.\n */\ninterface BufferedMessage {\n envelope: FederationEnvelope<Message>;\n enqueuedAt: Timestamp;\n size: number;\n}\n\n/**\n * Per-peer buffer state.\n */\ninterface PeerBuffer {\n messages: BufferedMessage[];\n totalEnqueued: number;\n totalDropped: number;\n totalBytes: number;\n}\n\n/**\n * Buffer statistics for a peer.\n */\nexport interface PeerBufferStats {\n /** Number of messages currently buffered */\n count: number;\n /** Age of oldest message in milliseconds */\n oldestAge: number;\n /** Total messages ever enqueued */\n totalEnqueued: number;\n /** Total messages dropped due to overflow/expiry */\n totalDropped: number;\n /** Current buffer size in bytes */\n totalBytes: number;\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nconst DEFAULT_CONFIG: Required<FederationBufferConfig> = {\n enabled: true,\n maxMessages: 1000,\n maxBytes: 10 * 1024 * 1024, // 10MB\n retentionMs: 60 * 60 * 1000, // 1 hour\n overflowStrategy: 'drop-oldest',\n};\n\n// =============================================================================\n// Buffer Implementation\n// =============================================================================\n\n/**\n * Buffer for storing outbound messages during federation outages.\n *\n * Messages are stored per-peer and drained on reconnection.\n * Supports configurable size limits, retention, and overflow strategies.\n *\n * @example\n * ```typescript\n * const buffer = new FederationOutageBuffer({\n * maxMessages: 500,\n * retentionMs: 30000,\n * overflowStrategy: 'drop-oldest',\n * });\n *\n * // Buffer messages during outage\n * buffer.enqueue('peer-1', envelope);\n *\n * // On reconnect, drain and send\n * const messages = buffer.drain('peer-1');\n * for (const msg of messages) {\n * await send(msg);\n * }\n * ```\n */\nexport class FederationOutageBuffer {\n readonly #config: Required<FederationBufferConfig>;\n readonly #buffers: Map<string, PeerBuffer> = new Map();\n\n constructor(config?: FederationBufferConfig) {\n this.#config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Whether buffering is enabled.\n */\n get enabled(): boolean {\n return this.#config.enabled;\n }\n\n /**\n * Get the configuration.\n */\n get config(): Readonly<Required<FederationBufferConfig>> {\n return this.#config;\n }\n\n /**\n * Enqueue a message for a peer.\n *\n * @param peerId - Target peer system ID\n * @param envelope - Message envelope to buffer\n * @returns true if message was buffered, false if rejected\n */\n enqueue(peerId: string, envelope: FederationEnvelope<Message>): boolean {\n if (!this.#config.enabled) return false;\n\n let buffer = this.#buffers.get(peerId);\n if (!buffer) {\n buffer = { messages: [], totalEnqueued: 0, totalDropped: 0, totalBytes: 0 };\n this.#buffers.set(peerId, buffer);\n }\n\n // Evict expired messages first\n this.#evictExpired(buffer);\n\n // Estimate message size\n const messageSize = this.#estimateSize(envelope);\n\n // Check byte limit\n while (buffer.totalBytes + messageSize > this.#config.maxBytes && buffer.messages.length > 0) {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n }\n\n // Check message count limit\n if (buffer.messages.length >= this.#config.maxMessages) {\n switch (this.#config.overflowStrategy) {\n case 'drop-oldest': {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n break;\n }\n case 'drop-newest':\n buffer.totalDropped++;\n return false;\n case 'reject':\n return false;\n }\n }\n\n buffer.messages.push({\n envelope,\n enqueuedAt: Date.now(),\n size: messageSize,\n });\n buffer.totalEnqueued++;\n buffer.totalBytes += messageSize;\n\n return true;\n }\n\n /**\n * Drain all buffered messages for a peer.\n *\n * Returns messages in FIFO order and clears the buffer.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes\n */\n drain(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired before draining\n this.#evictExpired(buffer);\n\n const messages = buffer.messages.map((m) => m.envelope);\n buffer.messages = [];\n buffer.totalBytes = 0;\n\n return messages;\n }\n\n /**\n * Peek at buffered messages without removing them.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes (still in buffer)\n */\n peek(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired\n this.#evictExpired(buffer);\n\n return buffer.messages.map((m) => m.envelope);\n }\n\n /**\n * Get statistics for all peer buffers.\n *\n * @returns Map of peer ID to buffer stats\n */\n stats(): Map<string, PeerBufferStats> {\n const result = new Map<string, PeerBufferStats>();\n const now = Date.now();\n\n for (const [peerId, buffer] of this.#buffers) {\n // Evict expired for accurate stats\n this.#evictExpired(buffer);\n\n const oldestAge =\n buffer.messages.length > 0 ? now - buffer.messages[0].enqueuedAt : 0;\n\n result.set(peerId, {\n count: buffer.messages.length,\n oldestAge,\n totalEnqueued: buffer.totalEnqueued,\n totalDropped: buffer.totalDropped,\n totalBytes: buffer.totalBytes,\n });\n }\n\n return result;\n }\n\n /**\n * Get count for a specific peer.\n *\n * @param peerId - Target peer system ID\n * @returns Number of buffered messages\n */\n count(peerId: string): number {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return 0;\n\n this.#evictExpired(buffer);\n return buffer.messages.length;\n }\n\n /**\n * Check if buffer has messages for a peer.\n *\n * @param peerId - Target peer system ID\n * @returns true if there are buffered messages\n */\n has(peerId: string): boolean {\n return this.count(peerId) > 0;\n }\n\n /**\n * Clear buffer for a specific peer.\n *\n * @param peerId - Target peer system ID\n */\n clear(peerId: string): void {\n this.#buffers.delete(peerId);\n }\n\n /**\n * Clear all buffers.\n */\n clearAll(): void {\n this.#buffers.clear();\n }\n\n /**\n * Get list of peers with buffered messages.\n *\n * @returns Array of peer IDs\n */\n peers(): string[] {\n const result: string[] = [];\n for (const [peerId, buffer] of this.#buffers) {\n this.#evictExpired(buffer);\n if (buffer.messages.length > 0) {\n result.push(peerId);\n }\n }\n return result;\n }\n\n /**\n * Evict expired messages from a buffer.\n */\n #evictExpired(buffer: PeerBuffer): void {\n const cutoff = Date.now() - this.#config.retentionMs;\n let removed = 0;\n let bytesRemoved = 0;\n\n while (buffer.messages.length > 0 && buffer.messages[0].enqueuedAt < cutoff) {\n const msg = buffer.messages.shift()!;\n bytesRemoved += msg.size;\n removed++;\n }\n\n buffer.totalDropped += removed;\n buffer.totalBytes -= bytesRemoved;\n }\n\n /**\n * Estimate the size of an envelope in bytes.\n */\n #estimateSize(envelope: FederationEnvelope<Message>): number {\n // Simple estimation using JSON serialization\n try {\n return JSON.stringify(envelope).length * 2; // UTF-16\n } catch {\n return 1024; // Default estimate if serialization fails\n }\n }\n}\n","/**\n * Gateway connection for MAP protocol federation\n *\n * Used by gateways to connect two MAP systems together,\n * routing messages between them.\n */\n\nimport type { Stream } from '../stream';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport {\n CORE_METHODS,\n FEDERATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type Message,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type FederationConnectRequestParams,\n type FederationConnectResponseResult,\n type FederationRouteRequestParams,\n type FederationRouteResponseResult,\n type FederationRoutingConfig,\n type FederationBufferConfig,\n type FederationEnvelope,\n type ReplayRequestParams,\n type ReplayResponseResult,\n type EventType,\n} from '../types';\nimport { createFederationEnvelope } from '../federation/envelope';\nimport { FederationOutageBuffer } from '../federation/buffer';\n\n/**\n * Options for automatic gateway reconnection\n */\nexport interface GatewayReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n}\n\n/**\n * Options for event replay on gateway reconnection\n */\nexport interface GatewayReplayOptions {\n /** Enable replay on reconnection (default: false) */\n enabled: boolean;\n /** Event types to replay (default: all) */\n eventTypes?: EventType[];\n /** Maximum events to replay per peer (default: 1000) */\n maxEvents?: number;\n /** Maximum age of events to replay in ms (default: 1 hour) */\n maxAgeMs?: number;\n}\n\n/**\n * Reconnection event types for gateway\n */\nexport type GatewayReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed'\n | 'bufferOverflow'\n | 'bufferDrained'\n | 'replayStarted'\n | 'replayCompleted';\n\n/**\n * Handler for gateway reconnection events\n */\nexport type GatewayReconnectionEventHandler = (event: {\n type: GatewayReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n peerId?: string;\n messagesBuffered?: number;\n messagesDrained?: number;\n eventsReplayed?: number;\n}) => void;\n\n/**\n * Options for gateway connection\n */\nexport interface GatewayConnectionOptions extends BaseConnectionOptions {\n /** Gateway name */\n name?: string;\n /** Gateway capabilities */\n capabilities?: ParticipantCapabilities;\n /** Federation routing configuration */\n routing?: FederationRoutingConfig;\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: GatewayReconnectionOptions;\n /** Outage buffer configuration */\n buffer?: FederationBufferConfig;\n /** Replay options for reconnection */\n replay?: GatewayReplayOptions;\n}\n\n/**\n * Gateway connection for MAP federation.\n *\n * Provides methods for:\n * - Connecting to peer MAP systems\n * - Routing messages between systems\n * - Automatic reconnection with message buffering\n */\nexport class GatewayConnection {\n #connection: BaseConnection;\n readonly #options: GatewayConnectionOptions;\n readonly #connectedSystems: Map<string, { name?: string; version?: string }> = new Map();\n readonly #reconnectionHandlers: Set<GatewayReconnectionEventHandler> = new Set();\n readonly #outageBuffer: FederationOutageBuffer | null;\n readonly #lastSyncTimestamps: Map<string, number> = new Map();\n\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #connected = false;\n #isReconnecting = false;\n #lastConnectOptions?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n\n constructor(stream: Stream, options: GatewayConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Initialize outage buffer if configured\n this.#outageBuffer = options.buffer?.enabled\n ? new FederationOutageBuffer(options.buffer)\n : null;\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the local MAP system\n */\n async connect(options?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n }): Promise<ConnectResponseResult> {\n const params: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'gateway',\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n auth: options?.auth,\n };\n\n const result = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, params);\n\n this.#sessionId = result.sessionId;\n this.#serverCapabilities = result.capabilities;\n this.#connected = true;\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n return result;\n }\n\n /**\n * Disconnect from the local MAP system\n */\n async disconnect(reason?: string): Promise<void> {\n if (!this.#connected) return;\n\n try {\n await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n } finally {\n await this.#connection.close();\n this.#connected = false;\n }\n }\n\n /**\n * Whether the gateway is connected to the local system\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * List of connected remote systems\n */\n get connectedSystems(): Map<string, { name?: string; version?: string }> {\n return new Map(this.#connectedSystems);\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Federation\n // ===========================================================================\n\n /**\n * Connect to a remote MAP system\n */\n async connectToSystem(\n systemId: string,\n endpoint: string,\n auth?: { method: 'bearer' | 'api-key' | 'mtls'; credentials?: string }\n ): Promise<FederationConnectResponseResult> {\n const params: FederationConnectRequestParams = {\n systemId,\n endpoint,\n auth,\n };\n\n const result = await this.#connection.sendRequest<\n FederationConnectRequestParams,\n FederationConnectResponseResult\n >(FEDERATION_METHODS.FEDERATION_CONNECT, params);\n\n if (result.connected && result.systemInfo) {\n this.#connectedSystems.set(systemId, {\n name: result.systemInfo.name,\n version: result.systemInfo.version,\n });\n }\n\n return result;\n }\n\n /**\n * Route a message to a remote system.\n *\n * If routing config is provided, wraps the message in a federation envelope\n * with proper metadata for multi-hop routing. Otherwise, sends raw message\n * for backwards compatibility.\n *\n * During reconnection, messages are buffered if buffer is configured.\n */\n async routeToSystem(\n systemId: string,\n message: Message\n ): Promise<FederationRouteResponseResult> {\n // Create envelope if routing config available\n let envelope: FederationEnvelope<Message> | undefined;\n if (this.#options.routing) {\n envelope = createFederationEnvelope(\n message,\n this.#options.routing.systemId,\n systemId,\n {\n maxHops: this.#options.routing.maxHops,\n trackPath: this.#options.routing.trackPath,\n }\n );\n }\n\n // If reconnecting and buffer is available, buffer the message\n if (this.#isReconnecting && this.#outageBuffer && envelope) {\n const buffered = this.#outageBuffer.enqueue(systemId, envelope);\n if (!buffered) {\n this.#emitReconnectionEvent({\n type: 'bufferOverflow',\n peerId: systemId,\n messagesBuffered: this.#outageBuffer.count(systemId),\n });\n }\n // Return a \"pending\" response - message will be sent on reconnect\n return { routed: false };\n }\n\n const params: FederationRouteRequestParams = { systemId };\n if (envelope) {\n params.envelope = envelope;\n } else {\n // Legacy: send raw message for backwards compatibility\n params.message = message;\n }\n\n const result = await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n\n // Update sync timestamp on successful route\n if (result.routed) {\n this.#lastSyncTimestamps.set(systemId, Date.now());\n }\n\n return result;\n }\n\n /**\n * Check if a remote system is connected\n */\n isSystemConnected(systemId: string): boolean {\n return this.#connectedSystems.has(systemId);\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Get the outage buffer (for advanced use)\n */\n get outageBuffer(): FederationOutageBuffer | null {\n return this.#outageBuffer;\n }\n\n /**\n * Get last sync timestamp for a peer\n */\n getLastSyncTimestamp(peerId: string): number | undefined {\n return this.#lastSyncTimestamps.get(peerId);\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n */\n onReconnection(handler: GatewayReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<GatewayReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Gateway reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-authenticate\n const connectResult = await this.connect(this.#lastConnectOptions);\n\n // Update stored values\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Drain buffered messages immediately on reconnect\n await this.#drainBufferedMessages();\n\n // Replay missed events from peers\n await this.#replayFromPeers();\n }\n\n /**\n * Drain buffered messages after reconnection\n */\n async #drainBufferedMessages(): Promise<void> {\n if (!this.#outageBuffer) return;\n\n const peers = this.#outageBuffer.peers();\n for (const peerId of peers) {\n const messages = this.#outageBuffer.drain(peerId);\n if (messages.length === 0) continue;\n\n // Send each buffered message\n for (const envelope of messages) {\n try {\n const params: FederationRouteRequestParams = {\n systemId: peerId,\n envelope,\n };\n\n await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n } catch (error) {\n // Log but continue draining - we don't want to lose other messages\n console.warn('MAP: Failed to send buffered message to', peerId, error);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'bufferDrained',\n peerId,\n messagesDrained: messages.length,\n });\n }\n }\n\n /**\n * Replay missed events from peers after reconnection\n */\n async #replayFromPeers(): Promise<void> {\n const replayOptions = this.#options.replay;\n if (!replayOptions?.enabled) return;\n\n // Get peers that have sync timestamps (peers we've communicated with)\n const peersToReplay = Array.from(this.#lastSyncTimestamps.entries());\n if (peersToReplay.length === 0) return;\n\n for (const [peerId, lastSync] of peersToReplay) {\n try {\n await this.#replayFromPeer(peerId, lastSync);\n } catch (error) {\n // Log but continue with other peers\n console.warn('MAP: Failed to replay events from peer', peerId, error);\n }\n }\n }\n\n /**\n * Replay missed events from a single peer\n */\n async #replayFromPeer(peerId: string, lastSyncTimestamp: number): Promise<void> {\n const replayOptions = this.#options.replay!;\n\n // Check max age\n const maxAge = replayOptions.maxAgeMs ?? 60 * 60 * 1000; // 1 hour default\n const cutoff = Date.now() - maxAge;\n if (lastSyncTimestamp < cutoff) {\n // Too old, skip replay for this peer\n return;\n }\n\n this.#emitReconnectionEvent({ type: 'replayStarted', peerId });\n\n let totalReplayed = 0;\n const maxEvents = replayOptions.maxEvents ?? 1000;\n let afterEventId: string | undefined;\n let hasMore = true;\n\n // Paginate through replay results\n while (hasMore && totalReplayed < maxEvents) {\n const params: ReplayRequestParams = {\n limit: Math.min(100, maxEvents - totalReplayed),\n };\n\n // Use eventId for pagination, or timestamp for first request\n if (afterEventId) {\n params.afterEventId = afterEventId;\n } else {\n params.fromTimestamp = lastSyncTimestamp;\n }\n\n // Filter by event types if specified\n if (replayOptions.eventTypes) {\n params.filter = { eventTypes: replayOptions.eventTypes };\n }\n\n const result = await this.#connection.sendRequest<\n ReplayRequestParams,\n ReplayResponseResult\n >(CORE_METHODS.REPLAY, params);\n\n totalReplayed += result.events.length;\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: break if no events returned\n if (result.events.length === 0) {\n break;\n }\n\n // Update sync timestamp to latest replayed event\n const lastEvent = result.events.at(-1);\n if (lastEvent) {\n this.#lastSyncTimestamps.set(peerId, lastEvent.timestamp);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'replayCompleted',\n peerId,\n eventsReplayed: totalReplayed,\n });\n }\n}\n","/**\n * Zod validators for MAP protocol types\n *\n * These validators provide runtime validation for protocol messages.\n * They are generated based on the JSON schema but hand-tuned for proper Zod compatibility.\n */\n\nimport { z } from 'zod';\n\n// ===========================================================================\n// Primitives\n// ===========================================================================\n\nexport const JsonRpcVersionSchema = z.literal('2.0');\nexport const RequestIdSchema = z.union([z.string(), z.number().int()]);\nexport const ProtocolVersionSchema = z.literal(1);\nexport const TimestampSchema = z.number().int();\nexport const MetaSchema = z.record(z.unknown()).optional();\n\n// ===========================================================================\n// Identifiers\n// ===========================================================================\n\nexport const ParticipantIdSchema = z.string();\nexport const AgentIdSchema = z.string();\nexport const ScopeIdSchema = z.string();\nexport const SessionIdSchema = z.string();\nexport const MessageIdSchema = z.string();\nexport const SubscriptionIdSchema = z.string();\nexport const CorrelationIdSchema = z.string();\n\n// ===========================================================================\n// Enums\n// ===========================================================================\n\nexport const ParticipantTypeSchema = z.enum(['agent', 'client', 'system', 'gateway']);\nexport const TransportTypeSchema = z.enum(['websocket', 'stdio', 'inprocess', 'http-sse']);\nexport const ErrorCategorySchema = z.enum([\n 'protocol',\n 'auth',\n 'routing',\n 'agent',\n 'resource',\n 'federation',\n 'internal',\n]);\n\nexport const AgentVisibilitySchema = z.enum(['public', 'parent-only', 'scope', 'system']);\n\n// Agent state: standard states + custom x-* states\nexport const AgentStateSchema = z.union([\n z.enum(['registered', 'idle', 'busy', 'waiting', 'stopping', 'stopped', 'error']),\n z.string().regex(/^x-/),\n]);\n\nexport const MessagePrioritySchema = z.enum(['low', 'normal', 'high', 'urgent']);\nexport const DeliverySemanticsSchema = z.enum(['at-most-once', 'at-least-once', 'exactly-once']);\nexport const MessageRelationshipSchema = z.enum([\n 'peer',\n 'parent-to-child',\n 'child-to-parent',\n 'supervisor-to-supervised',\n 'broadcast',\n]);\n\nexport const EventTypeSchema = z.enum([\n 'agent.registered',\n 'agent.unregistered',\n 'agent.state-changed',\n 'agent.spawned',\n 'scope.created',\n 'scope.deleted',\n 'scope.joined',\n 'scope.left',\n 'message.sent',\n 'message.delivered',\n 'session.started',\n 'session.ended',\n 'system.error',\n 'system.shutdown',\n]);\n\nexport const ScopeJoinPolicySchema = z.enum(['open', 'approval', 'invite']);\nexport const ScopeVisibilitySchema = z.enum(['public', 'private', 'unlisted']);\nexport const MessageVisibilitySchema = z.enum(['members', 'public']);\nexport const ScopeSendPolicySchema = z.enum(['anyone', 'members']);\n\n// ===========================================================================\n// Capabilities\n// ===========================================================================\n\nexport const ParticipantCapabilitiesSchema = z\n .object({\n observation: z\n .object({\n canObserve: z.boolean().optional(),\n canQuery: z.boolean().optional(),\n })\n .strict()\n .optional(),\n messaging: z\n .object({\n canSend: z.boolean().optional(),\n canReceive: z.boolean().optional(),\n canBroadcast: z.boolean().optional(),\n })\n .strict()\n .optional(),\n lifecycle: z\n .object({\n canSpawn: z.boolean().optional(),\n canRegister: z.boolean().optional(),\n canUnregister: z.boolean().optional(),\n canSteer: z.boolean().optional(),\n canStop: z.boolean().optional(),\n })\n .strict()\n .optional(),\n scopes: z\n .object({\n canCreateScopes: z.boolean().optional(),\n canManageScopes: z.boolean().optional(),\n })\n .strict()\n .optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Addresses\n// ===========================================================================\n\nexport const DirectAddressSchema = z.object({ agent: AgentIdSchema }).strict();\nexport const MultiAddressSchema = z.object({ agents: z.array(AgentIdSchema).min(1) }).strict();\nexport const ScopeAddressSchema = z.object({ scope: ScopeIdSchema }).strict();\nexport const RoleAddressSchema = z\n .object({\n role: z.string(),\n scope: ScopeIdSchema.optional(),\n })\n .strict();\nexport const HierarchicalAddressSchema = z\n .object({\n parent: z.literal(true).optional(),\n children: z.literal(true).optional(),\n siblings: z.literal(true).optional(),\n ancestors: z.literal(true).optional(),\n descendants: z.literal(true).optional(),\n })\n .strict();\nexport const BroadcastAddressSchema = z.object({ broadcast: z.literal(true) }).strict();\nexport const SystemAddressSchema = z.object({ system: z.literal(true) }).strict();\nexport const ParticipantAddressSchema = z\n .object({ participant: ParticipantIdSchema })\n .strict();\nexport const FederatedAddressSchema = z\n .object({\n system: z.string(),\n address: z.lazy(() => AddressSchema),\n })\n .strict();\n\nexport const AddressSchema: z.ZodType<unknown> = z.union([\n DirectAddressSchema,\n MultiAddressSchema,\n ScopeAddressSchema,\n RoleAddressSchema,\n HierarchicalAddressSchema,\n BroadcastAddressSchema,\n SystemAddressSchema,\n ParticipantAddressSchema,\n FederatedAddressSchema,\n]);\n\n// ===========================================================================\n// Core Structures\n// ===========================================================================\n\nexport const AgentRelationshipSchema = z\n .object({\n type: z.enum(['peer', 'supervisor', 'supervised', 'collaborator']),\n agentId: AgentIdSchema,\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentLifecycleSchema = z\n .object({\n createdAt: TimestampSchema.optional(),\n startedAt: TimestampSchema.optional(),\n stoppedAt: TimestampSchema.optional(),\n lastActiveAt: TimestampSchema.optional(),\n exitCode: z.number().int().optional(),\n exitReason: z.string().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentSchema = z\n .object({\n id: AgentIdSchema,\n name: z.string().optional(),\n description: z.string().optional(),\n parent: AgentIdSchema.optional(),\n relationships: z.array(AgentRelationshipSchema).optional(),\n state: AgentStateSchema,\n role: z.string().optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n visibility: AgentVisibilitySchema.optional(),\n lifecycle: AgentLifecycleSchema.optional(),\n capabilities: ParticipantCapabilitiesSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const ScopeSchema = z\n .object({\n id: ScopeIdSchema,\n name: z.string().optional(),\n parent: ScopeIdSchema.optional(),\n children: z.array(ScopeIdSchema).optional(),\n joinPolicy: ScopeJoinPolicySchema.optional(),\n visibility: ScopeVisibilitySchema.optional(),\n messageVisibility: MessageVisibilitySchema.optional(),\n sendPolicy: ScopeSendPolicySchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageMetaSchema = z\n .object({\n correlationId: CorrelationIdSchema.optional(),\n causationId: MessageIdSchema.optional(),\n traceId: z.string().optional(),\n spanId: z.string().optional(),\n priority: MessagePrioritySchema.optional(),\n delivery: DeliverySemanticsSchema.optional(),\n relationship: MessageRelationshipSchema.optional(),\n expiresAt: TimestampSchema.optional(),\n isResult: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageSchema = z\n .object({\n id: MessageIdSchema,\n from: ParticipantIdSchema,\n to: AddressSchema,\n timestamp: TimestampSchema,\n payload: z.unknown().optional(),\n meta: MessageMetaSchema.optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const EventSchema = z\n .object({\n type: EventTypeSchema,\n timestamp: TimestampSchema,\n data: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const SubscriptionFilterSchema = z\n .object({\n eventTypes: z.array(EventTypeSchema).optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n fromAgents: z.array(AgentIdSchema).optional(),\n includeChildren: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Error\n// ===========================================================================\n\nexport const MAPErrorDataSchema = z\n .object({\n category: ErrorCategorySchema.optional(),\n retryable: z.boolean().optional(),\n retryAfterMs: z.number().int().optional(),\n details: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .passthrough();\n\nexport const MAPErrorSchema = z\n .object({\n code: z.number().int(),\n message: z.string(),\n data: MAPErrorDataSchema.optional(),\n })\n .strict();\n\n// ===========================================================================\n// JSON-RPC Messages\n// ===========================================================================\n\nexport const MAPRequestSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const MAPResponseSuccessSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n result: z.unknown(),\n })\n .strict();\n\nexport const MAPResponseErrorSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n error: MAPErrorSchema,\n })\n .strict();\n\nexport const MAPResponseSchema = z.union([MAPResponseSuccessSchema, MAPResponseErrorSchema]);\n\nexport const MAPNotificationSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\n// ===========================================================================\n// Inferred Types (for convenience)\n// ===========================================================================\n\nexport type ParticipantIdValidated = z.infer<typeof ParticipantIdSchema>;\nexport type AgentIdValidated = z.infer<typeof AgentIdSchema>;\nexport type ScopeIdValidated = z.infer<typeof ScopeIdSchema>;\nexport type SessionIdValidated = z.infer<typeof SessionIdSchema>;\nexport type MessageIdValidated = z.infer<typeof MessageIdSchema>;\nexport type ParticipantTypeValidated = z.infer<typeof ParticipantTypeSchema>;\nexport type AgentStateValidated = z.infer<typeof AgentStateSchema>;\nexport type AgentValidated = z.infer<typeof AgentSchema>;\nexport type ScopeValidated = z.infer<typeof ScopeSchema>;\nexport type MessageValidated = z.infer<typeof MessageSchema>;\nexport type EventValidated = z.infer<typeof EventSchema>;\nexport type AddressValidated = z.infer<typeof AddressSchema>;\nexport type MAPRequestValidated = z.infer<typeof MAPRequestSchema>;\nexport type MAPResponseValidated = z.infer<typeof MAPResponseSchema>;\nexport type MAPNotificationValidated = z.infer<typeof MAPNotificationSchema>;\nexport type MAPErrorValidated = z.infer<typeof MAPErrorSchema>;\nexport type ParticipantCapabilitiesValidated = z.infer<typeof ParticipantCapabilitiesSchema>;\nexport type SubscriptionFilterValidated = z.infer<typeof SubscriptionFilterSchema>;\n","/**\n * Protocol utilities for MAP SDK\n *\n * Provides:\n * - METHOD_REGISTRY: Single source of truth for all methods with metadata\n * - Response builders: Type-safe response construction\n * - Helper functions for method capability checking\n */\n\nimport type {\n Agent,\n Scope,\n ParticipantCapabilities,\n ConnectResponseResult,\n DisconnectResponseResult,\n SendResponseResult,\n AgentsRegisterResponseResult,\n AgentsUnregisterResponseResult,\n AgentsListResponseResult,\n AgentsGetResponseResult,\n AgentsUpdateResponseResult,\n AgentsSpawnResponseResult,\n ScopesCreateResponseResult,\n ScopesListResponseResult,\n ScopesJoinResponseResult,\n ScopesLeaveResponseResult,\n SubscribeResponseResult,\n UnsubscribeResponseResult,\n SessionInfo,\n SubscriptionId,\n MessageId,\n ParticipantId,\n ProtocolVersion,\n SessionId,\n} from '../types';\n\n// =============================================================================\n// Method Registry\n// =============================================================================\n\n/** Method category for organization */\nexport type MethodCategory =\n | 'core'\n | 'observation'\n | 'lifecycle'\n | 'state'\n | 'steering'\n | 'scope'\n | 'session'\n | 'auth'\n | 'federation'\n | 'mail'\n | 'notification';\n\n/** Capability path like 'observation.canQuery' */\nexport type CapabilityPath = string;\n\n/** Method metadata */\nexport interface MethodInfo {\n /** The wire method name */\n method: string;\n /** Category for organization */\n category: MethodCategory;\n /** Required capabilities (empty = no special capabilities needed) */\n capabilities: CapabilityPath[];\n /** Human-readable description */\n description: string;\n}\n\n/**\n * Method Registry - Single source of truth for all MAP methods\n *\n * Use this instead of individual method constants for:\n * - Capability checking\n * - Method validation\n * - Documentation generation\n */\nexport const METHOD_REGISTRY: Record<string, MethodInfo> = {\n // Core methods\n 'connect': {\n method: 'map/connect',\n category: 'core',\n capabilities: [],\n description: 'Establish connection to MAP system',\n },\n 'disconnect': {\n method: 'map/disconnect',\n category: 'core',\n capabilities: [],\n description: 'Disconnect from MAP system',\n },\n 'send': {\n method: 'map/send',\n category: 'core',\n capabilities: ['messaging.canSend'],\n description: 'Send a message to an address',\n },\n 'subscribe': {\n method: 'map/subscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Subscribe to event stream',\n },\n 'unsubscribe': {\n method: 'map/unsubscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Unsubscribe from event stream',\n },\n 'replay': {\n method: 'map/replay',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Replay historical events with filtering and pagination',\n },\n\n // Observation methods\n 'agents/list': {\n method: 'map/agents/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List agents with optional filters',\n },\n 'agents/get': {\n method: 'map/agents/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent by ID with optional hierarchy',\n },\n 'scopes/list': {\n method: 'map/scopes/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List all scopes',\n },\n 'scopes/get': {\n method: 'map/scopes/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get scope by ID',\n },\n 'scopes/members': {\n method: 'map/scopes/members',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List scope members',\n },\n 'structure/graph': {\n method: 'map/structure/graph',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent hierarchy graph',\n },\n\n // Lifecycle methods\n 'agents/register': {\n method: 'map/agents/register',\n category: 'lifecycle',\n capabilities: ['lifecycle.canRegister'],\n description: 'Register a new agent',\n },\n 'agents/unregister': {\n method: 'map/agents/unregister',\n category: 'lifecycle',\n capabilities: ['lifecycle.canUnregister'],\n description: 'Unregister an agent',\n },\n 'agents/spawn': {\n method: 'map/agents/spawn',\n category: 'lifecycle',\n capabilities: ['lifecycle.canSpawn'],\n description: 'Spawn a child agent',\n },\n\n // State methods\n 'agents/update': {\n method: 'map/agents/update',\n category: 'state',\n capabilities: ['lifecycle.canRegister'],\n description: 'Update agent state or metadata',\n },\n 'agents/suspend': {\n method: 'map/agents/suspend',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Suspend an agent',\n },\n 'agents/resume': {\n method: 'map/agents/resume',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Resume a suspended agent',\n },\n 'agents/stop': {\n method: 'map/agents/stop',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Stop an agent',\n },\n\n // Steering methods\n 'inject': {\n method: 'map/inject',\n category: 'steering',\n capabilities: ['lifecycle.canSteer'],\n description: 'Inject context into an agent',\n },\n\n // Scope methods\n 'scopes/create': {\n method: 'map/scopes/create',\n category: 'scope',\n capabilities: ['scopes.canCreateScopes'],\n description: 'Create a new scope',\n },\n 'scopes/delete': {\n method: 'map/scopes/delete',\n category: 'scope',\n capabilities: ['scopes.canManageScopes'],\n description: 'Delete a scope',\n },\n 'scopes/join': {\n method: 'map/scopes/join',\n category: 'scope',\n capabilities: [],\n description: 'Join a scope',\n },\n 'scopes/leave': {\n method: 'map/scopes/leave',\n category: 'scope',\n capabilities: [],\n description: 'Leave a scope',\n },\n\n // Session methods\n 'session/list': {\n method: 'map/session/list',\n category: 'session',\n capabilities: [],\n description: 'List sessions',\n },\n 'session/load': {\n method: 'map/session/load',\n category: 'session',\n capabilities: [],\n description: 'Load a session',\n },\n 'session/close': {\n method: 'map/session/close',\n category: 'session',\n capabilities: [],\n description: 'Close a session',\n },\n\n // Auth methods\n 'auth/refresh': {\n method: 'map/auth/refresh',\n category: 'auth',\n capabilities: [],\n description: 'Refresh authentication token',\n },\n\n // Federation methods\n 'federation/connect': {\n method: 'map/federation/connect',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Connect to federated system',\n },\n 'federation/route': {\n method: 'map/federation/route',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Route message to federated system',\n },\n\n // Mail methods\n 'mail/create': {\n method: 'mail/create',\n category: 'mail',\n capabilities: ['mail.canCreate'],\n description: 'Create a new conversation',\n },\n 'mail/get': {\n method: 'mail/get',\n category: 'mail',\n capabilities: ['mail.canJoin'],\n description: 'Get conversation details',\n },\n 'mail/list': {\n method: 'mail/list',\n category: 'mail',\n capabilities: ['mail.canJoin'],\n description: 'List conversations',\n },\n 'mail/close': {\n method: 'mail/close',\n category: 'mail',\n capabilities: ['mail.canCreate'],\n description: 'Close a conversation',\n },\n 'mail/join': {\n method: 'mail/join',\n category: 'mail',\n capabilities: ['mail.canJoin'],\n description: 'Join an existing conversation',\n },\n 'mail/leave': {\n method: 'mail/leave',\n category: 'mail',\n capabilities: ['mail.canJoin'],\n description: 'Leave a conversation',\n },\n 'mail/invite': {\n method: 'mail/invite',\n category: 'mail',\n capabilities: ['mail.canInvite'],\n description: 'Invite a participant to a conversation',\n },\n 'mail/turn': {\n method: 'mail/turn',\n category: 'mail',\n capabilities: ['mail.canJoin'],\n description: 'Record a turn in a conversation',\n },\n 'mail/turns/list': {\n method: 'mail/turns/list',\n category: 'mail',\n capabilities: ['mail.canViewHistory'],\n description: 'List turns in a conversation',\n },\n 'mail/thread/create': {\n method: 'mail/thread/create',\n category: 'mail',\n capabilities: ['mail.canCreateThreads'],\n description: 'Create a thread within a conversation',\n },\n 'mail/thread/list': {\n method: 'mail/thread/list',\n category: 'mail',\n capabilities: ['mail.canJoin'],\n description: 'List threads in a conversation',\n },\n 'mail/summary': {\n method: 'mail/summary',\n category: 'mail',\n capabilities: ['mail.canViewHistory'],\n description: 'Get or generate a conversation summary',\n },\n 'mail/replay': {\n method: 'mail/replay',\n category: 'mail',\n capabilities: ['mail.canViewHistory'],\n description: 'Replay turns from a specific point',\n },\n\n // Notification methods (client → server)\n 'subscription/ack': {\n method: 'map/subscribe.ack',\n category: 'notification',\n capabilities: [],\n description: 'Acknowledge received events for backpressure flow control',\n },\n} as const;\n\n/**\n * Get methods by category\n */\nexport function getMethodsByCategory(category: MethodCategory): MethodInfo[] {\n return Object.values(METHOD_REGISTRY).filter((m) => m.category === category);\n}\n\n/**\n * Get required capabilities for a method\n */\nexport function getRequiredCapabilities(methodName: string): CapabilityPath[] {\n // Try direct lookup first\n const info = METHOD_REGISTRY[methodName];\n if (info) return info.capabilities;\n\n // Try finding by wire method name\n const byWire = Object.values(METHOD_REGISTRY).find((m) => m.method === methodName);\n return byWire?.capabilities ?? [];\n}\n\n/**\n * Check if capabilities satisfy method requirements\n */\nexport function hasRequiredCapabilities(\n methodName: string,\n capabilities: ParticipantCapabilities\n): boolean {\n const required = getRequiredCapabilities(methodName);\n if (required.length === 0) return true;\n\n for (const path of required) {\n const [category, capability] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n if (!categoryCapabilities?.[capability]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get method info by wire method name (e.g., 'map/agents/list')\n */\nexport function getMethodInfo(wireMethod: string): MethodInfo | undefined {\n return Object.values(METHOD_REGISTRY).find((m) => m.method === wireMethod);\n}\n\n// =============================================================================\n// Response Builders\n// =============================================================================\n\n/**\n * Build connect response\n */\nexport function buildConnectResponse(params: {\n protocolVersion: ProtocolVersion;\n sessionId: SessionId;\n participantId: ParticipantId;\n capabilities: ParticipantCapabilities;\n systemInfo?: { name?: string; version?: string };\n reconnected?: boolean;\n reclaimedAgents?: Agent[];\n ownedAgents?: string[];\n}): ConnectResponseResult {\n return {\n protocolVersion: params.protocolVersion,\n sessionId: params.sessionId,\n participantId: params.participantId,\n capabilities: params.capabilities,\n systemInfo: params.systemInfo,\n reconnected: params.reconnected,\n reclaimedAgents: params.reclaimedAgents,\n ownedAgents: params.ownedAgents,\n };\n}\n\n/**\n * Build disconnect response\n */\nexport function buildDisconnectResponse(session: SessionInfo): DisconnectResponseResult {\n return { session };\n}\n\n/**\n * Build send response\n */\nexport function buildSendResponse(\n messageId: MessageId,\n delivered: ParticipantId[]\n): SendResponseResult {\n return { messageId, delivered };\n}\n\n/**\n * Build agents/register response\n */\nexport function buildAgentsRegisterResponse(agent: Agent): AgentsRegisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/unregister response\n */\nexport function buildAgentsUnregisterResponse(agent: Agent): AgentsUnregisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/list response\n */\nexport function buildAgentsListResponse(agents: Agent[]): AgentsListResponseResult {\n return { agents };\n}\n\n/**\n * Build agents/get response\n */\nexport function buildAgentsGetResponse(\n agent: Agent,\n children?: Agent[],\n descendants?: Agent[]\n): AgentsGetResponseResult {\n const result: AgentsGetResponseResult = { agent };\n if (children) result.children = children;\n if (descendants) result.descendants = descendants;\n return result;\n}\n\n/**\n * Build agents/update response\n */\nexport function buildAgentsUpdateResponse(agent: Agent): AgentsUpdateResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/spawn response\n */\nexport function buildAgentsSpawnResponse(agent: Agent): AgentsSpawnResponseResult {\n return { agent };\n}\n\n/**\n * Build scopes/create response\n */\nexport function buildScopesCreateResponse(scope: Scope): ScopesCreateResponseResult {\n return { scope };\n}\n\n/**\n * Build scopes/list response\n */\nexport function buildScopesListResponse(scopes: Scope[]): ScopesListResponseResult {\n return { scopes };\n}\n\n/**\n * Build scopes/join response\n */\nexport function buildScopesJoinResponse(scope: Scope, agent: Agent): ScopesJoinResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build scopes/leave response\n */\nexport function buildScopesLeaveResponse(scope: Scope, agent: Agent): ScopesLeaveResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build subscribe response\n */\nexport function buildSubscribeResponse(subscriptionId: SubscriptionId): SubscribeResponseResult {\n return { subscriptionId };\n}\n\n/**\n * Build unsubscribe response\n */\nexport function buildUnsubscribeResponse(\n subscriptionId: SubscriptionId,\n closedAt: number = Date.now()\n): UnsubscribeResponseResult {\n return {\n subscription: {\n id: subscriptionId,\n closedAt,\n },\n };\n}\n","/**\n * Permission utilities for MAP SDK\n *\n * Provides building blocks for implementing the 4-layer permission model:\n * - Layer 1: System configuration (what's exposed at all)\n * - Layer 2: Client permissions (what can this client do)\n * - Layer 3: Scope permissions (what's allowed in this scope)\n * - Layer 4: Agent permissions (what can this agent do)\n *\n * These utilities are opt-in building blocks for router implementations.\n * They provide the logic for permission checks but don't enforce them.\n */\n\nimport type {\n Agent,\n AgentId,\n AgentPermissions,\n AgentPermissionConfig,\n AgentVisibilityRule,\n AgentVisibility,\n AgentAcceptanceRule,\n ClientAcceptanceRule,\n SystemAcceptanceRule,\n Scope,\n ScopeId,\n Event,\n EventType,\n ParticipantCapabilities,\n ParticipantId,\n ParticipantType,\n} from '../types';\nimport { getRequiredCapabilities, hasRequiredCapabilities } from '../protocol';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * System-level exposure configuration.\n * Controls what entities are visible to participants at all.\n */\nexport interface SystemExposure {\n agents?: {\n /** Whether agents are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for agents that are always public */\n publicAgents?: string[];\n /** Glob patterns for agents that are always hidden (takes precedence) */\n hiddenAgents?: string[];\n };\n events?: {\n /** Event types that are exposed (whitelist, if provided) */\n exposedTypes?: EventType[];\n /** Event types that are always hidden (blacklist) */\n hiddenTypes?: EventType[];\n };\n scopes?: {\n /** Whether scopes are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for scopes that are always public */\n publicScopes?: string[];\n /** Glob patterns for scopes that are always hidden (takes precedence) */\n hiddenScopes?: string[];\n };\n}\n\n/**\n * Full system configuration for permissions\n */\nexport interface PermissionSystemConfig {\n /** What entities are exposed to participants */\n exposure?: SystemExposure;\n /** Resource limits */\n limits?: {\n maxConnections?: number;\n maxConnectionsPerClient?: number;\n maxSubscriptionsPerConnection?: number;\n maxAgentsPerClient?: number;\n };\n}\n\n/**\n * Represents a connected participant for permission checks\n */\nexport interface PermissionParticipant {\n /** Participant ID */\n id: string;\n /** Participant type */\n type: ParticipantType;\n /** Granted capabilities */\n capabilities: ParticipantCapabilities;\n}\n\n/**\n * Context for permission checks\n */\nexport interface PermissionContext {\n /** System-wide configuration */\n system: PermissionSystemConfig;\n /** The participant performing the action */\n participant: PermissionParticipant;\n /** Agent IDs owned by this participant */\n ownedAgentIds?: AgentId[];\n /** Scope membership: scopeId -> agent IDs that are members */\n scopeMembership?: Map<ScopeId, AgentId[]>;\n}\n\n/**\n * Action being performed for permission checking\n */\nexport interface PermissionAction {\n /** Action category */\n type: 'query' | 'message' | 'lifecycle' | 'scope' | 'subscribe';\n /** Wire method name (e.g., 'map/agents/list') */\n method: string;\n /** Target of the action */\n target?: {\n agentId?: AgentId;\n scopeId?: ScopeId;\n eventTypes?: EventType[];\n };\n}\n\n/**\n * Result of a permission check\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** Reason for denial (if denied) */\n reason?: string;\n /** Which layer denied the action (if denied) */\n layer?: 1 | 2 | 3 | 4;\n}\n\n// =============================================================================\n// Layer 1: System Exposure Checks\n// =============================================================================\n\n/**\n * Check if an agent is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n * If no configuration, agents are exposed by default.\n *\n * @param exposure - System exposure configuration\n * @param agentId - Agent ID to check\n * @returns true if the agent is exposed\n */\nexport function isAgentExposed(\n exposure: SystemExposure | undefined,\n agentId: AgentId\n): boolean {\n if (!exposure?.agents) return true; // Default: exposed\n\n const {\n publicByDefault = true,\n publicAgents = [],\n hiddenAgents = [],\n } = exposure.agents;\n\n // Hidden takes precedence\n if (matchesPatterns(agentId, hiddenAgents)) return false;\n\n // Check public list\n if (matchesPatterns(agentId, publicAgents)) return true;\n\n return publicByDefault;\n}\n\n/**\n * Check if an event type is exposed by system configuration.\n *\n * Hidden types take precedence. If a whitelist is provided,\n * only those types are exposed.\n *\n * @param exposure - System exposure configuration\n * @param eventType - Event type to check\n * @returns true if the event type is exposed\n */\nexport function isEventTypeExposed(\n exposure: SystemExposure | undefined,\n eventType: EventType\n): boolean {\n if (!exposure?.events) return true;\n\n const { exposedTypes, hiddenTypes = [] } = exposure.events;\n\n // Hidden takes precedence\n if (hiddenTypes.includes(eventType)) return false;\n\n // If whitelist exists, must be in it\n if (exposedTypes && !exposedTypes.includes(eventType)) return false;\n\n return true;\n}\n\n/**\n * Check if a scope is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n *\n * @param exposure - System exposure configuration\n * @param scopeId - Scope ID to check\n * @returns true if the scope is exposed\n */\nexport function isScopeExposed(\n exposure: SystemExposure | undefined,\n scopeId: ScopeId\n): boolean {\n if (!exposure?.scopes) return true;\n\n const {\n publicByDefault = true,\n publicScopes = [],\n hiddenScopes = [],\n } = exposure.scopes;\n\n // Hidden takes precedence\n if (matchesPatterns(scopeId, hiddenScopes)) return false;\n\n // Check public list\n if (matchesPatterns(scopeId, publicScopes)) return true;\n\n return publicByDefault;\n}\n\n// =============================================================================\n// Layer 2: Client/Participant Capability Checks\n// =============================================================================\n\n/**\n * Check if a participant has a specific capability.\n *\n * @param capabilities - Participant's capabilities\n * @param path - Capability path like 'observation.canQuery'\n * @returns true if the capability is granted\n *\n * @example\n * ```typescript\n * if (hasCapability(participant.capabilities, 'lifecycle.canSpawn')) {\n * // Can spawn agents\n * }\n * ```\n */\nexport function hasCapability(\n capabilities: ParticipantCapabilities,\n path: string\n): boolean {\n const [category, cap] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n return categoryCapabilities?.[cap] ?? false;\n}\n\n/**\n * Check if a participant can perform a method based on capabilities.\n *\n * @param method - Wire method name (e.g., 'map/agents/list')\n * @param capabilities - Participant's capabilities\n * @returns true if all required capabilities are present\n */\nexport function canPerformMethod(\n method: string,\n capabilities: ParticipantCapabilities\n): boolean {\n return hasRequiredCapabilities(method, capabilities);\n}\n\n/**\n * Get the capabilities required for a method.\n *\n * @param method - Wire method name or registry key\n * @returns Array of capability paths\n */\nexport { getRequiredCapabilities };\n\n// =============================================================================\n// Layer 3: Scope Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can see the scope\n */\nexport function canSeeScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n const visibility = scope.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can send to the scope\n */\nexport function canSendToScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n // System can always send\n if (participant.type === 'system') return true;\n\n const sendPolicy = scope.sendPolicy ?? 'members';\n\n switch (sendPolicy) {\n case 'any':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can join a scope.\n *\n * @param scope - The scope to check\n * @param participantType - Type of the participant\n * @param agentRole - Role of the agent trying to join (for role-based policies)\n * @returns true if the participant can join the scope\n */\nexport function canJoinScope(\n scope: Scope,\n participantType: ParticipantType,\n agentRole?: string\n): boolean {\n const joinPolicy = scope.joinPolicy ?? 'open';\n\n switch (joinPolicy) {\n case 'open':\n return true;\n case 'invite':\n // Would need invitation tracking - simplified to false\n return false;\n case 'role':\n // Check if agent role matches auto-join roles\n if (!agentRole || !scope.autoJoinRoles) return false;\n return scope.autoJoinRoles.includes(agentRole);\n case 'system':\n return participantType === 'system';\n default:\n return false;\n }\n}\n\n// =============================================================================\n// Layer 4: Agent Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see an agent.\n *\n * @param agent - The agent to check\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can see the agent\n */\nexport function canSeeAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n const visibility = agent.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'parent-only':\n // Can see if we own the parent or the agent itself\n if (ownedAgentIds.includes(agent.id)) return true;\n return agent.parent ? ownedAgentIds.includes(agent.parent) : false;\n case 'scope':\n // Would need scope membership check - simplified to true\n // In practice, would check if participant has agent in same scope\n return true;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to an agent.\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can message the agent\n */\nexport function canMessageAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // Must be able to see the agent first\n if (!canSeeAgent(agent, participant, ownedAgentIds)) {\n return false;\n }\n\n // Additional messaging restrictions could be added here\n // For now, if you can see it, you can message it\n return true;\n}\n\n/**\n * Check if a participant can control an agent (stop, suspend, etc.).\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can control the agent\n */\nexport function canControlAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // System can control any agent\n if (participant.type === 'system') return true;\n\n // Must own the agent or its ancestor\n if (ownedAgentIds.includes(agent.id)) return true;\n\n // Check if we own an ancestor (parent chain)\n // This would need the full agent registry in practice\n // Simplified: just check direct parent\n if (agent.parent && ownedAgentIds.includes(agent.parent)) return true;\n\n return false;\n}\n\n// =============================================================================\n// High-Level Resolution\n// =============================================================================\n\n/**\n * Check if an action is permitted across all 4 layers.\n *\n * This is the main entry point for comprehensive permission checking.\n * It evaluates each layer in order and returns the first denial or success.\n *\n * @param context - Permission context with system config and participant info\n * @param action - The action to check\n * @returns Permission result with allowed status, reason, and layer\n *\n * @example\n * ```typescript\n * const result = canPerformAction(\n * {\n * system: { exposure: { agents: { hiddenAgents: ['internal-*'] } } },\n * participant: { id: 'client-1', type: 'client', capabilities },\n * ownedAgentIds: ['agent-1'],\n * },\n * {\n * type: 'query',\n * method: 'map/agents/get',\n * target: { agentId: 'internal-worker' },\n * }\n * );\n *\n * if (!result.allowed) {\n * console.log(`Denied at layer ${result.layer}: ${result.reason}`);\n * }\n * ```\n */\nexport function canPerformAction(\n context: PermissionContext,\n action: PermissionAction\n): PermissionResult {\n // Layer 1: System exposure\n if (action.target?.agentId) {\n if (!isAgentExposed(context.system.exposure, action.target.agentId)) {\n return {\n allowed: false,\n reason: 'Agent not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.scopeId) {\n if (!isScopeExposed(context.system.exposure, action.target.scopeId)) {\n return {\n allowed: false,\n reason: 'Scope not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.eventTypes) {\n for (const eventType of action.target.eventTypes) {\n if (!isEventTypeExposed(context.system.exposure, eventType)) {\n return {\n allowed: false,\n reason: `Event type '${eventType}' not exposed by system configuration`,\n layer: 1,\n };\n }\n }\n }\n\n // Layer 2: Participant capabilities\n const requiredCaps = getRequiredCapabilities(action.method);\n for (const cap of requiredCaps) {\n if (!hasCapability(context.participant.capabilities, cap)) {\n return {\n allowed: false,\n reason: `Missing required capability: ${cap}`,\n layer: 2,\n };\n }\n }\n\n // Layer 3 and 4 would require actual entity lookups\n // These are handled by the filtering utilities below\n\n return { allowed: true };\n}\n\n// =============================================================================\n// Filtering Utilities\n// =============================================================================\n\n/**\n * Filter agents to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 4 (agent visibility).\n *\n * @param agents - Agents to filter\n * @param context - Permission context\n * @returns Filtered list of visible agents\n */\nexport function filterVisibleAgents(\n agents: Agent[],\n context: PermissionContext\n): Agent[] {\n const ownedAgentIds = context.ownedAgentIds ?? [];\n\n return agents.filter((agent) => {\n // Layer 1: System exposure\n if (!isAgentExposed(context.system.exposure, agent.id)) {\n return false;\n }\n\n // Layer 4: Agent visibility\n if (!canSeeAgent(agent, context.participant, ownedAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter scopes to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 3 (scope visibility).\n *\n * @param scopes - Scopes to filter\n * @param context - Permission context\n * @returns Filtered list of visible scopes\n */\nexport function filterVisibleScopes(\n scopes: Scope[],\n context: PermissionContext\n): Scope[] {\n const scopeMembership = context.scopeMembership ?? new Map();\n\n return scopes.filter((scope) => {\n // Layer 1: System exposure\n if (!isScopeExposed(context.system.exposure, scope.id)) {\n return false;\n }\n\n // Layer 3: Scope visibility\n const memberAgentIds = scopeMembership.get(scope.id) ?? [];\n if (!canSeeScope(scope, context.participant, memberAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter events to only those visible to the participant.\n *\n * Applies Layer 1 (system exposure) for event types.\n *\n * @param events - Events to filter\n * @param context - Permission context\n * @returns Filtered list of visible events\n */\nexport function filterVisibleEvents(\n events: Event[],\n context: PermissionContext\n): Event[] {\n return events.filter((event) => {\n // Layer 1: Event type exposure\n if (!isEventTypeExposed(context.system.exposure, event.type)) {\n return false;\n }\n\n // Additional filtering based on event source could be added here\n // e.g., filter out events from hidden agents\n\n return true;\n });\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Check if a value matches any of the glob patterns.\n *\n * @param value - Value to check\n * @param patterns - Glob patterns (supports * and ? wildcards)\n * @returns true if value matches any pattern\n */\nfunction matchesPatterns(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => matchGlob(value, pattern));\n}\n\n/**\n * Simple glob matching supporting * and ? wildcards.\n *\n * @param value - Value to match\n * @param pattern - Glob pattern\n * @returns true if value matches pattern\n */\nfunction matchGlob(value: string, pattern: string): boolean {\n // Escape special regex characters except * and ?\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(value);\n}\n\n// =============================================================================\n// Agent Permission Resolution (Hybrid Model)\n// =============================================================================\n\n/**\n * Deep clone an object (simple implementation for permission objects)\n */\nfunction deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Deep merge two permission objects.\n * Second object's fields override first at the leaf level.\n *\n * @param base - Base permissions\n * @param override - Override permissions (partial)\n * @returns Merged permissions\n */\nexport function deepMergePermissions(\n base: AgentPermissions,\n override: Partial<AgentPermissions>\n): AgentPermissions {\n const result: AgentPermissions = { ...base };\n\n if (override.canSee) {\n result.canSee = { ...base.canSee, ...override.canSee };\n }\n if (override.canMessage) {\n result.canMessage = { ...base.canMessage, ...override.canMessage };\n }\n if (override.acceptsFrom) {\n result.acceptsFrom = { ...base.acceptsFrom, ...override.acceptsFrom };\n }\n\n return result;\n}\n\n/**\n * Map legacy AgentVisibility to AgentVisibilityRule.\n *\n * @param visibility - Legacy visibility value\n * @returns Equivalent visibility rule\n */\nexport function mapVisibilityToRule(visibility: AgentVisibility): AgentVisibilityRule {\n switch (visibility) {\n case 'public':\n return 'all';\n case 'parent-only':\n return 'hierarchy';\n case 'scope':\n return 'scoped';\n case 'system':\n return 'direct';\n default:\n return 'all';\n }\n}\n\n/**\n * Default agent permission configuration.\n * Used when no configuration is provided.\n */\nexport const DEFAULT_AGENT_PERMISSION_CONFIG: AgentPermissionConfig = {\n defaultPermissions: {\n canSee: {\n agents: 'all',\n scopes: 'all',\n structure: 'full',\n },\n canMessage: {\n agents: 'all',\n scopes: 'all',\n },\n acceptsFrom: {\n agents: 'all',\n clients: 'all',\n systems: 'all',\n },\n },\n rolePermissions: {},\n};\n\n/**\n * Resolve effective permissions for an agent.\n *\n * Resolution order:\n * 1. Start with system default permissions\n * 2. If agent has a role, deep merge role permissions\n * 3. Deep merge agent's permissionOverrides\n * 4. (Backwards compat) Map legacy visibility field if no override\n *\n * @param agent - The agent to resolve permissions for\n * @param config - System permission configuration\n * @returns Resolved effective permissions\n *\n * @example\n * ```typescript\n * const config: AgentPermissionConfig = {\n * defaultPermissions: { canSee: { agents: 'all' } },\n * rolePermissions: {\n * worker: { canSee: { agents: 'hierarchy' } },\n * },\n * };\n *\n * const agent = { id: 'a1', role: 'worker', ownerId: 'c1', state: 'active' };\n * const perms = resolveAgentPermissions(agent, config);\n * // perms.canSee.agents === 'hierarchy'\n * ```\n */\nexport function resolveAgentPermissions(\n agent: Agent,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): AgentPermissions {\n // Start with defaults\n let permissions = deepClone(config.defaultPermissions);\n\n // Apply role permissions\n if (agent.role && config.rolePermissions[agent.role]) {\n permissions = deepMergePermissions(permissions, config.rolePermissions[agent.role]);\n }\n\n // Apply agent overrides\n if (agent.permissionOverrides) {\n permissions = deepMergePermissions(permissions, agent.permissionOverrides);\n }\n\n // Backwards compatibility: map legacy visibility\n if (agent.visibility && !agent.permissionOverrides?.canSee?.agents) {\n permissions.canSee = permissions.canSee ?? {};\n permissions.canSee.agents = mapVisibilityToRule(agent.visibility);\n }\n\n return permissions;\n}\n\n// =============================================================================\n// Agent Acceptance Checks\n// =============================================================================\n\n/**\n * Context for checking if an agent accepts messages from a sender.\n */\nexport interface AcceptanceContext {\n /** Type of the sender */\n senderType: ParticipantType;\n /** Participant ID of the sender */\n senderId: ParticipantId;\n /** If sender is an agent, its agent ID */\n senderAgentId?: AgentId;\n /** If sender is from a federated system, its system ID */\n senderSystemId?: string;\n\n // Hierarchy info for 'hierarchy' rules\n /** Whether sender is the parent of target */\n isParent?: boolean;\n /** Whether sender is a child of target */\n isChild?: boolean;\n /** Whether sender is an ancestor of target */\n isAncestor?: boolean;\n /** Whether sender is a descendant of target */\n isDescendant?: boolean;\n\n // Scope info for 'scoped' rules\n /** Scope IDs that both sender and target are members of */\n sharedScopes?: ScopeId[];\n}\n\n/**\n * Check if an agent acceptance rule allows the sender.\n */\nfunction checkAgentAcceptance(\n rule: AgentAcceptanceRule | undefined,\n context: AcceptanceContext\n): boolean {\n if (!rule || rule === 'all') return true;\n\n if (rule === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (rule === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof rule === 'object' && 'include' in rule) {\n return context.senderAgentId !== undefined && rule.include.includes(context.senderAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if a client acceptance rule allows the sender.\n */\nfunction checkClientAcceptance(\n rule: ClientAcceptanceRule | undefined,\n senderId: ParticipantId\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return rule.include.includes(senderId);\n }\n\n return false;\n}\n\n/**\n * Check if a system acceptance rule allows the sender.\n */\nfunction checkSystemAcceptance(\n rule: SystemAcceptanceRule | undefined,\n senderSystemId: string | undefined\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return senderSystemId !== undefined && rule.include.includes(senderSystemId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent accepts messages from the given sender.\n *\n * Uses the agent's resolved permissions to determine if the sender\n * is allowed based on sender type and acceptance rules.\n *\n * @param targetAgent - The agent that would receive the message\n * @param context - Information about the sender\n * @param config - System permission configuration\n * @returns true if the agent accepts messages from this sender\n *\n * @example\n * ```typescript\n * const accepts = canAgentAcceptMessage(\n * targetAgent,\n * {\n * senderType: 'agent',\n * senderId: 'client-1',\n * senderAgentId: 'agent-2',\n * isParent: true,\n * },\n * config\n * );\n * ```\n */\nexport function canAgentAcceptMessage(\n targetAgent: Agent,\n context: AcceptanceContext,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(targetAgent, config);\n const acceptsFrom = permissions.acceptsFrom;\n\n // No restrictions = accept all\n if (!acceptsFrom) return true;\n\n // Check based on sender type\n switch (context.senderType) {\n case 'agent':\n return checkAgentAcceptance(acceptsFrom.agents, context);\n case 'client':\n return checkClientAcceptance(acceptsFrom.clients, context.senderId);\n case 'system':\n case 'gateway':\n return checkSystemAcceptance(acceptsFrom.systems, context.senderSystemId);\n default:\n return false;\n }\n}\n\n/**\n * Check if an agent can see another agent based on permissions.\n *\n * @param viewerAgent - The agent trying to see\n * @param targetAgentId - ID of the agent being viewed\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if viewer can see target\n */\nexport function canAgentSeeAgent(\n viewerAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(viewerAgent, config);\n const canSee = permissions.canSee?.agents;\n\n if (!canSee || canSee === 'all') return true;\n\n if (canSee === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canSee === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (canSee === 'direct') {\n // Direct means explicit allowlist only\n return false;\n }\n\n if (typeof canSee === 'object' && 'include' in canSee) {\n return canSee.include.includes(targetAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent can message another agent based on permissions.\n *\n * @param senderAgent - The agent sending the message\n * @param targetAgentId - ID of the target agent\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if sender can message target\n */\nexport function canAgentMessageAgent(\n senderAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(senderAgent, config);\n const canMessage = permissions.canMessage?.agents;\n\n if (!canMessage || canMessage === 'all') return true;\n\n if (canMessage === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canMessage === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof canMessage === 'object' && 'include' in canMessage) {\n return canMessage.include.includes(targetAgentId);\n }\n\n return false;\n}\n","/**\n * Address utilities for recipient disambiguation\n *\n * Provides utilities for parsing and formatting message addresses\n * with type prefixes to distinguish between agent and scope recipients.\n *\n * Format: \"{type}:{id}\"\n * - agent:abc123 -> agent recipient\n * - scope:room-1 -> scope recipient\n */\n\n/** Valid address types */\nexport type AddressType = \"agent\" | \"scope\";\n\n/** Parsed address components */\nexport interface AddressComponents {\n type: AddressType;\n id: string;\n}\n\n/** The separator used in address format */\nconst SEPARATOR = \":\";\n\n/** Valid address types for validation */\nconst VALID_ADDRESS_TYPES: readonly AddressType[] = [\"agent\", \"scope\"];\n\n/**\n * Error thrown when an address format is invalid.\n */\nexport class InvalidAddressError extends Error {\n constructor(address: string, reason: string) {\n super(`Invalid address \"${address}\": ${reason}`);\n this.name = \"InvalidAddressError\";\n }\n}\n\n/**\n * Format an address with type prefix.\n *\n * @param type - The address type (agent or scope)\n * @param id - The entity ID\n * @returns Formatted address string\n * @throws InvalidAddressError if parameters are invalid\n *\n * @example\n * formatAddress(\"agent\", \"abc123\") // \"agent:abc123\"\n * formatAddress(\"scope\", \"room-1\") // \"scope:room-1\"\n */\nexport function formatAddress(type: AddressType, id: string): string {\n if (!id) {\n throw new InvalidAddressError(\"\", \"ID cannot be empty\");\n }\n\n if (id.includes(SEPARATOR)) {\n throw new InvalidAddressError(id, \"ID cannot contain colon separator\");\n }\n\n return `${type}${SEPARATOR}${id}`;\n}\n\n/**\n * Parse an address string into its components.\n *\n * @param address - The address string to parse\n * @returns Parsed address components\n * @throws InvalidAddressError if format is invalid\n *\n * @example\n * parseAddress(\"agent:abc123\") // { type: \"agent\", id: \"abc123\" }\n * parseAddress(\"scope:room-1\") // { type: \"scope\", id: \"room-1\" }\n */\nexport function parseAddress(address: string): AddressComponents {\n const separatorIndex = address.indexOf(SEPARATOR);\n\n if (separatorIndex === -1) {\n throw new InvalidAddressError(address, \"missing type prefix\");\n }\n\n const type = address.slice(0, separatorIndex);\n const id = address.slice(separatorIndex + 1);\n\n if (!VALID_ADDRESS_TYPES.includes(type as AddressType)) {\n throw new InvalidAddressError(address, `invalid type \"${type}\", must be agent or scope`);\n }\n\n if (!id) {\n throw new InvalidAddressError(address, \"ID cannot be empty\");\n }\n\n // Check for extra colons (could be a federated ID embedded)\n // Allow federated IDs in the id portion: agent:system-a:agent:abc123\n // This means the id would be \"system-a:agent:abc123\" which is fine\n\n return {\n type: type as AddressType,\n id,\n };\n}\n\n/**\n * Check if a string is a valid prefixed address.\n *\n * @param address - The string to check\n * @returns true if valid prefixed address format\n *\n * @example\n * isAddress(\"agent:abc123\") // true\n * isAddress(\"scope:room-1\") // true\n * isAddress(\"abc123\") // false (no prefix)\n * isAddress(\"invalid:abc\") // false (invalid type)\n */\nexport function isAddress(address: string): boolean {\n try {\n parseAddress(address);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for an agent.\n *\n * @param address - The address string to check\n * @returns true if address is for an agent\n */\nexport function isAgentAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"agent\";\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for a scope.\n *\n * @param address - The address string to check\n * @returns true if address is for a scope\n */\nexport function isScopeAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"scope\";\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the ID from an address, or return the original if not prefixed.\n *\n * Useful for backward compatibility when handling both prefixed and unprefixed addresses.\n *\n * @param address - The address string\n * @returns The extracted ID or the original string\n */\nexport function extractId(address: string): string {\n try {\n const parsed = parseAddress(address);\n return parsed.id;\n } catch {\n return address;\n }\n}\n\n/**\n * Extract the type from an address, or return undefined if not prefixed.\n *\n * @param address - The address string\n * @returns The address type or undefined\n */\nexport function extractType(address: string): AddressType | undefined {\n try {\n const parsed = parseAddress(address);\n return parsed.type;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Convenience function to create an agent address.\n *\n * @param agentId - The agent ID\n * @returns Formatted agent address\n */\nexport function toAgent(agentId: string): string {\n return formatAddress(\"agent\", agentId);\n}\n\n/**\n * Convenience function to create a scope address.\n *\n * @param scopeId - The scope ID\n * @returns Formatted scope address\n */\nexport function toScope(scopeId: string): string {\n return formatAddress(\"scope\", scopeId);\n}\n","/**\n * MAPMeshPeer - Decentralized P2P mesh peer\n *\n * Wraps agentic-mesh's MeshPeer to provide a unified interface for\n * decentralized MAP networks where each peer runs its own MapServer.\n *\n * @module\n */\n\nimport type {\n AgentId,\n ScopeId,\n AgentState,\n Agent,\n Scope,\n Address,\n Message,\n MessageMeta,\n SubscriptionFilter,\n} from '../types';\n\nimport type {\n MAPMeshPeerConfig,\n PeerEndpoint,\n CreateAgentConfig,\n CreateScopeConfig,\n LocalAgent,\n SendResult,\n GitSyncService,\n GitSyncClient,\n SyncOptions,\n SyncResult,\n PullOptions,\n PushOptions,\n CloneOptions,\n MeshEventSubscription,\n MAPMeshPeerEvents,\n} from './types';\n\n// Import agentic-mesh (peer dependency)\nimport { createMeshPeer as agenticMeshCreateMeshPeer } from 'agentic-mesh';\n\n/**\n * Internal MeshPeer type from agentic-mesh.\n * We use a minimal interface to avoid tight coupling.\n */\ninterface MeshPeerLike {\n readonly peerId: string;\n readonly peerName: string;\n readonly isRunning: boolean;\n readonly connectedPeers: string[];\n readonly git: GitTransportServiceLike | null;\n\n start(transport?: unknown): Promise<void>;\n stop(): Promise<void>;\n connectToPeer(endpoint: PeerEndpoint): Promise<unknown>;\n disconnectFromPeer(peerId: string, reason?: string): Promise<void>;\n createAgent(config: CreateAgentConfig): Promise<AgentConnectionLike>;\n getAgentConnection(agentId: AgentId): AgentConnectionLike | undefined;\n getLocalAgents(): Agent[];\n getAllAgents(): Agent[];\n createScope(config: CreateScopeConfig): Scope;\n getScope(scopeId: ScopeId): Scope | undefined;\n listScopes(): Scope[];\n send(from: AgentId, to: Address, payload: unknown, meta?: MessageMeta): Promise<SendResult>;\n subscribe(participantId: string, filter?: SubscriptionFilter): MeshEventSubscription;\n\n on<K extends keyof MAPMeshPeerEvents>(event: K, handler: MAPMeshPeerEvents[K]): void;\n off<K extends keyof MAPMeshPeerEvents>(event: K, handler: MAPMeshPeerEvents[K]): void;\n emit<K extends keyof MAPMeshPeerEvents>(event: K, ...args: Parameters<MAPMeshPeerEvents[K]>): boolean;\n}\n\n/**\n * Internal AgentConnection type from agentic-mesh.\n * Uses EventEmitter pattern for message handling.\n */\ninterface AgentConnectionLike {\n readonly agentId: AgentId;\n readonly name: string;\n readonly role?: string;\n readonly state: string;\n readonly isRegistered: boolean;\n\n register(): Promise<void>;\n unregister(reason?: string): Promise<void>;\n updateState(state: string): Promise<void>;\n updateMetadata(metadata: Record<string, unknown>): Promise<void>;\n send(to: Address, payload: unknown, meta?: MessageMeta): Promise<SendResult>;\n // EventEmitter methods for message handling\n on(event: 'message', handler: (message: unknown) => void): this;\n off(event: 'message', handler: (message: unknown) => void): this;\n}\n\n/**\n * Internal GitTransportService type from agentic-mesh.\n */\ninterface GitTransportServiceLike {\n readonly httpPort: number;\n start(): Promise<void>;\n stop(): Promise<void>;\n createSyncClient(repoPath: string): GitSyncClientLike;\n}\n\n/**\n * Internal GitSyncClient type from agentic-mesh.\n */\ninterface GitSyncClientLike {\n sync(peerId: string, options?: SyncOptions): Promise<SyncResult>;\n fetch(peerId: string, branch?: string): Promise<SyncResult>;\n pull(peerId: string, branch?: string, options?: PullOptions): Promise<SyncResult>;\n push(peerId: string, branch?: string, options?: PushOptions): Promise<SyncResult>;\n clone(peerId: string, destPath: string, options?: CloneOptions): Promise<SyncResult>;\n listRemoteRefs(peerId: string): Promise<Array<{ ref: string; sha: string }>>;\n}\n\n/**\n * Decentralized P2P mesh peer with MAP protocol support.\n *\n * Each MAPMeshPeer runs its own MapServer and can connect to other peers\n * for agent discovery, messaging, and git synchronization.\n *\n * @example\n * ```typescript\n * import { createNebulaTransport } from 'agentic-mesh';\n * import { MAPMeshPeer } from '@multi-agent-protocol/sdk';\n *\n * // Create transport\n * const transport = createNebulaTransport({\n * configPath: '/etc/nebula/config.yml',\n * });\n *\n * // Create mesh peer\n * const peer = await MAPMeshPeer.create({\n * peerId: 'worker-1',\n * peerName: 'Worker Node 1',\n * transport,\n * git: {\n * enabled: true,\n * repoPath: '/workspace/project',\n * },\n * peers: [\n * { peerId: 'coordinator', address: '10.0.0.1', port: 4242 },\n * ],\n * });\n *\n * // Start the peer\n * await peer.start();\n *\n * // Create a local agent\n * const agent = await peer.createAgent({\n * name: 'DataProcessor',\n * role: 'processor',\n * });\n *\n * // Connect to another peer\n * await peer.connectToPeer({ peerId: 'worker-2', address: '10.0.0.3' });\n *\n * // Sync code with connected peer\n * await peer.git?.sync('worker-2', { branch: 'main' });\n *\n * // Clean shutdown\n * await peer.stop();\n * ```\n */\nexport class MAPMeshPeer {\n readonly #meshPeer: MeshPeerLike;\n readonly #config: MAPMeshPeerConfig;\n readonly #gitService: GitSyncServiceImpl | null;\n\n private constructor(meshPeer: MeshPeerLike, config: MAPMeshPeerConfig) {\n this.#meshPeer = meshPeer;\n this.#config = config;\n this.#gitService = meshPeer.git\n ? new GitSyncServiceImpl(meshPeer.git, config.git?.repoPath ?? process.cwd())\n : null;\n }\n\n // ===========================================================================\n // Static Factory\n // ===========================================================================\n\n /**\n * Create a new MAPMeshPeer.\n *\n * Requires `agentic-mesh` to be installed as a peer dependency.\n *\n * @param config - Peer configuration\n * @returns Promise resolving to the created peer (not yet started)\n */\n static async create(config: MAPMeshPeerConfig): Promise<MAPMeshPeer> {\n const meshPeer = agenticMeshCreateMeshPeer({\n peerId: config.peerId,\n peerName: config.peerName,\n transport: config.transport as any,\n git: config.git as any,\n peers: config.peers as any,\n map: config.map,\n }) as unknown as MeshPeerLike;\n\n return new MAPMeshPeer(meshPeer, config);\n }\n\n // ===========================================================================\n // Properties\n // ===========================================================================\n\n /** Unique peer identifier */\n get peerId(): string {\n return this.#meshPeer.peerId;\n }\n\n /** Display name for this peer */\n get peerName(): string {\n return this.#meshPeer.peerName;\n }\n\n /** Whether the peer is currently running */\n get isRunning(): boolean {\n return this.#meshPeer.isRunning;\n }\n\n /** List of connected peer IDs */\n get connectedPeers(): string[] {\n return this.#meshPeer.connectedPeers;\n }\n\n /** Git sync service (null if git not enabled) */\n get git(): GitSyncService | null {\n return this.#gitService;\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Start the mesh peer.\n *\n * This starts the transport, MAP server, and git service (if enabled),\n * then connects to any initial peers specified in the config.\n */\n async start(): Promise<void> {\n await this.#meshPeer.start(this.#config.transport);\n }\n\n /**\n * Stop the mesh peer.\n *\n * This disconnects from all peers, unregisters all agents,\n * stops the git service, MAP server, and transport.\n */\n async stop(): Promise<void> {\n await this.#meshPeer.stop();\n }\n\n // ===========================================================================\n // Peer Connections\n // ===========================================================================\n\n /**\n * Connect to a remote peer.\n *\n * After connecting, agents on both peers will be discoverable\n * and messages can be routed between them.\n *\n * @param endpoint - Peer endpoint to connect to\n */\n async connectToPeer(endpoint: PeerEndpoint): Promise<void> {\n await this.#meshPeer.connectToPeer(endpoint);\n }\n\n /**\n * Disconnect from a peer.\n *\n * @param peerId - ID of peer to disconnect from\n * @param reason - Optional reason for disconnecting\n */\n async disconnectFromPeer(peerId: string, reason?: string): Promise<void> {\n await this.#meshPeer.disconnectFromPeer(peerId, reason);\n }\n\n /**\n * Check if connected to a specific peer.\n *\n * @param peerId - Peer ID to check\n * @returns true if connected\n */\n isConnectedTo(peerId: string): boolean {\n return this.connectedPeers.includes(peerId);\n }\n\n // ===========================================================================\n // Agent Management\n // ===========================================================================\n\n /**\n * Create and register a local agent on this peer's MapServer.\n *\n * @param config - Agent configuration\n * @returns The created agent\n */\n async createAgent(config: CreateAgentConfig): Promise<LocalAgent> {\n const agentConn = await this.#meshPeer.createAgent(config);\n return new LocalAgentImpl(agentConn);\n }\n\n /**\n * Get a local agent by ID.\n *\n * @param agentId - Agent ID to look up\n * @returns The agent, or undefined if not found\n */\n getAgent(agentId: AgentId): LocalAgent | undefined {\n const conn = this.#meshPeer.getAgentConnection(agentId);\n return conn ? new LocalAgentImpl(conn) : undefined;\n }\n\n /**\n * Get all local agents on this peer.\n */\n getLocalAgents(): Agent[] {\n return this.#meshPeer.getLocalAgents();\n }\n\n /**\n * Get all known agents (local and discovered from connected peers).\n */\n getAllAgents(): Agent[] {\n return this.#meshPeer.getAllAgents();\n }\n\n // ===========================================================================\n // Scope Management\n // ===========================================================================\n\n /**\n * Create a scope on this peer's MapServer.\n *\n * @param config - Scope configuration\n * @returns The created scope\n */\n createScope(config: CreateScopeConfig): Scope {\n return this.#meshPeer.createScope(config);\n }\n\n /**\n * Get a scope by ID.\n *\n * @param scopeId - Scope ID to look up\n * @returns The scope, or undefined if not found\n */\n getScope(scopeId: ScopeId): Scope | undefined {\n return this.#meshPeer.getScope(scopeId);\n }\n\n /**\n * List all scopes on this peer.\n */\n listScopes(): Scope[] {\n return this.#meshPeer.listScopes();\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send a message from an agent to an address.\n *\n * Messages are routed to local agents or forwarded to connected peers.\n *\n * @param from - Sending agent ID\n * @param to - Destination address\n * @param payload - Message payload\n * @param meta - Optional message metadata\n * @returns Send result with delivery status\n */\n async send(\n from: AgentId,\n to: Address,\n payload: unknown,\n meta?: MessageMeta\n ): Promise<SendResult> {\n return this.#meshPeer.send(from, to, payload, meta);\n }\n\n // ===========================================================================\n // Events\n // ===========================================================================\n\n /**\n * Subscribe to events from this peer's MapServer.\n *\n * @param filter - Optional filter for event types\n * @returns Event subscription\n */\n subscribe(filter?: SubscriptionFilter): MeshEventSubscription {\n // Use the peer ID as participant for subscriptions\n return this.#meshPeer.subscribe(this.peerId, filter);\n }\n\n /**\n * Register a handler for peer connection events.\n *\n * @param handler - Function called when a peer connects\n * @returns Unsubscribe function\n */\n onPeerConnected(handler: (peerId: string, endpoint: PeerEndpoint) => void): () => void {\n this.#meshPeer.on('peer:connected', handler);\n return () => this.#meshPeer.off('peer:connected', handler);\n }\n\n /**\n * Register a handler for peer disconnection events.\n *\n * @param handler - Function called when a peer disconnects\n * @returns Unsubscribe function\n */\n onPeerDisconnected(handler: (peerId: string, reason?: string) => void): () => void {\n this.#meshPeer.on('peer:disconnected', handler);\n return () => this.#meshPeer.off('peer:disconnected', handler);\n }\n\n /**\n * Register a handler for agent registration events.\n *\n * @param handler - Function called when an agent registers\n * @returns Unsubscribe function\n */\n onAgentRegistered(handler: (agent: Agent) => void): () => void {\n this.#meshPeer.on('agent:registered', handler);\n return () => this.#meshPeer.off('agent:registered', handler);\n }\n\n /**\n * Register a handler for agent unregistration events.\n *\n * @param handler - Function called when an agent unregisters\n * @returns Unsubscribe function\n */\n onAgentUnregistered(handler: (agent: Agent) => void): () => void {\n this.#meshPeer.on('agent:unregistered', handler);\n return () => this.#meshPeer.off('agent:unregistered', handler);\n }\n\n /**\n * Register a handler for error events.\n *\n * @param handler - Function called when an error occurs\n * @returns Unsubscribe function\n */\n onError(handler: (error: Error) => void): () => void {\n this.#meshPeer.on('error', handler);\n return () => this.#meshPeer.off('error', handler);\n }\n}\n\n// =============================================================================\n// Internal Implementations\n// =============================================================================\n\n/**\n * Implementation of LocalAgent wrapping AgentConnection.\n */\nclass LocalAgentImpl implements LocalAgent {\n readonly #conn: AgentConnectionLike;\n\n constructor(conn: AgentConnectionLike) {\n this.#conn = conn;\n }\n\n get agentId(): AgentId {\n return this.#conn.agentId;\n }\n\n get name(): string {\n return this.#conn.name;\n }\n\n get role(): string | undefined {\n return this.#conn.role;\n }\n\n get state(): AgentState {\n return this.#conn.state as AgentState;\n }\n\n async busy(): Promise<void> {\n await this.#conn.updateState('busy');\n }\n\n async idle(): Promise<void> {\n await this.#conn.updateState('idle');\n }\n\n async updateState(state: AgentState): Promise<void> {\n await this.#conn.updateState(state);\n }\n\n async updateMetadata(metadata: Record<string, unknown>): Promise<void> {\n await this.#conn.updateMetadata(metadata);\n }\n\n async send(to: Address, payload: unknown, meta?: MessageMeta): Promise<SendResult> {\n return this.#conn.send(to, payload, meta);\n }\n\n onMessage(handler: (message: Message) => void | Promise<void>): () => void {\n const wrappedHandler = (message: unknown) => handler(message as Message);\n this.#conn.on('message', wrappedHandler);\n return () => {\n this.#conn.off('message', wrappedHandler);\n };\n }\n\n async unregister(reason?: string): Promise<void> {\n await this.#conn.unregister(reason);\n }\n}\n\n/**\n * Implementation of GitSyncService wrapping GitTransportService.\n */\nclass GitSyncServiceImpl implements GitSyncService {\n readonly #service: GitTransportServiceLike;\n readonly #defaultRepoPath: string;\n #defaultClient: GitSyncClientLike | null = null;\n\n constructor(service: GitTransportServiceLike, defaultRepoPath: string) {\n this.#service = service;\n this.#defaultRepoPath = defaultRepoPath;\n }\n\n get isRunning(): boolean {\n return true; // Service is managed by MeshPeer lifecycle\n }\n\n get httpPort(): number {\n return this.#service.httpPort;\n }\n\n createSyncClient(repoPath: string): GitSyncClient {\n return this.#service.createSyncClient(repoPath);\n }\n\n #getDefaultClient(): GitSyncClientLike {\n if (!this.#defaultClient) {\n this.#defaultClient = this.#service.createSyncClient(this.#defaultRepoPath);\n }\n return this.#defaultClient;\n }\n\n async sync(peerId: string, options?: SyncOptions): Promise<SyncResult> {\n return this.#getDefaultClient().sync(peerId, options);\n }\n\n async pull(peerId: string, branch?: string, options?: PullOptions): Promise<SyncResult> {\n return this.#getDefaultClient().pull(peerId, branch, options);\n }\n\n async push(peerId: string, branch?: string, options?: PushOptions): Promise<SyncResult> {\n return this.#getDefaultClient().push(peerId, branch, options);\n }\n\n async clone(peerId: string, destPath: string, options?: CloneOptions): Promise<SyncResult> {\n return this.#getDefaultClient().clone(peerId, destPath, options);\n }\n}\n","/**\n * ACPAgentAdapter - Agent-side helper for ACP-over-MAP.\n *\n * Simplifies implementing ACP-compatible agents by handling the\n * MAP↔ACP translation layer automatically.\n *\n * @module\n */\n\nimport type { AgentConnection } from \"../connection/agent\";\nimport type { Message, ParticipantId } from \"../types\";\nimport {\n type ACPSessionId,\n type ACPRequestId,\n type ACPEnvelope,\n type ACPAgentContext,\n type ACPAgentHandler,\n type ACPInitializeRequest,\n type ACPAuthenticateRequest,\n type ACPNewSessionRequest,\n type ACPLoadSessionRequest,\n type ACPSetSessionModeRequest,\n type ACPPromptRequest,\n type ACPCancelNotification,\n type ACPSessionNotification,\n type ACPRequestPermissionRequest,\n type ACPRequestPermissionResponse,\n type ACPReadTextFileRequest,\n type ACPReadTextFileResponse,\n type ACPWriteTextFileRequest,\n type ACPWriteTextFileResponse,\n type ACPCreateTerminalRequest,\n type ACPCreateTerminalResponse,\n type ACPTerminalOutputRequest,\n type ACPTerminalOutputResponse,\n type ACPReleaseTerminalRequest,\n type ACPReleaseTerminalResponse,\n type ACPWaitForTerminalExitRequest,\n type ACPWaitForTerminalExitResponse,\n type ACPKillTerminalCommandRequest,\n type ACPKillTerminalCommandResponse,\n ACPError,\n ACP_METHODS,\n isACPEnvelope,\n} from \"./types\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Pending client request state for agent→client correlation.\n */\ninterface PendingClientRequest {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n method: string;\n}\n\n/**\n * Stream context tracked per client stream.\n */\ninterface StreamContext {\n clientParticipantId: ParticipantId;\n sessionId: ACPSessionId | null;\n}\n\n// =============================================================================\n// ACPAgentAdapter\n// =============================================================================\n\n/**\n * Adapter for implementing ACP-compatible agents.\n *\n * Handles the ACP envelope protocol, request routing, and provides\n * helper methods for agent→client communication.\n *\n * @example\n * ```typescript\n * const mapAgent = await AgentConnection.connect('ws://localhost:8080', {\n * name: 'CodingAgent',\n * capabilities: { protocols: ['acp'], acp: { version: '2024-10-07' } }\n * });\n *\n * const adapter = new ACPAgentAdapter(mapAgent, {\n * initialize: async (params, ctx) => ({\n * protocolVersion: 20241007,\n * agentInfo: { name: 'CodingAgent', version: '1.0.0' },\n * agentCapabilities: { loadSession: true }\n * }),\n * newSession: async (params, ctx) => ({\n * sessionId: generateId()\n * }),\n * prompt: async (params, ctx) => {\n * await adapter.sendSessionUpdate(ctx.streamId, {\n * sessionId: params.sessionId,\n * update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: 'Hello!' } }\n * });\n * return { stopReason: 'end_turn' };\n * },\n * cancel: async (params, ctx) => {}\n * });\n * ```\n */\nexport class ACPAgentAdapter {\n readonly #mapAgent: AgentConnection;\n readonly #handler: ACPAgentHandler;\n readonly #streamContexts: Map<string, StreamContext> = new Map();\n readonly #pendingClientRequests: Map<string, PendingClientRequest> = new Map();\n readonly #clientRequestTimeout: number;\n\n /**\n * Create a new ACP agent adapter.\n *\n * @param mapAgent - The underlying MAP agent connection\n * @param handler - Handler implementing ACP agent methods\n * @param options - Optional configuration\n */\n constructor(\n mapAgent: AgentConnection,\n handler: ACPAgentHandler,\n options?: { clientRequestTimeout?: number }\n ) {\n this.#mapAgent = mapAgent;\n this.#handler = handler;\n this.#clientRequestTimeout = options?.clientRequestTimeout ?? 30000;\n\n // Register message handler\n // IMPORTANT: We use queueMicrotask to avoid deadlock for client requests.\n // The message handler is called from within the BaseConnection's notification\n // handler, which awaits it. If we process client requests synchronously and\n // need to send a response, we'd await a send that waits for a response from\n // the server. But the read loop can't process that response because it's\n // blocked awaiting us. By using queueMicrotask, we return immediately,\n // allowing the read loop to continue processing responses.\n //\n // However, we track stream context synchronously so that hasStream() works\n // immediately after a message is received.\n mapAgent.onMessage((message) => {\n // Check if this is an ACP message\n if (!message.payload || !isACPEnvelope(message.payload)) {\n return;\n }\n\n const envelope = message.payload as ACPEnvelope;\n const { acp, acpContext } = envelope;\n\n // Responses to pending client requests can be handled synchronously\n // since they don't involve sending anything\n if (acp.id !== undefined && !acp.method) {\n void this.#handleMessage(message);\n return;\n }\n\n // For client requests, track stream context synchronously\n if (acp.method) {\n this.#trackStreamContext(acpContext, message.from);\n }\n\n // Then defer the actual request processing to avoid deadlock\n queueMicrotask(() => void this.#handleMessage(message));\n });\n }\n\n /**\n * Track stream context for a client request.\n * This is called synchronously so that hasStream() works immediately.\n */\n #trackStreamContext(\n acpCtx: ACPEnvelope[\"acpContext\"],\n clientParticipantId: ParticipantId\n ): void {\n if (!this.#streamContexts.has(acpCtx.streamId)) {\n this.#streamContexts.set(acpCtx.streamId, {\n clientParticipantId,\n sessionId: acpCtx.sessionId,\n });\n } else if (acpCtx.sessionId) {\n const streamCtx = this.#streamContexts.get(acpCtx.streamId)!;\n streamCtx.sessionId = acpCtx.sessionId;\n }\n }\n\n // ===========================================================================\n // Message Handling\n // ===========================================================================\n\n /**\n * Handle incoming messages from MAP.\n */\n async #handleMessage(message: Message): Promise<void> {\n // Check if this is an ACP message\n if (!message.payload || !isACPEnvelope(message.payload)) {\n return;\n }\n\n const envelope = message.payload as ACPEnvelope;\n const { acp, acpContext } = envelope;\n\n // Handle response to a pending client request\n if (acp.id !== undefined && !acp.method) {\n const requestId = String(acp.id);\n const pending = this.#pendingClientRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.#pendingClientRequests.delete(requestId);\n\n if (acp.error) {\n pending.reject(ACPError.fromResponse(acp.error));\n } else {\n pending.resolve(acp.result);\n }\n }\n return;\n }\n\n // Handle client→agent request or notification\n if (acp.method) {\n await this.#handleClientRequest(\n acp.id,\n acp.method,\n acp.params,\n acpContext,\n message\n );\n }\n }\n\n /**\n * Handle a client→agent request.\n */\n async #handleClientRequest(\n requestId: ACPRequestId | undefined,\n method: string,\n params: unknown,\n acpCtx: ACPEnvelope[\"acpContext\"],\n originalMessage: Message\n ): Promise<void> {\n // Build the handler context\n const ctx: ACPAgentContext = {\n streamId: acpCtx.streamId,\n sessionId: acpCtx.sessionId,\n clientParticipantId: originalMessage.from,\n };\n\n // Note: Stream context is now tracked synchronously in the message handler\n // callback via #trackStreamContext, so we don't duplicate it here.\n\n let result: unknown;\n let error: ACPError | undefined;\n\n try {\n switch (method) {\n case ACP_METHODS.INITIALIZE:\n result = await this.#handler.initialize(\n params as ACPInitializeRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.AUTHENTICATE:\n if (!this.#handler.authenticate) {\n throw new ACPError(-32601, \"Method not implemented: authenticate\");\n }\n result = await this.#handler.authenticate(\n params as ACPAuthenticateRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.SESSION_NEW:\n result = await this.#handler.newSession(\n params as ACPNewSessionRequest,\n ctx\n );\n // Update stream context with new session ID\n const newSessionResult = result as { sessionId: ACPSessionId };\n const streamContext = this.#streamContexts.get(acpCtx.streamId);\n if (streamContext) {\n streamContext.sessionId = newSessionResult.sessionId;\n }\n break;\n\n case ACP_METHODS.SESSION_LOAD:\n if (!this.#handler.loadSession) {\n throw new ACPError(-32601, \"Method not implemented: session/load\");\n }\n result = await this.#handler.loadSession(\n params as ACPLoadSessionRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.SESSION_SET_MODE:\n if (!this.#handler.setSessionMode) {\n throw new ACPError(-32601, \"Method not implemented: session/set_mode\");\n }\n result = await this.#handler.setSessionMode(\n params as ACPSetSessionModeRequest,\n ctx\n );\n break;\n\n case ACP_METHODS.SESSION_PROMPT:\n result = await this.#handler.prompt(params as ACPPromptRequest, ctx);\n break;\n\n case ACP_METHODS.SESSION_CANCEL:\n await this.#handler.cancel(params as ACPCancelNotification, ctx);\n // Notifications don't have responses\n return;\n\n default:\n throw new ACPError(-32601, `Unknown method: ${method}`);\n }\n } catch (e) {\n if (e instanceof ACPError) {\n error = e;\n } else {\n error = new ACPError(-32603, (e as Error).message);\n }\n }\n\n // Send response (only for requests, not notifications)\n // IMPORTANT: We must NOT await this send operation because we're inside\n // a notification handler. Awaiting would cause a deadlock: the notification\n // handler awaits the send, which awaits a response from the server, but the\n // read loop can't process the response because it's blocked awaiting the\n // notification handler.\n if (requestId !== undefined) {\n const responseEnvelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: requestId,\n ...(error ? { error: error.toErrorObject() } : { result }),\n },\n acpContext: {\n streamId: acpCtx.streamId,\n sessionId: this.#streamContexts.get(acpCtx.streamId)?.sessionId ?? null,\n direction: \"agent-to-client\",\n },\n };\n\n // Fire-and-forget with error logging\n this.#mapAgent\n .send(\n { participant: originalMessage.from },\n responseEnvelope,\n {\n protocol: \"acp\",\n correlationId: originalMessage.id,\n }\n )\n .catch((err) => {\n console.error(\"ACP: Failed to send response:\", err);\n });\n }\n }\n\n // ===========================================================================\n // Agent→Client Communication\n // ===========================================================================\n\n /**\n * Send a session update notification to the client.\n */\n async sendSessionUpdate(\n streamId: string,\n notification: ACPSessionNotification\n ): Promise<void> {\n const streamCtx = this.#streamContexts.get(streamId);\n if (!streamCtx) {\n throw new Error(`Unknown stream: ${streamId}`);\n }\n\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n method: ACP_METHODS.SESSION_UPDATE,\n params: notification,\n },\n acpContext: {\n streamId,\n sessionId: streamCtx.sessionId,\n direction: \"agent-to-client\",\n },\n };\n\n await this.#mapAgent.send(\n { participant: streamCtx.clientParticipantId },\n envelope,\n { protocol: \"acp\" }\n );\n }\n\n /**\n * Send an agent→client request and wait for response.\n */\n async #sendClientRequest<TParams, TResult>(\n streamId: string,\n method: string,\n params: TParams\n ): Promise<TResult> {\n const streamCtx = this.#streamContexts.get(streamId);\n if (!streamCtx) {\n throw new Error(`Unknown stream: ${streamId}`);\n }\n\n const correlationId = `agent-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n const envelope: ACPEnvelope = {\n acp: {\n jsonrpc: \"2.0\",\n id: correlationId,\n method,\n params: params as unknown,\n },\n acpContext: {\n streamId,\n sessionId: streamCtx.sessionId,\n direction: \"agent-to-client\",\n pendingClientRequest: {\n requestId: correlationId,\n method,\n timeout: this.#clientRequestTimeout,\n },\n },\n };\n\n await this.#mapAgent.send(\n { participant: streamCtx.clientParticipantId },\n envelope,\n { protocol: \"acp\", correlationId }\n );\n\n return new Promise<TResult>((resolve, reject) => {\n const timeoutHandle = setTimeout(() => {\n this.#pendingClientRequests.delete(correlationId);\n reject(new Error(`Client request timed out: ${method}`));\n }, this.#clientRequestTimeout);\n\n this.#pendingClientRequests.set(correlationId, {\n resolve: resolve as (result: unknown) => void,\n reject,\n timeout: timeoutHandle,\n method,\n });\n });\n }\n\n /**\n * Request permission from the client.\n */\n async requestPermission(\n streamId: string,\n request: ACPRequestPermissionRequest\n ): Promise<ACPRequestPermissionResponse> {\n return this.#sendClientRequest<\n ACPRequestPermissionRequest,\n ACPRequestPermissionResponse\n >(streamId, ACP_METHODS.REQUEST_PERMISSION, request);\n }\n\n /**\n * Read a text file from the client.\n */\n async readTextFile(\n streamId: string,\n request: ACPReadTextFileRequest\n ): Promise<ACPReadTextFileResponse> {\n return this.#sendClientRequest<\n ACPReadTextFileRequest,\n ACPReadTextFileResponse\n >(streamId, ACP_METHODS.FS_READ_TEXT_FILE, request);\n }\n\n /**\n * Write a text file on the client.\n */\n async writeTextFile(\n streamId: string,\n request: ACPWriteTextFileRequest\n ): Promise<ACPWriteTextFileResponse> {\n return this.#sendClientRequest<\n ACPWriteTextFileRequest,\n ACPWriteTextFileResponse\n >(streamId, ACP_METHODS.FS_WRITE_TEXT_FILE, request);\n }\n\n /**\n * Create a terminal on the client.\n */\n async createTerminal(\n streamId: string,\n request: ACPCreateTerminalRequest\n ): Promise<ACPCreateTerminalResponse> {\n return this.#sendClientRequest<\n ACPCreateTerminalRequest,\n ACPCreateTerminalResponse\n >(streamId, ACP_METHODS.TERMINAL_CREATE, request);\n }\n\n /**\n * Get terminal output from the client.\n */\n async terminalOutput(\n streamId: string,\n request: ACPTerminalOutputRequest\n ): Promise<ACPTerminalOutputResponse> {\n return this.#sendClientRequest<\n ACPTerminalOutputRequest,\n ACPTerminalOutputResponse\n >(streamId, ACP_METHODS.TERMINAL_OUTPUT, request);\n }\n\n /**\n * Release a terminal on the client.\n */\n async releaseTerminal(\n streamId: string,\n request: ACPReleaseTerminalRequest\n ): Promise<ACPReleaseTerminalResponse> {\n return this.#sendClientRequest<\n ACPReleaseTerminalRequest,\n ACPReleaseTerminalResponse\n >(streamId, ACP_METHODS.TERMINAL_RELEASE, request);\n }\n\n /**\n * Wait for a terminal to exit on the client.\n */\n async waitForTerminalExit(\n streamId: string,\n request: ACPWaitForTerminalExitRequest\n ): Promise<ACPWaitForTerminalExitResponse> {\n return this.#sendClientRequest<\n ACPWaitForTerminalExitRequest,\n ACPWaitForTerminalExitResponse\n >(streamId, ACP_METHODS.TERMINAL_WAIT_FOR_EXIT, request);\n }\n\n /**\n * Kill a terminal command on the client.\n */\n async killTerminal(\n streamId: string,\n request: ACPKillTerminalCommandRequest\n ): Promise<ACPKillTerminalCommandResponse> {\n return this.#sendClientRequest<\n ACPKillTerminalCommandRequest,\n ACPKillTerminalCommandResponse\n >(streamId, ACP_METHODS.TERMINAL_KILL, request);\n }\n\n // ===========================================================================\n // Utility Methods\n // ===========================================================================\n\n /**\n * Get the current session ID for a stream.\n */\n getSessionId(streamId: string): ACPSessionId | null {\n return this.#streamContexts.get(streamId)?.sessionId ?? null;\n }\n\n /**\n * Get the client participant ID for a stream.\n */\n getClientParticipantId(streamId: string): ParticipantId | undefined {\n return this.#streamContexts.get(streamId)?.clientParticipantId;\n }\n\n /**\n * Check if a stream is active.\n */\n hasStream(streamId: string): boolean {\n return this.#streamContexts.has(streamId);\n }\n\n /**\n * Remove a stream context (e.g., on disconnect).\n */\n removeStream(streamId: string): boolean {\n return this.#streamContexts.delete(streamId);\n }\n}\n"]}
|