@multi-agent-protocol/sdk 0.0.2
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/README.md +248 -0
- package/dist/index-C7XPWnxS.d.cts +3052 -0
- package/dist/index-C7XPWnxS.d.ts +3052 -0
- package/dist/index.cjs +4528 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2288 -0
- package/dist/index.d.ts +2288 -0
- package/dist/index.js +4353 -0
- package/dist/index.js.map +1 -0
- package/dist/testing.cjs +4004 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +367 -0
- package/dist/testing.d.ts +367 -0
- package/dist/testing.js +4000 -0
- package/dist/testing.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jsonrpc/index.ts","../src/types/index.ts","../src/errors/index.ts","../src/connection/base.ts","../src/federation/envelope.ts","../src/protocol/index.ts","../src/permissions/index.ts","../src/utils/retry.ts","../src/testing/server.ts","../src/subscription/index.ts","../src/connection/client.ts","../src/stream/index.ts","../src/testing/client.ts","../src/connection/agent.ts","../src/testing/agent.ts"],"names":["ulid"],"mappings":"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","file":"testing.cjs","sourcesContent":["/**\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 * 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 _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 _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 * | `agents` | OR | AND | Event relates to one of the listed agents (legacy) |\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 agents the event relates to.\n * @deprecated Use `fromAgents` for clearer semantics\n */\n agents?: AgentId[];\n\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\nexport type AuthMethod = 'bearer' | 'api-key' | 'mtls' | 'none';\n\nexport interface AuthParams {\n method: AuthMethod;\n token?: string;\n}\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 /** Reclaim orphaned agents from previous connection */\n reclaimAgents?: AgentId[];\n /** Policy for unexpected disconnect */\n disconnectPolicy?: DisconnectPolicy;\n auth?: AuthParams;\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 _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 _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// 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 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} 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} 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\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 * 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 // ==========================================================================\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 * 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 * 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 * 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 * 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 * Test MAP Server Implementation\n *\n * A simple in-memory MAP server for testing purposes.\n * Implements the core MAP protocol methods.\n */\n\nimport type { Stream } from '../stream';\nimport { BaseConnection } from '../connection/base';\nimport { MAPRequestError } from '../errors';\nimport {\n CORE_METHODS,\n OBSERVATION_METHODS,\n LIFECYCLE_METHODS,\n STATE_METHODS,\n STEERING_METHODS,\n SCOPE_METHODS,\n FEDERATION_METHODS,\n NOTIFICATION_METHODS,\n PERMISSION_METHODS,\n PROTOCOL_VERSION,\n EVENT_TYPES,\n type Agent,\n type AgentId,\n type Scope,\n type ScopeId,\n type SessionId,\n type ParticipantId,\n type ParticipantCapabilities,\n type SubscriptionId,\n type SubscriptionFilter,\n type SubscriptionAckParams,\n type Message,\n type MessageId,\n type Event,\n type Address,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type AgentsRegisterRequestParams,\n type AgentsListRequestParams,\n type SendRequestParams,\n type SubscribeRequestParams,\n type ScopesCreateRequestParams,\n type InjectRequestParams,\n type DisconnectPolicy,\n type ReplayRequestParams,\n type ReplayResponseResult,\n type FederationRouteRequestParams,\n type FederationRoutingConfig,\n type FederationEnvelope,\n type PermissionsUpdateRequestParams,\n type PermissionsUpdateResponseResult,\n type AgentPermissions,\n type AgentsUpdateRequestParams,\n} from '../types';\nimport {\n processFederationEnvelope,\n isValidEnvelope,\n unwrapEnvelope,\n} from '../federation';\nimport {\n type SystemExposure,\n type PermissionContext,\n filterVisibleAgents,\n filterVisibleScopes,\n isEventTypeExposed,\n} from '../permissions';\nimport {\n buildConnectResponse,\n buildSendResponse,\n buildAgentsRegisterResponse,\n buildAgentsUnregisterResponse,\n buildAgentsListResponse,\n buildAgentsGetResponse,\n buildAgentsUpdateResponse,\n buildScopesCreateResponse,\n buildScopesListResponse,\n buildScopesJoinResponse,\n buildScopesLeaveResponse,\n buildSubscribeResponse,\n buildUnsubscribeResponse,\n} from '../protocol';\nimport { ulid } from '../utils';\n\n/**\n * Participant connection info\n */\ninterface ParticipantConnection {\n id: ParticipantId;\n type: 'agent' | 'client' | 'gateway';\n name?: string;\n connection: BaseConnection;\n subscriptions: Set<SubscriptionId>;\n agentId?: AgentId; // The agent ID if this participant registered as an agent\n /** Current effective capabilities for this participant */\n capabilities?: ParticipantCapabilities;\n}\n\n/**\n * Server subscription info\n */\ninterface ServerSubscription {\n id: SubscriptionId;\n participantId: ParticipantId;\n filter?: SubscriptionFilter;\n sequenceNumber: number;\n /** Last acknowledged sequence number from client */\n lastAckedSequence?: number;\n}\n\n/**\n * Options for test server\n */\nexport interface TestServerOptions {\n name?: string;\n version?: string;\n capabilities?: ParticipantCapabilities;\n /** Maximum number of events to retain for replay. Default: 10000 */\n maxEventHistory?: number;\n /** System exposure configuration for permission filtering */\n exposure?: SystemExposure;\n /** Federation routing configuration for envelope validation */\n federationRouting?: FederationRoutingConfig;\n}\n\n/**\n * Stored event for replay capability\n */\ninterface StoredEvent {\n eventId: string;\n timestamp: number;\n event: Event;\n /** Event IDs that caused this event */\n causedBy?: string[];\n}\n\n/**\n * Test MAP Server\n *\n * Provides a fully functional MAP server for integration testing.\n */\nexport class TestServer {\n readonly #options: TestServerOptions;\n readonly #participants: Map<ParticipantId, ParticipantConnection> = new Map();\n readonly #agents: Map<AgentId, Agent> = new Map();\n readonly #scopes: Map<ScopeId, Scope & { members: Set<AgentId> }> = new Map();\n readonly #subscriptions: Map<SubscriptionId, ServerSubscription> = new Map();\n readonly #messages: Message[] = [];\n readonly #eventHistory: StoredEvent[] = [];\n readonly #maxEventHistory: number;\n\n /**\n * Tracks recent event IDs for causal linking.\n * Key format: \"type:source\" or \"type:messageId\" for message events\n */\n readonly #recentEventIds: Map<string, string> = new Map();\n\n #sessionId: SessionId;\n #nextParticipantId = 1;\n #nextAgentId = 1;\n #nextScopeId = 1;\n #nextSubscriptionId = 1;\n #nextMessageId = 1;\n\n constructor(options: TestServerOptions = {}) {\n this.#options = options;\n this.#sessionId = `session-${Date.now()}`;\n this.#maxEventHistory = options.maxEventHistory ?? 10000;\n }\n\n /**\n * Accept a new connection\n */\n acceptConnection(stream: Stream): BaseConnection {\n const connection = new BaseConnection(stream);\n connection.setRequestHandler(this.#handleRequest.bind(this, connection));\n return connection;\n }\n\n /**\n * Get current session ID\n */\n get sessionId(): SessionId {\n return this.#sessionId;\n }\n\n /**\n * Get all registered agents\n */\n get agents(): ReadonlyMap<AgentId, Agent> {\n return this.#agents;\n }\n\n /**\n * Get all scopes\n */\n get scopes(): ReadonlyMap<ScopeId, Scope> {\n return this.#scopes;\n }\n\n /**\n * Get all messages sent through the server\n */\n get messages(): readonly Message[] {\n return this.#messages;\n }\n\n /**\n * Get connected participant count\n */\n get participantCount(): number {\n return this.#participants.size;\n }\n\n /**\n * Get event history for replay testing\n */\n get eventHistory(): readonly StoredEvent[] {\n return this.#eventHistory;\n }\n\n /**\n * Emit an event to subscribers\n * @param event - The event to emit (without id/timestamp)\n * @param causedBy - Optional array of event IDs that caused this event\n * @returns The generated event ID\n */\n emitEvent(event: Omit<Event, 'id' | 'timestamp'>, causedBy?: string[]): string {\n const eventId = ulid();\n const timestamp = Date.now();\n const fullEvent: Event = {\n id: `evt-${timestamp}-${Math.random().toString(36).slice(2)}`,\n timestamp,\n ...event,\n };\n\n // Check system exposure for this event type\n if (!isEventTypeExposed(this.#options.exposure, event.type)) {\n // Event type is hidden - don't emit or store\n return eventId;\n }\n\n // Store in event history for replay\n this.#eventHistory.push({ eventId, timestamp, event: fullEvent, causedBy });\n\n // Track this event ID for future causal linking\n const trackingKey = event.source ? `${event.type}:${event.source}` : event.type;\n this.#recentEventIds.set(trackingKey, eventId);\n\n // Also track by specific data fields for certain event types\n const eventData = event.data as Record<string, unknown> | undefined;\n if (eventData?.messageId) {\n this.#recentEventIds.set(`message:${eventData.messageId}`, eventId);\n }\n if (eventData?.agentId) {\n this.#recentEventIds.set(`${event.type}:agent:${eventData.agentId}`, eventId);\n }\n\n // Evict oldest events if we exceed the limit\n while (this.#eventHistory.length > this.#maxEventHistory) {\n this.#eventHistory.shift();\n }\n\n for (const subscription of this.#subscriptions.values()) {\n if (this.#matchesFilter(fullEvent, subscription.filter)) {\n const participant = this.#participants.get(subscription.participantId);\n if (participant) {\n subscription.sequenceNumber++;\n participant.connection.sendNotification(NOTIFICATION_METHODS.EVENT, {\n subscriptionId: subscription.id,\n sequenceNumber: subscription.sequenceNumber,\n eventId,\n timestamp,\n event: fullEvent,\n causedBy,\n });\n }\n }\n }\n\n return eventId;\n }\n\n /**\n * Deliver a message notification to a participant\n */\n deliverMessage(participantId: ParticipantId, message: Message): void {\n const participant = this.#participants.get(participantId);\n if (participant) {\n participant.connection.sendNotification(NOTIFICATION_METHODS.MESSAGE, {\n message,\n });\n }\n }\n\n /**\n * Handle incoming requests\n */\n async #handleRequest(\n connection: BaseConnection,\n method: string,\n params: unknown\n ): Promise<unknown> {\n switch (method) {\n // =======================================================================\n // Core Methods\n // =======================================================================\n\n case CORE_METHODS.CONNECT:\n return this.#handleConnect(connection, params as ConnectRequestParams);\n\n case CORE_METHODS.DISCONNECT:\n return this.#handleDisconnect(connection, params as { policy?: DisconnectPolicy });\n\n case CORE_METHODS.SEND:\n return this.#handleSend(connection, params as SendRequestParams);\n\n case CORE_METHODS.SUBSCRIBE:\n return this.#handleSubscribe(connection, params as SubscribeRequestParams | undefined);\n\n case CORE_METHODS.UNSUBSCRIBE:\n return this.#handleUnsubscribe(connection, params as { subscriptionId: SubscriptionId });\n\n case CORE_METHODS.REPLAY:\n return this.#handleReplay(params as ReplayRequestParams | undefined);\n\n // =======================================================================\n // Observation Methods\n // =======================================================================\n\n case OBSERVATION_METHODS.AGENTS_LIST:\n return this.#handleAgentsList(connection, params as AgentsListRequestParams | undefined);\n\n case OBSERVATION_METHODS.AGENTS_GET:\n return this.#handleAgentsGet(params as { agentId: AgentId; include?: { children?: boolean; descendants?: boolean } });\n\n case OBSERVATION_METHODS.SCOPES_LIST:\n return this.#handleScopesList(connection);\n\n // =======================================================================\n // Lifecycle Methods\n // =======================================================================\n\n case LIFECYCLE_METHODS.AGENTS_REGISTER:\n return this.#handleAgentsRegister(connection, params as AgentsRegisterRequestParams);\n\n case LIFECYCLE_METHODS.AGENTS_UNREGISTER:\n return this.#handleAgentsUnregister(params as { agentId: AgentId; reason?: string });\n\n case LIFECYCLE_METHODS.AGENTS_SPAWN:\n return this.#handleAgentsSpawn(\n connection,\n params as { parent: AgentId; name?: string; role?: string }\n );\n\n // =======================================================================\n // State Methods\n // =======================================================================\n\n case STATE_METHODS.AGENTS_UPDATE:\n return this.#handleAgentsUpdate(connection, params as AgentsUpdateRequestParams);\n\n case STATE_METHODS.AGENTS_STOP:\n return this.#handleAgentsStop(params as { agentId: AgentId; reason?: string });\n\n // =======================================================================\n // Scope Methods\n // =======================================================================\n\n case SCOPE_METHODS.SCOPES_CREATE:\n return this.#handleScopesCreate(params as ScopesCreateRequestParams);\n\n case SCOPE_METHODS.SCOPES_JOIN:\n return this.#handleScopesJoin(params as { scopeId: ScopeId; agentId: AgentId });\n\n case SCOPE_METHODS.SCOPES_LEAVE:\n return this.#handleScopesLeave(params as { scopeId: ScopeId; agentId: AgentId });\n\n // =======================================================================\n // Steering Methods\n // =======================================================================\n\n case STEERING_METHODS.INJECT:\n return this.#handleInject(params as InjectRequestParams);\n\n // =======================================================================\n // Federation Methods\n // =======================================================================\n\n case FEDERATION_METHODS.FEDERATION_ROUTE:\n return this.#handleFederationRoute(params as FederationRouteRequestParams);\n\n // =======================================================================\n // Notification Methods (client → server)\n // =======================================================================\n\n case NOTIFICATION_METHODS.SUBSCRIBE_ACK:\n return this.#handleSubscriptionAck(params as SubscriptionAckParams);\n\n // =======================================================================\n // Permission Methods\n // =======================================================================\n\n case PERMISSION_METHODS.PERMISSIONS_UPDATE:\n return this.#handlePermissionsUpdate(\n connection,\n params as PermissionsUpdateRequestParams\n );\n\n default:\n throw MAPRequestError.methodNotFound(method);\n }\n }\n\n // ===========================================================================\n // Core Method Handlers\n // ===========================================================================\n\n #handleConnect(\n connection: BaseConnection,\n params: ConnectRequestParams\n ): ConnectResponseResult {\n const participantId = params.participantId || `participant-${this.#nextParticipantId++}`;\n\n const participant: ParticipantConnection = {\n id: participantId,\n type: params.participantType as 'agent' | 'client' | 'gateway',\n name: params.name,\n connection,\n subscriptions: new Set(),\n capabilities: params.capabilities,\n };\n\n this.#participants.set(participantId, participant);\n\n // Clean up on connection close\n connection.closed.then(() => {\n this.#handleParticipantDisconnect(participantId);\n });\n\n // Emit participant connected event\n this.emitEvent({\n type: EVENT_TYPES.PARTICIPANT_CONNECTED,\n source: participantId,\n data: { participantId, participantType: params.participantType, name: params.name },\n });\n\n return buildConnectResponse({\n protocolVersion: PROTOCOL_VERSION,\n sessionId: this.#sessionId,\n participantId,\n capabilities: this.#options.capabilities ?? {\n observation: { canObserve: true, canQuery: true },\n messaging: { canSend: true, canReceive: true, canBroadcast: true },\n lifecycle: { canSpawn: true, canRegister: true, canUnregister: true, canStop: true, canSteer: true },\n scopes: { canCreateScopes: true, canManageScopes: true },\n streaming: { supportsAck: true, supportsPause: true },\n },\n systemInfo: {\n name: this.#options.name ?? 'Test MAP Server',\n version: this.#options.version ?? '1.0.0',\n },\n });\n }\n\n #handleDisconnect(\n connection: BaseConnection,\n params?: { policy?: DisconnectPolicy }\n ): { acknowledged: boolean } {\n // Find and remove participant\n for (const [id, participant] of this.#participants) {\n if (participant.connection === connection) {\n this.#handleParticipantDisconnect(id, params?.policy);\n break;\n }\n }\n return { acknowledged: true };\n }\n\n #handleParticipantDisconnect(participantId: ParticipantId, policy?: DisconnectPolicy): void {\n const participant = this.#participants.get(participantId);\n if (!participant) return;\n\n // Remove subscriptions\n for (const subId of participant.subscriptions) {\n this.#subscriptions.delete(subId);\n }\n\n // Emit participant disconnected event FIRST (this is the cause)\n const disconnectEventId = this.emitEvent({\n type: EVENT_TYPES.PARTICIPANT_DISCONNECTED,\n source: participantId,\n data: { participantId, participantType: participant.type },\n });\n\n // Handle agents owned by this participant based on policy\n const ownedAgents = Array.from(this.#agents.values()).filter((a) => a.ownerId === participantId);\n\n for (const agent of ownedAgents) {\n const agentBehavior = policy?.agentBehavior ?? 'unregister';\n\n if (agentBehavior === 'unregister') {\n // Unregister the agent and all descendants, caused by disconnect\n this.#terminateAgentTree(agent.id, [disconnectEventId]);\n } else if (agentBehavior === 'orphan') {\n // Mark agent as orphaned by setting ownerId to null\n const previousOwner = agent.ownerId;\n (agent as { ownerId: ParticipantId | null }).ownerId = null;\n this.emitEvent(\n {\n type: EVENT_TYPES.AGENT_ORPHANED,\n source: agent.id,\n data: { agentId: agent.id, previousOwner },\n },\n [disconnectEventId] // Caused by the disconnect event\n );\n }\n // 'grace-period' policy: would implement timeout logic in a real server\n }\n\n this.#participants.delete(participantId);\n }\n\n /**\n * Terminate an agent and all its descendants\n * @param agentId - Agent to terminate\n * @param causedBy - Event IDs that caused this termination (e.g., disconnect event)\n */\n #terminateAgentTree(agentId: AgentId, causedBy?: string[]): void {\n // Find and terminate children first\n const children = Array.from(this.#agents.values()).filter((a) => a.parent === agentId);\n for (const child of children) {\n this.#terminateAgentTree(child.id, causedBy);\n }\n\n // Then terminate this agent\n const agent = this.#agents.get(agentId);\n if (agent) {\n this.#agents.delete(agentId);\n\n // Remove from all scopes\n for (const scope of this.#scopes.values()) {\n scope.members.delete(agentId);\n }\n\n this.emitEvent(\n {\n type: EVENT_TYPES.AGENT_UNREGISTERED,\n source: agentId,\n data: { agentId, reason: 'owner_disconnected' },\n },\n causedBy\n );\n }\n }\n\n #handleAgentsList(connection: BaseConnection, params?: AgentsListRequestParams): { agents: Agent[] } {\n let agents = Array.from(this.#agents.values());\n\n // Apply permission filtering if exposure is configured\n const permissionContext = this.#buildPermissionContext(connection);\n if (permissionContext) {\n agents = filterVisibleAgents(agents, permissionContext);\n }\n\n if (params?.filter) {\n const { states, roles, scopes, parent } = params.filter;\n\n if (states?.length) {\n agents = agents.filter((a) => states.includes(a.state));\n }\n if (roles?.length) {\n agents = agents.filter((a) => a.role && roles.includes(a.role));\n }\n if (scopes?.length) {\n agents = agents.filter((a) => a.scopes?.some((s) => scopes.includes(s)));\n }\n if (parent) {\n agents = agents.filter((a) => a.parent === parent);\n }\n }\n\n return buildAgentsListResponse(agents);\n }\n\n #handleAgentsGet(params: {\n agentId: AgentId;\n include?: { children?: boolean; descendants?: boolean };\n }): { agent: Agent; children?: Agent[]; descendants?: Agent[] } {\n const agent = this.#agents.get(params.agentId);\n if (!agent) {\n throw MAPRequestError.agentNotFound(params.agentId);\n }\n\n const children = params.include?.children\n ? Array.from(this.#agents.values()).filter((a) => a.parent === params.agentId)\n : undefined;\n\n const descendants = params.include?.descendants\n ? this.#getDescendants(params.agentId)\n : undefined;\n\n return buildAgentsGetResponse(agent, children, descendants);\n }\n\n /**\n * Get all descendants of an agent recursively\n */\n #getDescendants(agentId: AgentId): Agent[] {\n const descendants: Agent[] = [];\n const children = Array.from(this.#agents.values()).filter((a) => a.parent === agentId);\n\n for (const child of children) {\n descendants.push(child);\n descendants.push(...this.#getDescendants(child.id));\n }\n\n return descendants;\n }\n\n #handleSend(connection: BaseConnection, params: SendRequestParams): { messageId: MessageId; delivered?: ParticipantId[] } {\n const messageId = `msg-${this.#nextMessageId++}`;\n const delivered: ParticipantId[] = [];\n\n // Find sender participant and their agent ID (for hierarchical addressing)\n let senderId: ParticipantId | undefined;\n let senderAgentId: AgentId | undefined;\n for (const [id, participant] of this.#participants) {\n if (participant.connection === connection) {\n senderId = id;\n senderAgentId = participant.agentId;\n break;\n }\n }\n\n const message: Message = {\n id: messageId,\n from: senderId ?? 'unknown',\n to: params.to,\n timestamp: Date.now(),\n payload: params.payload,\n meta: params.meta,\n };\n\n this.#messages.push(message);\n\n // Resolve recipients (pass sender agent ID for hierarchical addressing)\n const recipients = this.#resolveAddress(params.to, senderAgentId);\n\n for (const recipientId of recipients) {\n const participant = this.#participants.get(recipientId);\n if (participant) {\n this.deliverMessage(recipientId, message);\n delivered.push(recipientId);\n }\n }\n\n // Emit message event\n this.emitEvent({\n type: EVENT_TYPES.MESSAGE_SENT,\n source: senderId,\n data: { messageId, to: params.to },\n });\n\n return buildSendResponse(messageId, delivered);\n }\n\n #handleSubscribe(\n connection: BaseConnection,\n params?: SubscribeRequestParams\n ): { subscriptionId: SubscriptionId } {\n // Find participant\n let participantId: ParticipantId | undefined;\n for (const [id, participant] of this.#participants) {\n if (participant.connection === connection) {\n participantId = id;\n break;\n }\n }\n\n if (!participantId) {\n throw MAPRequestError.authRequired();\n }\n\n const subscriptionId = `sub-${this.#nextSubscriptionId++}`;\n\n const subscription: ServerSubscription = {\n id: subscriptionId,\n participantId,\n filter: params?.filter,\n sequenceNumber: 0,\n };\n\n this.#subscriptions.set(subscriptionId, subscription);\n this.#participants.get(participantId)!.subscriptions.add(subscriptionId);\n\n return buildSubscribeResponse(subscriptionId);\n }\n\n #handleUnsubscribe(\n _connection: BaseConnection,\n params: { subscriptionId: SubscriptionId }\n ): { subscription: { id: SubscriptionId; closedAt: number } } {\n const subscription = this.#subscriptions.get(params.subscriptionId);\n if (subscription) {\n this.#subscriptions.delete(params.subscriptionId);\n const participant = this.#participants.get(subscription.participantId);\n if (participant) {\n participant.subscriptions.delete(params.subscriptionId);\n }\n }\n return buildUnsubscribeResponse(params.subscriptionId);\n }\n\n #handleReplay(params?: ReplayRequestParams): ReplayResponseResult {\n const {\n afterEventId,\n fromTimestamp,\n toTimestamp,\n filter,\n limit = 100,\n } = params ?? {};\n\n // Start with all events\n let events = [...this.#eventHistory];\n\n // Apply afterEventId filter (keyset pagination)\n if (afterEventId) {\n const idx = events.findIndex((e) => e.eventId === afterEventId);\n if (idx >= 0) {\n events = events.slice(idx + 1);\n }\n // If not found, return all events (could also throw error)\n }\n\n // Apply timestamp filters\n if (fromTimestamp !== undefined) {\n events = events.filter((e) => e.timestamp >= fromTimestamp);\n }\n if (toTimestamp !== undefined) {\n events = events.filter((e) => e.timestamp <= toTimestamp);\n }\n\n // Apply subscription filter\n if (filter) {\n events = events.filter((e) => this.#matchesFilter(e.event, filter));\n }\n\n // Determine if there are more events beyond the limit\n const hasMore = events.length > limit;\n\n // Apply limit\n events = events.slice(0, Math.min(limit, 1000));\n\n return {\n events: events.map((e) => ({\n eventId: e.eventId,\n timestamp: e.timestamp,\n event: e.event,\n causedBy: e.causedBy,\n })),\n hasMore,\n totalCount: this.#eventHistory.length,\n };\n }\n\n // ===========================================================================\n // Structure Method Handlers\n // ===========================================================================\n\n #handleAgentsRegister(\n connection: BaseConnection,\n params: AgentsRegisterRequestParams\n ): { agent: Agent } {\n const agentId = params.agentId || `agent-${this.#nextAgentId++}`;\n\n if (this.#agents.has(agentId)) {\n throw MAPRequestError.agentExists(agentId);\n }\n\n // Find the owning participant\n let ownerId: ParticipantId = 'unknown';\n for (const [participantId, participant] of this.#participants) {\n if (participant.connection === connection) {\n ownerId = participantId;\n participant.agentId = agentId;\n break;\n }\n }\n\n const agent: Agent = {\n id: agentId,\n name: params.name,\n description: params.description,\n role: params.role,\n parent: params.parent,\n ownerId, // v2: Track which participant owns this agent\n state: 'registered',\n scopes: params.scopes,\n visibility: params.visibility,\n capabilities: params.capabilities,\n metadata: params.metadata,\n permissionOverrides: params.permissionOverrides,\n lifecycle: {\n createdAt: Date.now(),\n },\n };\n\n this.#agents.set(agentId, agent);\n\n // Emit event\n this.emitEvent({\n type: EVENT_TYPES.AGENT_REGISTERED,\n source: agentId,\n data: { agentId, name: agent.name, role: agent.role, ownerId },\n });\n\n return buildAgentsRegisterResponse(agent);\n }\n\n #handleAgentsUnregister(params: { agentId: AgentId; reason?: string }): { agent: Agent } {\n const agent = this.#agents.get(params.agentId);\n if (!agent) {\n throw MAPRequestError.agentNotFound(params.agentId);\n }\n\n // Save a copy before deleting\n const agentCopy = { ...agent };\n\n this.#agents.delete(params.agentId);\n\n // Remove from all scopes\n for (const scope of this.#scopes.values()) {\n scope.members.delete(params.agentId);\n }\n\n // Emit event\n this.emitEvent({\n type: EVENT_TYPES.AGENT_UNREGISTERED,\n source: params.agentId,\n data: { agentId: params.agentId, reason: params.reason },\n });\n\n return buildAgentsUnregisterResponse(agentCopy);\n }\n\n #handleAgentsUpdate(\n connection: BaseConnection,\n params: AgentsUpdateRequestParams\n ): { agent: Agent } {\n const agent = this.#agents.get(params.agentId);\n if (!agent) {\n throw MAPRequestError.agentNotFound(params.agentId);\n }\n\n // Find the requesting participant (for event tracking)\n let requestingParticipantId: ParticipantId | undefined;\n for (const [id, p] of this.#participants) {\n if (p.connection === connection) {\n requestingParticipantId = id;\n break;\n }\n }\n\n const previousState = agent.state;\n\n if (params.state) {\n agent.state = params.state;\n }\n if (params.metadata) {\n agent.metadata = { ...agent.metadata, ...params.metadata };\n }\n\n // Handle permission overrides\n if (params.permissionOverrides) {\n // Merge with existing overrides\n const existingOverrides = agent.permissionOverrides ?? {};\n const newOverrides: Partial<AgentPermissions> = {};\n\n // Deep merge each permission category\n if (existingOverrides.canSee || params.permissionOverrides.canSee) {\n newOverrides.canSee = {\n ...existingOverrides.canSee,\n ...params.permissionOverrides.canSee,\n };\n }\n if (existingOverrides.canMessage || params.permissionOverrides.canMessage) {\n newOverrides.canMessage = {\n ...existingOverrides.canMessage,\n ...params.permissionOverrides.canMessage,\n };\n }\n if (existingOverrides.acceptsFrom || params.permissionOverrides.acceptsFrom) {\n newOverrides.acceptsFrom = {\n ...existingOverrides.acceptsFrom,\n ...params.permissionOverrides.acceptsFrom,\n };\n }\n\n agent.permissionOverrides = newOverrides;\n\n // Emit permissions_agent_updated event\n this.emitEvent({\n type: EVENT_TYPES.PERMISSIONS_AGENT_UPDATED,\n source: params.agentId,\n data: {\n agentId: params.agentId,\n changes: params.permissionOverrides,\n effectivePermissions: newOverrides as AgentPermissions,\n updatedBy: requestingParticipantId,\n },\n });\n }\n\n // Emit state change event\n if (params.state && params.state !== previousState) {\n this.emitEvent({\n type: EVENT_TYPES.AGENT_STATE_CHANGED,\n source: params.agentId,\n data: { agentId: params.agentId, previousState, newState: params.state },\n });\n }\n\n return buildAgentsUpdateResponse(agent);\n }\n\n #handleAgentsSpawn(\n connection: BaseConnection,\n params: { parent: AgentId; name?: string; role?: string }\n ): { agent: Agent } {\n // Verify parent exists\n if (!this.#agents.has(params.parent)) {\n throw MAPRequestError.agentNotFound(params.parent);\n }\n\n return this.#handleAgentsRegister(connection, {\n name: params.name,\n role: params.role,\n parent: params.parent,\n });\n }\n\n #handleAgentsStop(params: { agentId: AgentId; reason?: string }): { stopping: boolean; agent?: Agent } {\n const agent = this.#agents.get(params.agentId);\n if (!agent) {\n throw MAPRequestError.agentNotFound(params.agentId);\n }\n\n agent.state = 'stopping';\n\n this.emitEvent({\n type: EVENT_TYPES.AGENT_STATE_CHANGED,\n source: params.agentId,\n data: { agentId: params.agentId, previousState: agent.state, newState: 'stopping' },\n });\n\n return { stopping: true, agent };\n }\n\n #handleScopesList(connection: BaseConnection): { scopes: Scope[] } {\n let scopes: Scope[] = Array.from(this.#scopes.values()).map(({ members, ...scope }) => scope);\n\n // Apply permission filtering if exposure is configured\n const permissionContext = this.#buildPermissionContext(connection);\n if (permissionContext) {\n scopes = filterVisibleScopes(scopes, permissionContext);\n }\n\n return buildScopesListResponse(scopes);\n }\n\n #handleScopesCreate(params: ScopesCreateRequestParams): { scope: Scope } {\n const scopeId = params.scopeId || `scope-${this.#nextScopeId++}`;\n\n const scope: Scope & { members: Set<AgentId> } = {\n id: scopeId,\n name: params.name,\n description: params.description,\n parent: params.parent,\n joinPolicy: params.joinPolicy,\n visibility: params.visibility,\n members: new Set(),\n };\n\n this.#scopes.set(scopeId, scope);\n\n this.emitEvent({\n type: EVENT_TYPES.SCOPE_CREATED,\n data: { scopeId, name: scope.name },\n });\n\n const { members, ...scopeWithoutMembers } = scope;\n return buildScopesCreateResponse(scopeWithoutMembers);\n }\n\n #handleScopesJoin(params: { scopeId: ScopeId; agentId: AgentId }): { scope: Scope; agent: Agent } {\n const scope = this.#scopes.get(params.scopeId);\n if (!scope) {\n throw MAPRequestError.scopeNotFound(params.scopeId);\n }\n\n const agent = this.#agents.get(params.agentId);\n if (!agent) {\n throw MAPRequestError.agentNotFound(params.agentId);\n }\n\n scope.members.add(params.agentId);\n\n // Update agent's scope list\n if (!agent.scopes) {\n agent.scopes = [];\n }\n if (!agent.scopes.includes(params.scopeId)) {\n agent.scopes.push(params.scopeId);\n }\n\n this.emitEvent({\n type: EVENT_TYPES.SCOPE_MEMBER_JOINED,\n source: params.agentId,\n data: { scopeId: params.scopeId, agentId: params.agentId },\n });\n\n const { members, ...scopeWithoutMembers } = scope;\n return buildScopesJoinResponse(scopeWithoutMembers, agent);\n }\n\n #handleScopesLeave(params: { scopeId: ScopeId; agentId: AgentId }): { scope: Scope; agent: Agent } {\n const scope = this.#scopes.get(params.scopeId);\n if (!scope) {\n throw MAPRequestError.scopeNotFound(params.scopeId);\n }\n\n scope.members.delete(params.agentId);\n\n // Update agent's scope list\n const agent = this.#agents.get(params.agentId);\n if (!agent) {\n throw MAPRequestError.agentNotFound(params.agentId);\n }\n if (agent.scopes) {\n agent.scopes = agent.scopes.filter((s) => s !== params.scopeId);\n }\n\n this.emitEvent({\n type: EVENT_TYPES.SCOPE_MEMBER_LEFT,\n source: params.agentId,\n data: { scopeId: params.scopeId, agentId: params.agentId },\n });\n\n const { members, ...scopeWithoutMembers } = scope;\n return buildScopesLeaveResponse(scopeWithoutMembers, agent);\n }\n\n // ===========================================================================\n // Extension Method Handlers\n // ===========================================================================\n\n #handleInject(params: InjectRequestParams): { injected: boolean; delivery?: string } {\n const agent = this.#agents.get(params.agentId);\n if (!agent) {\n throw MAPRequestError.agentNotFound(params.agentId);\n }\n\n // In a real server, this would inject content into the agent\n // For testing, we just acknowledge it\n return { injected: true, delivery: params.delivery ?? 'queue' };\n }\n\n // ===========================================================================\n // Helpers\n // ===========================================================================\n\n /**\n * Build a permission context for a connection.\n * Returns undefined if no exposure configuration is set.\n */\n #buildPermissionContext(connection: BaseConnection): PermissionContext | undefined {\n if (!this.#options.exposure) {\n return undefined;\n }\n\n // Find the participant for this connection\n let participant: ParticipantConnection | undefined;\n for (const p of this.#participants.values()) {\n if (p.connection === connection) {\n participant = p;\n break;\n }\n }\n\n if (!participant) {\n return undefined;\n }\n\n // Get owned agent IDs\n const ownedAgentIds: AgentId[] = [];\n for (const agent of this.#agents.values()) {\n if (agent.ownerId === participant.id) {\n ownedAgentIds.push(agent.id);\n }\n }\n\n // Build scope membership map\n const scopeMembership = new Map<ScopeId, AgentId[]>();\n for (const [scopeId, scope] of this.#scopes) {\n const memberAgentIds = Array.from(scope.members).filter((agentId) =>\n ownedAgentIds.includes(agentId)\n );\n if (memberAgentIds.length > 0) {\n scopeMembership.set(scopeId, memberAgentIds);\n }\n }\n\n return {\n system: { exposure: this.#options.exposure },\n participant: {\n id: participant.id,\n type: participant.type,\n capabilities: this.#options.capabilities ?? {\n observation: { canObserve: true, canQuery: true },\n messaging: { canSend: true, canReceive: true, canBroadcast: true },\n lifecycle: { canSpawn: true, canRegister: true, canUnregister: true, canStop: true, canSteer: true },\n scopes: { canCreateScopes: true, canManageScopes: true },\n },\n },\n ownedAgentIds,\n scopeMembership,\n };\n }\n\n #resolveAddress(address: Address, senderAgentId?: AgentId): ParticipantId[] {\n if (typeof address === 'string') {\n // Could be either a participant ID or agent ID\n return [this.#findParticipantForAgent(address) ?? address];\n }\n\n if ('agent' in address && !('system' in address)) {\n const participantId = this.#findParticipantForAgent(address.agent);\n return participantId ? [participantId] : [];\n }\n\n if ('agents' in address) {\n return address.agents\n .map((agentId) => this.#findParticipantForAgent(agentId))\n .filter((id): id is ParticipantId => id !== undefined);\n }\n\n if ('scope' in address) {\n const scope = this.#scopes.get(address.scope);\n if (!scope) return [];\n return Array.from(scope.members)\n .map((agentId) => this.#findParticipantForAgent(agentId))\n .filter((id): id is ParticipantId => id !== undefined);\n }\n\n if ('broadcast' in address) {\n return Array.from(this.#participants.keys());\n }\n\n if ('role' in address) {\n const agents = Array.from(this.#agents.values()).filter((a) => a.role === address.role);\n return agents\n .map((a) => this.#findParticipantForAgent(a.id))\n .filter((id): id is ParticipantId => id !== undefined);\n }\n\n // Hierarchical addressing - requires sender agent context\n if ('parent' in address || 'children' in address || 'siblings' in address ||\n 'ancestors' in address || 'descendants' in address) {\n return this.#resolveHierarchicalAddress(address, senderAgentId);\n }\n\n return [];\n }\n\n /**\n * Resolve hierarchical address relative to sender agent\n */\n #resolveHierarchicalAddress(\n address: { parent?: true; children?: true; siblings?: true; ancestors?: true; descendants?: true; depth?: number },\n senderAgentId?: AgentId\n ): ParticipantId[] {\n if (!senderAgentId) return [];\n\n const senderAgent = this.#agents.get(senderAgentId);\n if (!senderAgent) return [];\n\n const targetAgentIds: AgentId[] = [];\n const depth = address.depth;\n\n // Parent - direct parent only\n if (address.parent && senderAgent.parent) {\n targetAgentIds.push(senderAgent.parent);\n }\n\n // Children - direct children only\n if (address.children) {\n const children = Array.from(this.#agents.values())\n .filter((a) => a.parent === senderAgentId);\n targetAgentIds.push(...children.map((a) => a.id));\n }\n\n // Siblings - agents with same parent (excluding self)\n if (address.siblings && senderAgent.parent) {\n const siblings = Array.from(this.#agents.values())\n .filter((a) => a.parent === senderAgent.parent && a.id !== senderAgentId);\n targetAgentIds.push(...siblings.map((a) => a.id));\n }\n\n // Ancestors - parent, grandparent, etc. (with optional depth limit)\n if (address.ancestors) {\n let currentAgent = senderAgent;\n let currentDepth = 0;\n while (currentAgent.parent && (depth === undefined || currentDepth < depth)) {\n targetAgentIds.push(currentAgent.parent);\n currentAgent = this.#agents.get(currentAgent.parent)!;\n if (!currentAgent) break;\n currentDepth++;\n }\n }\n\n // Descendants - children, grandchildren, etc. (with optional depth limit)\n if (address.descendants) {\n const collectDescendants = (agentId: AgentId, currentDepth: number): void => {\n if (depth !== undefined && currentDepth >= depth) return;\n\n const children = Array.from(this.#agents.values())\n .filter((a) => a.parent === agentId);\n\n for (const child of children) {\n targetAgentIds.push(child.id);\n collectDescendants(child.id, currentDepth + 1);\n }\n };\n collectDescendants(senderAgentId, 0);\n }\n\n // Convert agent IDs to participant IDs\n return targetAgentIds\n .map((agentId) => this.#findParticipantForAgent(agentId))\n .filter((id): id is ParticipantId => id !== undefined);\n }\n\n /**\n * Find the participant ID that registered a given agent\n */\n #findParticipantForAgent(agentId: AgentId): ParticipantId | undefined {\n for (const [participantId, participant] of this.#participants) {\n if (participant.agentId === agentId) {\n return participantId;\n }\n }\n return undefined;\n }\n\n #matchesFilter(event: Event, filter?: SubscriptionFilter): boolean {\n if (!filter) return true;\n\n // Filter by event types\n if (filter.eventTypes?.length) {\n if (!filter.eventTypes.includes(event.type)) {\n return false;\n }\n }\n\n // Filter by specific agents (legacy)\n if (filter.agents?.length && event.source) {\n if (!filter.agents.includes(event.source)) {\n return false;\n }\n }\n\n // Filter by source agents (v2)\n if (filter.fromAgents?.length && event.source) {\n if (!filter.fromAgents.includes(event.source)) {\n return false;\n }\n }\n\n // Filter by scopes\n if (filter.scopes?.length) {\n const eventData = event.data as Record<string, unknown> | undefined;\n const scopeId = eventData?.scopeId as string | undefined;\n if (!scopeId || !filter.scopes.includes(scopeId)) {\n return false;\n }\n }\n\n // Filter by roles (v2) - check if source agent has matching role\n if (filter.fromRoles?.length && event.source) {\n const agent = this.#agents.get(event.source);\n if (!agent?.role || !filter.fromRoles.includes(agent.role)) {\n return false;\n }\n }\n\n // Filter by correlation IDs (v2)\n if (filter.correlationIds?.length) {\n const eventData = event.data as Record<string, unknown> | undefined;\n const correlationId = eventData?.correlationId as string | undefined;\n if (!correlationId || !filter.correlationIds.includes(correlationId)) {\n return false;\n }\n }\n\n // Filter by metadata match (v2)\n if (filter.metadataMatch) {\n const eventData = event.data as Record<string, unknown> | undefined;\n const metadata = eventData?.metadata as Record<string, unknown> | undefined;\n if (!metadata) return false;\n\n for (const [key, value] of Object.entries(filter.metadataMatch)) {\n if (metadata[key] !== value) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n // ===========================================================================\n // Federation Method Handlers\n // ===========================================================================\n\n #handleFederationRoute(params: FederationRouteRequestParams): { routed: boolean; messageId?: MessageId } {\n const { systemId, envelope, message } = params;\n\n let actualMessage: Message;\n\n // Handle envelope format (preferred)\n if (envelope && isValidEnvelope(envelope)) {\n // Validate routing if configured\n if (this.#options.federationRouting) {\n const result = processFederationEnvelope(\n envelope as FederationEnvelope<Message>,\n this.#options.federationRouting\n );\n if (!result.success) {\n throw new MAPRequestError(result.errorCode, result.errorMessage);\n }\n }\n actualMessage = unwrapEnvelope(envelope as FederationEnvelope<Message>);\n } else if (message) {\n // Backwards compatibility: plain message format\n actualMessage = message;\n } else {\n throw MAPRequestError.invalidParams('Missing envelope or message');\n }\n\n // Store the message (for testing purposes)\n this.#messages.push(actualMessage);\n\n // Emit federation event\n this.emitEvent({\n type: EVENT_TYPES.MESSAGE_SENT,\n source: actualMessage.from,\n data: {\n messageId: actualMessage.id,\n from: actualMessage.from,\n to: actualMessage.to,\n federatedTo: systemId,\n },\n });\n\n return { routed: true, messageId: actualMessage.id };\n }\n\n // ===========================================================================\n // Notification Handlers\n // ===========================================================================\n\n #handleSubscriptionAck(params: SubscriptionAckParams): void {\n const { subscriptionId, upToSequence } = params;\n const subscription = this.#subscriptions.get(subscriptionId);\n if (subscription) {\n subscription.lastAckedSequence = upToSequence;\n }\n // Notifications don't return a response, but we need to return something\n // to avoid errors. The connection layer handles notifications specially.\n }\n\n /**\n * Get ack state for a subscription (for testing assertions)\n */\n getSubscriptionAckState(subscriptionId: SubscriptionId): { sequenceNumber: number; lastAckedSequence?: number } | undefined {\n const subscription = this.#subscriptions.get(subscriptionId);\n if (!subscription) return undefined;\n return {\n sequenceNumber: subscription.sequenceNumber,\n lastAckedSequence: subscription.lastAckedSequence,\n };\n }\n\n // ===========================================================================\n // Permission Handlers\n // ===========================================================================\n\n /**\n * Handle permissions update request.\n * Updates client capabilities and emits permission update event.\n */\n #handlePermissionsUpdate(\n connection: BaseConnection,\n params: PermissionsUpdateRequestParams\n ): PermissionsUpdateResponseResult {\n const { clientId, permissions } = params;\n\n // Find the target client\n const targetParticipant = this.#participants.get(clientId);\n if (!targetParticipant) {\n throw MAPRequestError.invalidParams(`Client ${clientId} not found`);\n }\n\n // Find the requesting participant (for event tracking)\n let requestingParticipantId: ParticipantId | undefined;\n for (const [id, p] of this.#participants) {\n if (p.connection === connection) {\n requestingParticipantId = id;\n break;\n }\n }\n\n // Merge permissions with existing\n const existingCapabilities = targetParticipant.capabilities ?? {};\n const effectivePermissions: ParticipantCapabilities = {};\n\n // Copy existing capabilities\n if (existingCapabilities.observation) {\n effectivePermissions.observation = { ...existingCapabilities.observation };\n }\n if (existingCapabilities.messaging) {\n effectivePermissions.messaging = { ...existingCapabilities.messaging };\n }\n if (existingCapabilities.lifecycle) {\n effectivePermissions.lifecycle = { ...existingCapabilities.lifecycle };\n }\n if (existingCapabilities.scopes) {\n effectivePermissions.scopes = { ...existingCapabilities.scopes };\n }\n if (existingCapabilities.federation) {\n effectivePermissions.federation = { ...existingCapabilities.federation };\n }\n if (existingCapabilities.streaming) {\n effectivePermissions.streaming = { ...existingCapabilities.streaming };\n }\n\n // Merge in new permissions\n if (permissions.observation) {\n effectivePermissions.observation = {\n ...effectivePermissions.observation,\n ...permissions.observation,\n };\n }\n if (permissions.messaging) {\n effectivePermissions.messaging = {\n ...effectivePermissions.messaging,\n ...permissions.messaging,\n };\n }\n if (permissions.lifecycle) {\n effectivePermissions.lifecycle = {\n ...effectivePermissions.lifecycle,\n ...permissions.lifecycle,\n };\n }\n if (permissions.scopes) {\n effectivePermissions.scopes = {\n ...effectivePermissions.scopes,\n ...permissions.scopes,\n };\n }\n if (permissions.federation) {\n effectivePermissions.federation = {\n ...effectivePermissions.federation,\n ...permissions.federation,\n };\n }\n if (permissions.streaming) {\n effectivePermissions.streaming = {\n ...effectivePermissions.streaming,\n ...permissions.streaming,\n };\n }\n\n // Update the participant's capabilities\n targetParticipant.capabilities = effectivePermissions;\n\n // Emit permissions_client_updated event\n this.emitEvent({\n type: EVENT_TYPES.PERMISSIONS_CLIENT_UPDATED,\n data: {\n clientId,\n changes: permissions,\n effectivePermissions,\n changedBy: requestingParticipantId,\n },\n });\n\n return {\n success: true,\n effectivePermissions,\n };\n }\n}\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 * 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 } from '../stream';\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 CORE_METHODS,\n OBSERVATION_METHODS,\n STATE_METHODS,\n STEERING_METHODS,\n SESSION_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} 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 * 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 */\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 #options: ClientConnectionOptions;\n\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #connected = false;\n #lastConnectOptions?: {\n sessionId?: SessionId;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n #isReconnecting = false;\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 // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the MAP system\n */\n async connect(options?: {\n sessionId?: SessionId;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\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 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 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 // 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 }\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 // 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 * 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 * 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 * Test Client Helper\n *\n * Provides a convenient wrapper around ClientConnection for testing.\n * Automatically manages stream pairs and connection lifecycle.\n */\n\nimport { ClientConnection, type ClientConnectionOptions } from '../connection/client';\nimport { createStreamPair } from '../stream';\nimport type { TestServer } from './server';\nimport type {\n Agent,\n Scope,\n Event,\n EventType,\n SubscriptionFilter,\n AgentsListRequestParams,\n ScopesListRequestParams,\n} from '../types';\nimport { Subscription } from '../subscription';\n\n/**\n * Options for TestClient\n */\nexport interface TestClientOptions extends ClientConnectionOptions {\n /** Auto-connect on creation */\n autoConnect?: boolean;\n}\n\n/**\n * Test client for integration testing.\n *\n * Wraps ClientConnection with convenience methods and automatic\n * stream management for easier testing.\n */\nexport class TestClient {\n readonly #connection: ClientConnection;\n #subscriptions: Map<string, Subscription> = new Map();\n\n private constructor(connection: ClientConnection) {\n this.#connection = connection;\n }\n\n /**\n * Create and connect a test client\n */\n static async create(server: TestServer, options: TestClientOptions = {}): Promise<TestClient> {\n const [clientStream, serverStream] = createStreamPair();\n const connection = new ClientConnection(clientStream, options);\n server.acceptConnection(serverStream);\n\n const client = new TestClient(connection);\n\n if (options.autoConnect !== false) {\n await connection.connect();\n }\n\n return client;\n }\n\n /**\n * Get the underlying connection\n */\n get connection(): ClientConnection {\n return this.#connection;\n }\n\n /**\n * Whether the client is connected\n */\n get isConnected(): boolean {\n return this.#connection.isConnected;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): string | null {\n return this.#connection.sessionId;\n }\n\n /**\n * Connect to the server\n */\n async connect(): Promise<void> {\n await this.#connection.connect();\n }\n\n /**\n * Disconnect from the server\n */\n async disconnect(): Promise<void> {\n // Close all subscriptions\n for (const sub of this.#subscriptions.values()) {\n await sub.unsubscribe();\n }\n this.#subscriptions.clear();\n\n await this.#connection.disconnect();\n }\n\n // ===========================================================================\n // Agent Queries\n // ===========================================================================\n\n /**\n * List all agents\n */\n async listAgents(options?: AgentsListRequestParams): Promise<Agent[]> {\n const result = await this.#connection.listAgents(options);\n return result.agents;\n }\n\n /**\n * Get agent by ID with optional hierarchy expansion\n */\n async getAgent(\n agentId: string,\n options?: { include?: { children?: boolean; descendants?: boolean } }\n ): Promise<{ agent: Agent; children?: Agent[]; descendants?: Agent[] }> {\n return this.#connection.getAgent(agentId, options);\n }\n\n /**\n * Find agent by name\n */\n async findAgentByName(name: string): Promise<Agent | undefined> {\n const agents = await this.listAgents();\n return agents.find((a) => a.name === name);\n }\n\n /**\n * Find agents by role\n */\n async findAgentsByRole(role: string): Promise<Agent[]> {\n const result = await this.#connection.listAgents({ filter: { roles: [role] } });\n return result.agents;\n }\n\n // ===========================================================================\n // Scope Queries\n // ===========================================================================\n\n /**\n * List all scopes\n */\n async listScopes(options?: ScopesListRequestParams): Promise<Scope[]> {\n const result = await this.#connection.listScopes(options);\n return result.scopes;\n }\n\n /**\n * Get scope by ID\n */\n async getScope(scopeId: string): Promise<Scope> {\n return this.#connection.getScope(scopeId);\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send message to agent\n */\n async sendTo(agentId: string, payload: unknown): Promise<string> {\n const result = await this.#connection.sendToAgent(agentId, payload);\n return result.messageId;\n }\n\n /**\n * Broadcast to all agents\n */\n async broadcast(payload: unknown): Promise<string> {\n const result = await this.#connection.broadcast(payload);\n return result.messageId;\n }\n\n /**\n * Send to all agents with a specific role\n */\n async sendToRole(role: string, payload: unknown): Promise<string> {\n const result = await this.#connection.sendToRole(role, payload);\n return result.messageId;\n }\n\n /**\n * Send to all agents in a scope\n */\n async sendToScope(scopeId: string, payload: unknown): Promise<string> {\n const result = await this.#connection.sendToScope(scopeId, payload);\n return result.messageId;\n }\n\n // ===========================================================================\n // Subscriptions\n // ===========================================================================\n\n /**\n * Subscribe to events with automatic tracking\n */\n async subscribe(filter?: SubscriptionFilter): Promise<Subscription> {\n const subscription = await this.#connection.subscribe(filter);\n this.#subscriptions.set(subscription.id, subscription);\n return subscription;\n }\n\n /**\n * Collect events matching filter for a duration\n */\n async collectEvents(\n filter: SubscriptionFilter,\n durationMs: number\n ): Promise<Event[]> {\n const events: Event[] = [];\n const subscription = await this.subscribe(filter);\n subscription.on('event', (event) => events.push(event));\n\n await new Promise((resolve) => setTimeout(resolve, durationMs));\n await subscription.unsubscribe();\n this.#subscriptions.delete(subscription.id);\n\n return events;\n }\n\n /**\n * Wait for a specific event type\n */\n async waitForEvent(\n eventType: EventType,\n timeoutMs: number = 5000\n ): Promise<Event> {\n const subscription = await this.subscribe({ eventTypes: [eventType] });\n\n try {\n return await new Promise<Event>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`Timeout waiting for event: ${eventType}`));\n }, timeoutMs);\n\n subscription.on('event', (event) => {\n clearTimeout(timeout);\n resolve(event);\n });\n });\n } finally {\n await subscription.unsubscribe();\n this.#subscriptions.delete(subscription.id);\n }\n }\n\n // ===========================================================================\n // Control\n // ===========================================================================\n\n /**\n * Stop an agent\n */\n async stopAgent(agentId: string, reason?: string): Promise<void> {\n await this.#connection.stopAgent(agentId, { reason });\n }\n\n /**\n * Inject context into an agent\n */\n async inject(\n agentId: string,\n content: unknown,\n delivery?: 'interrupt' | 'queue' | 'best-effort'\n ): Promise<void> {\n await this.#connection.inject(agentId, content, delivery);\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 } from '../stream';\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 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} 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 * 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 // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect and register with the MAP system\n */\n async connect(options?: {\n agentId?: AgentId;\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 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 * Disconnect from the MAP system\n */\n async disconnect(reason?: string): Promise<void> {\n if (!this.#connected) return;\n\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 await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\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 }\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 * Test Agent Helper\n *\n * Provides a convenient wrapper around AgentConnection for testing.\n * Automatically manages stream pairs and connection lifecycle.\n */\n\nimport { AgentConnection, type AgentConnectionOptions } from '../connection/agent';\nimport { createStreamPair } from '../stream';\nimport type { TestServer } from './server';\nimport type {\n Agent,\n AgentId,\n Scope,\n ScopeId,\n Message,\n Event,\n EventType,\n SubscriptionFilter,\n} from '../types';\nimport { Subscription } from '../subscription';\n\n/**\n * Options for TestAgent\n */\nexport interface TestAgentOptions extends AgentConnectionOptions {\n /** Auto-connect on creation */\n autoConnect?: boolean;\n /** Pre-assigned agent ID */\n agentId?: AgentId;\n}\n\n/**\n * Test agent for integration testing.\n *\n * Wraps AgentConnection with convenience methods and automatic\n * stream management for easier testing.\n */\nexport class TestAgent {\n readonly #connection: AgentConnection;\n readonly #receivedMessages: Message[] = [];\n #subscriptions: Map<string, Subscription> = new Map();\n\n private constructor(connection: AgentConnection) {\n this.#connection = connection;\n\n // Auto-track received messages\n connection.onMessage((msg) => {\n this.#receivedMessages.push(msg);\n });\n }\n\n /**\n * Create and connect a test agent\n */\n static async create(server: TestServer, options: TestAgentOptions = {}): Promise<TestAgent> {\n const [clientStream, serverStream] = createStreamPair();\n const connection = new AgentConnection(clientStream, options);\n server.acceptConnection(serverStream);\n\n const agent = new TestAgent(connection);\n\n if (options.autoConnect !== false) {\n await connection.connect({ agentId: options.agentId });\n }\n\n return agent;\n }\n\n /**\n * Get the underlying connection\n */\n get connection(): AgentConnection {\n return this.#connection;\n }\n\n /**\n * Whether the agent is connected\n */\n get isConnected(): boolean {\n return this.#connection.isConnected;\n }\n\n /**\n * Agent ID\n */\n get id(): AgentId | null {\n return this.#connection.agentId;\n }\n\n /**\n * Current state\n */\n get state(): string {\n return this.#connection.state;\n }\n\n /**\n * Session ID\n */\n get sessionId(): string | null {\n return this.#connection.sessionId;\n }\n\n /**\n * All messages received by this agent\n */\n get receivedMessages(): readonly Message[] {\n return this.#receivedMessages;\n }\n\n /**\n * Get the last received message\n */\n get lastMessage(): Message | undefined {\n return this.#receivedMessages[this.#receivedMessages.length - 1];\n }\n\n /**\n * Clear received messages\n */\n clearMessages(): void {\n this.#receivedMessages.length = 0;\n }\n\n /**\n * Connect to the server\n */\n async connect(agentId?: AgentId): Promise<Agent> {\n const result = await this.#connection.connect({ agentId });\n return result.agent;\n }\n\n /**\n * Disconnect from the server\n */\n async disconnect(reason?: string): Promise<void> {\n // Close all subscriptions\n for (const sub of this.#subscriptions.values()) {\n await sub.unsubscribe();\n }\n this.#subscriptions.clear();\n\n await this.#connection.disconnect(reason);\n }\n\n // ===========================================================================\n // State Management\n // ===========================================================================\n\n /**\n * Update state\n */\n async setState(state: 'idle' | 'busy' | 'suspended' | 'stopping' | 'stopped'): Promise<Agent> {\n return this.#connection.updateState(state);\n }\n\n /**\n * Mark as busy\n */\n async busy(): Promise<Agent> {\n return this.#connection.busy();\n }\n\n /**\n * Mark as idle\n */\n async idle(): Promise<Agent> {\n return this.#connection.idle();\n }\n\n /**\n * Mark as done\n */\n async done(exitCode?: number, exitReason?: string): Promise<void> {\n await this.#connection.done({ exitCode, exitReason });\n }\n\n /**\n * Update metadata\n */\n async setMetadata(metadata: Record<string, unknown>): Promise<Agent> {\n return this.#connection.updateMetadata(metadata);\n }\n\n // ===========================================================================\n // Child Agent Management\n // ===========================================================================\n\n /**\n * Spawn a child agent\n */\n async spawn(options: {\n name?: string;\n role?: string;\n agentId?: AgentId;\n } = {}): Promise<Agent> {\n const result = await this.#connection.spawn(options);\n return result.agent;\n }\n\n /**\n * Spawn and return a connected TestAgent for the child\n */\n async spawnTestAgent(\n server: TestServer,\n options: TestAgentOptions = {}\n ): Promise<TestAgent> {\n // Spawn the agent on the server\n await this.#connection.spawn({\n name: options.name,\n role: options.role,\n agentId: options.agentId,\n });\n\n // Create a new test agent that represents the spawned child\n const child = await TestAgent.create(server, {\n ...options,\n parent: this.id!,\n autoConnect: false,\n });\n\n return child;\n }\n\n // ===========================================================================\n // Scope Management\n // ===========================================================================\n\n /**\n * Create a scope\n */\n async createScope(name: string, options?: { description?: string }): Promise<Scope> {\n return this.#connection.createScope({ name, ...options });\n }\n\n /**\n * Join a scope\n */\n async joinScope(scopeId: ScopeId): Promise<{ scope: Scope; agent: Agent }> {\n return this.#connection.joinScope(scopeId);\n }\n\n /**\n * Leave a scope\n */\n async leaveScope(scopeId: ScopeId): Promise<{ scope: Scope; agent: Agent }> {\n return this.#connection.leaveScope(scopeId);\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send to another agent\n */\n async sendTo(agentId: AgentId, payload: unknown): Promise<string> {\n const result = await this.#connection.sendToAgent(agentId, payload);\n return result.messageId;\n }\n\n /**\n * Send to parent\n */\n async sendToParent(payload: unknown): Promise<string> {\n const result = await this.#connection.sendToParent(payload);\n return result.messageId;\n }\n\n /**\n * Send to children\n */\n async sendToChildren(payload: unknown): Promise<string> {\n const result = await this.#connection.sendToChildren(payload);\n return result.messageId;\n }\n\n /**\n * Send to siblings\n */\n async sendToSiblings(payload: unknown): Promise<string> {\n const result = await this.#connection.sendToSiblings(payload);\n return result.messageId;\n }\n\n /**\n * Send to scope\n */\n async sendToScope(scopeId: ScopeId, payload: unknown): Promise<string> {\n const result = await this.#connection.sendToScope(scopeId, payload);\n return result.messageId;\n }\n\n /**\n * Reply to a message\n */\n async reply(message: Message, payload: unknown): Promise<string> {\n const result = await this.#connection.reply(message, payload);\n return result.messageId;\n }\n\n /**\n * Wait for a message\n */\n async waitForMessage(timeoutMs: number = 5000): Promise<Message> {\n const startLen = this.#receivedMessages.length;\n\n return new Promise<Message>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('Timeout waiting for message'));\n }, timeoutMs);\n\n const checkInterval = setInterval(() => {\n if (this.#receivedMessages.length > startLen) {\n clearTimeout(timeout);\n clearInterval(checkInterval);\n resolve(this.#receivedMessages[this.#receivedMessages.length - 1]);\n }\n }, 10);\n });\n }\n\n // ===========================================================================\n // Subscriptions\n // ===========================================================================\n\n /**\n * Subscribe to events\n */\n async subscribe(filter?: SubscriptionFilter): Promise<Subscription> {\n const subscription = await this.#connection.subscribe(filter);\n this.#subscriptions.set(subscription.id, subscription);\n return subscription;\n }\n\n /**\n * Wait for a specific event\n */\n async waitForEvent(eventType: EventType, timeoutMs: number = 5000): Promise<Event> {\n const subscription = await this.subscribe({ eventTypes: [eventType] });\n\n try {\n return await new Promise<Event>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`Timeout waiting for event: ${eventType}`));\n }, timeoutMs);\n\n subscription.on('event', (event) => {\n clearTimeout(timeout);\n resolve(event);\n });\n });\n } finally {\n await subscription.unsubscribe();\n this.#subscriptions.delete(subscription.id);\n }\n }\n}\n"]}
|