@multi-agent-protocol/sdk 0.0.2 → 0.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/jsonrpc/index.ts","../src/errors/index.ts","../src/stream/index.ts","../src/subscription/index.ts","../src/connection/base.ts","../src/utils/ulid.ts","../src/utils/retry.ts","../src/utils/causal-buffer.ts","../src/connection/client.ts","../src/connection/agent.ts","../src/federation/envelope.ts","../src/federation/buffer.ts","../src/connection/gateway.ts","../src/schema/zod.gen.ts","../src/protocol/index.ts","../src/permissions/index.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 * JSON-RPC 2.0 utilities for MAP protocol\n */\n\nimport type { RequestId, MAPError } from '../types';\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = '2.0' as const;\n\n/**\n * Generic JSON-RPC request structure\n */\nexport interface JsonRpcRequest<TParams = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC notification structure (no id)\n */\nexport interface JsonRpcNotification<TParams = unknown> {\n jsonrpc: '2.0';\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC success response\n */\nexport interface JsonRpcSuccessResponse<TResult = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n result: TResult;\n}\n\n/**\n * Generic JSON-RPC error response\n */\nexport interface JsonRpcErrorResponse {\n jsonrpc: '2.0';\n id: RequestId;\n error: MAPError;\n}\n\n/**\n * Any JSON-RPC response\n */\nexport type JsonRpcResponse<TResult = unknown> =\n | JsonRpcSuccessResponse<TResult>\n | JsonRpcErrorResponse;\n\n/**\n * Any JSON-RPC message\n */\nexport type JsonRpcMessage =\n | JsonRpcRequest\n | JsonRpcNotification\n | JsonRpcResponse;\n\n/**\n * Check if a message is a request (has id and method)\n */\nexport function isRequest(message: unknown): message is JsonRpcRequest {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n 'method' in message\n );\n}\n\n/**\n * Check if a message is a notification (has method but no id)\n */\nexport function isNotification(message: unknown): message is JsonRpcNotification {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'method' in message &&\n !('id' in message)\n );\n}\n\n/**\n * Check if a message is a response (has id but no method)\n */\nexport function isResponse(message: unknown): message is JsonRpcResponse {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n !('method' in message)\n );\n}\n\n/**\n * Check if a response is an error response\n */\nexport function isErrorResponse(\n response: JsonRpcResponse\n): response is JsonRpcErrorResponse {\n return 'error' in response;\n}\n\n/**\n * Check if a response is a success response\n */\nexport function isSuccessResponse<T>(\n response: JsonRpcResponse<T>\n): response is JsonRpcSuccessResponse<T> {\n return 'result' in response;\n}\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest<TParams>(\n id: RequestId,\n method: string,\n params?: TParams\n): JsonRpcRequest<TParams> {\n const request: JsonRpcRequest<TParams> = {\n jsonrpc: '2.0',\n id,\n method,\n };\n if (params !== undefined) {\n request.params = params;\n }\n return request;\n}\n\n/**\n * Create a JSON-RPC notification\n */\nexport function createNotification<TParams>(\n method: string,\n params?: TParams\n): JsonRpcNotification<TParams> {\n const notification: JsonRpcNotification<TParams> = {\n jsonrpc: '2.0',\n method,\n };\n if (params !== undefined) {\n notification.params = params;\n }\n return notification;\n}\n\n/**\n * Create a JSON-RPC success response\n */\nexport function createSuccessResponse<TResult>(\n id: RequestId,\n result: TResult\n): JsonRpcSuccessResponse<TResult> {\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n}\n\n/**\n * Create a JSON-RPC error response\n */\nexport function createErrorResponse(\n id: RequestId,\n error: MAPError\n): JsonRpcErrorResponse {\n return {\n jsonrpc: '2.0',\n id,\n error,\n };\n}\n","/**\n * Error classes for MAP protocol\n */\n\nimport type { MAPError, MAPErrorData, ErrorCategory, RequestId } from '../types';\nimport {\n PROTOCOL_ERROR_CODES,\n AUTH_ERROR_CODES,\n ROUTING_ERROR_CODES,\n AGENT_ERROR_CODES,\n RESOURCE_ERROR_CODES,\n FEDERATION_ERROR_CODES,\n} from '../types';\nimport { createErrorResponse, type JsonRpcErrorResponse } from '../jsonrpc';\n\n/**\n * Error thrown when a MAP request fails.\n *\n * Extends Error with JSON-RPC error properties and provides\n * factory methods for common error types.\n */\nexport class MAPRequestError extends Error {\n readonly code: number;\n readonly data?: MAPErrorData;\n\n constructor(code: number, message: string, data?: MAPErrorData) {\n super(message);\n this.name = 'MAPRequestError';\n this.code = code;\n this.data = data;\n }\n\n /**\n * Convert to MAP error object\n */\n toError(): MAPError {\n const error: MAPError = {\n code: this.code,\n message: this.message,\n };\n if (this.data) {\n error.data = this.data;\n }\n return error;\n }\n\n /**\n * Convert to JSON-RPC error response\n */\n toResponse(id: RequestId): JsonRpcErrorResponse {\n return createErrorResponse(id, this.toError());\n }\n\n // ==========================================================================\n // Protocol Errors (-32xxx)\n // ==========================================================================\n\n static parseError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.PARSE_ERROR,\n details ?? 'Parse error',\n { category: 'protocol' }\n );\n }\n\n static invalidRequest(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_REQUEST,\n details ?? 'Invalid request',\n { category: 'protocol' }\n );\n }\n\n static methodNotFound(method: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.METHOD_NOT_FOUND,\n `Method not found: ${method}`,\n { category: 'protocol' }\n );\n }\n\n static invalidParams(details?: unknown): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_PARAMS,\n 'Invalid params',\n { category: 'protocol', details: details as Record<string, unknown> }\n );\n }\n\n static internalError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INTERNAL_ERROR,\n details ?? 'Internal error',\n { category: 'internal' }\n );\n }\n\n // ==========================================================================\n // Auth Errors (1xxx)\n // ==========================================================================\n\n static authRequired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_REQUIRED,\n 'Authentication required',\n { category: 'auth' }\n );\n }\n\n static authFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_FAILED,\n details ?? 'Authentication failed',\n { category: 'auth' }\n );\n }\n\n static tokenExpired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.TOKEN_EXPIRED,\n 'Token expired',\n { category: 'auth', retryable: true }\n );\n }\n\n static permissionDenied(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.PERMISSION_DENIED,\n required ? `Permission denied: ${required}` : 'Permission denied',\n { category: 'auth' }\n );\n }\n\n // ==========================================================================\n // Routing Errors (2xxx)\n // ==========================================================================\n\n static addressNotFound(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_NOT_FOUND,\n `Address not found: ${address}`,\n { category: 'routing' }\n );\n }\n\n static agentNotFound(agentId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.AGENT_NOT_FOUND,\n `Agent not found: ${agentId}`,\n { category: 'routing' }\n );\n }\n\n static scopeNotFound(scopeId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.SCOPE_NOT_FOUND,\n `Scope not found: ${scopeId}`,\n { category: 'routing' }\n );\n }\n\n static deliveryFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.DELIVERY_FAILED,\n details ?? 'Message delivery failed',\n { category: 'routing', retryable: true }\n );\n }\n\n static addressAmbiguous(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_AMBIGUOUS,\n `Address is ambiguous: ${address}`,\n { category: 'routing' }\n );\n }\n\n // ==========================================================================\n // Agent Errors (3xxx)\n // ==========================================================================\n\n static agentExists(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.AGENT_EXISTS,\n `Agent already exists: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static stateInvalid(currentState: string, requestedAction: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.STATE_INVALID,\n `Cannot ${requestedAction} agent in state: ${currentState}`,\n { category: 'agent' }\n );\n }\n\n static agentNotResponding(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.NOT_RESPONDING,\n `Agent not responding: ${agentId}`,\n { category: 'agent', retryable: true }\n );\n }\n\n static agentTerminated(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.TERMINATED,\n `Agent terminated: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static spawnFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.SPAWN_FAILED,\n details ?? 'Failed to spawn agent',\n { category: 'agent' }\n );\n }\n\n // ==========================================================================\n // Resource Errors (4xxx)\n // ==========================================================================\n\n static resourceExhausted(resource?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.EXHAUSTED,\n resource ? `Resource exhausted: ${resource}` : 'Resource exhausted',\n { category: 'resource', retryable: true }\n );\n }\n\n static rateLimited(retryAfterMs?: number): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.RATE_LIMITED,\n 'Rate limited',\n { category: 'resource', retryable: true, retryAfterMs }\n );\n }\n\n static quotaExceeded(quota?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.QUOTA_EXCEEDED,\n quota ? `Quota exceeded: ${quota}` : 'Quota exceeded',\n { category: 'resource' }\n );\n }\n\n // ==========================================================================\n // Federation Errors (5xxx)\n // ==========================================================================\n\n static federationUnavailable(systemId?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_UNAVAILABLE,\n systemId ? `Federation unavailable: ${systemId}` : 'Federation unavailable',\n { category: 'federation', retryable: true }\n );\n }\n\n static federationSystemNotFound(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_SYSTEM_NOT_FOUND,\n `System not found: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationAuthFailed(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_AUTH_FAILED,\n `Federation authentication failed: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationRouteRejected(systemId: string, reason?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n reason ? `Route rejected by ${systemId}: ${reason}` : `Route rejected by ${systemId}`,\n { category: 'federation' }\n );\n }\n\n // ==========================================================================\n // Utility\n // ==========================================================================\n\n /**\n * Create from a MAP error object\n */\n static fromError(error: MAPError): MAPRequestError {\n return new MAPRequestError(error.code, error.message, error.data);\n }\n\n /**\n * Check if this error is retryable\n */\n get retryable(): boolean {\n return this.data?.retryable ?? false;\n }\n\n /**\n * Get retry delay in milliseconds, if specified\n */\n get retryAfterMs(): number | undefined {\n return this.data?.retryAfterMs;\n }\n\n /**\n * Get error category\n */\n get category(): ErrorCategory | undefined {\n return this.data?.category;\n }\n}\n\n/**\n * Error thrown when a connection is closed unexpectedly\n */\nexport class MAPConnectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MAPConnectionError';\n }\n\n static closed(): MAPConnectionError {\n return new MAPConnectionError('Connection closed');\n }\n\n static timeout(): MAPConnectionError {\n return new MAPConnectionError('Connection timeout');\n }\n}\n\n/**\n * Error thrown when an operation times out\n */\nexport class MAPTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(operation: string, timeoutMs: number) {\n super(`Operation timed out after ${timeoutMs}ms: ${operation}`);\n this.name = 'MAPTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n","/**\n * Stream utilities for MAP protocol transport\n *\n * Provides helpers for converting byte streams to/from MAP message streams.\n */\n\nimport type { MAPRequest, MAPResponse, MAPNotification } from '../types';\n\n/** Any MAP message type */\nexport type AnyMessage = MAPRequest | MAPResponse | MAPNotification | Record<string, unknown>;\n\n/**\n * Bidirectional message stream interface.\n * This is the transport abstraction that connection classes use.\n */\nexport interface Stream {\n writable: WritableStream<AnyMessage>;\n readable: ReadableStream<AnyMessage>;\n}\n\n/**\n * Converts raw byte streams to newline-delimited JSON message streams.\n *\n * This is the primary transport adapter - works with any byte stream\n * (stdio, TCP socket, etc.)\n *\n * @param readable - Input byte stream\n * @param writable - Output byte stream\n * @returns Stream interface for MAP messages\n */\nexport function ndJsonStream(\n readable: ReadableStream<Uint8Array>,\n writable: WritableStream<Uint8Array>\n): Stream {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n\n // Buffer for incomplete lines\n let buffer = '';\n\n const messageReadable = new ReadableStream<AnyMessage>({\n async start(controller) {\n const reader = readable.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Process any remaining buffer content\n if (buffer.trim()) {\n try {\n const message = JSON.parse(buffer.trim());\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse final message:', buffer);\n }\n }\n controller.close();\n break;\n }\n\n // Decode bytes and add to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n try {\n const message = JSON.parse(trimmed);\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse message:', trimmed);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n\n const messageWritable = new WritableStream<AnyMessage>({\n async write(message) {\n const writer = writable.getWriter();\n try {\n const json = JSON.stringify(message) + '\\n';\n await writer.write(encoder.encode(json));\n } finally {\n writer.releaseLock();\n }\n },\n async close() {\n await writable.close();\n },\n abort(reason) {\n writable.abort(reason);\n },\n });\n\n return {\n readable: messageReadable,\n writable: messageWritable,\n };\n}\n\n/**\n * Wraps a WebSocket in a Stream interface.\n *\n * @param ws - WebSocket instance (must be open or will wait for open)\n * @returns Stream interface for MAP messages\n */\nexport function websocketStream(ws: WebSocket): Stream {\n // Queue for messages received before reader is ready\n const messageQueue: AnyMessage[] = [];\n let messageResolver: ((value: IteratorResult<AnyMessage>) => void) | null = null;\n let closed = false;\n let closeError: Error | null = null;\n\n // Handle incoming messages\n ws.addEventListener('message', (event) => {\n try {\n const message = JSON.parse(event.data as string);\n if (messageResolver) {\n messageResolver({ value: message, done: false });\n messageResolver = null;\n } else {\n messageQueue.push(message);\n }\n } catch {\n console.error('MAP: Failed to parse WebSocket message:', event.data);\n }\n });\n\n ws.addEventListener('close', () => {\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n ws.addEventListener('error', () => {\n closeError = new Error('WebSocket error');\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n const readable = new ReadableStream<AnyMessage>({\n async pull(controller) {\n if (messageQueue.length > 0) {\n controller.enqueue(messageQueue.shift()!);\n return;\n }\n\n if (closed) {\n if (closeError) {\n controller.error(closeError);\n } else {\n controller.close();\n }\n return;\n }\n\n // Wait for next message\n await new Promise<IteratorResult<AnyMessage>>((resolve) => {\n messageResolver = resolve;\n }).then((result) => {\n if (result.done) {\n controller.close();\n } else {\n controller.enqueue(result.value);\n }\n });\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n if (ws.readyState === WebSocket.CONNECTING) {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.removeEventListener('error', onError);\n resolve();\n };\n const onError = () => {\n ws.removeEventListener('open', onOpen);\n reject(new Error('WebSocket failed to connect'));\n };\n ws.addEventListener('open', onOpen, { once: true });\n ws.addEventListener('error', onError, { once: true });\n });\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not open');\n }\n\n ws.send(JSON.stringify(message));\n },\n close() {\n ws.close();\n },\n abort() {\n ws.close();\n },\n });\n\n return { readable, writable };\n}\n\n/**\n * 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 * Subscription class for MAP event streams\n *\n * Provides both AsyncIterable and event emitter patterns for consuming events.\n * Includes automatic deduplication based on eventId when provided by the server.\n */\n\nimport type {\n SubscriptionId,\n Event,\n SubscriptionFilter,\n SubscriptionState,\n SubscriptionAckParams,\n OverflowInfo,\n OverflowHandler,\n EventNotificationParams,\n} from '../types';\n\n/**\n * Event handler callback type\n */\nexport type EventHandler = (event: Event) => void;\n\n/**\n * Subscription options\n */\nexport interface SubscriptionOptions {\n /** Filter for events */\n filter?: SubscriptionFilter;\n /** Buffer size for events before backpressure */\n bufferSize?: number;\n /**\n * Maximum number of eventIds to track for deduplication.\n * Older eventIds are evicted when this limit is reached.\n * Default: 10000\n */\n maxSeenEventIds?: number;\n}\n\n/**\n * Subscription to MAP events.\n *\n * Supports both async iteration and event handler patterns:\n *\n * ```typescript\n * // Async iteration\n * for await (const event of subscription) {\n * console.log(event);\n * }\n *\n * // Event handler\n * subscription.on('event', (event) => console.log(event));\n * ```\n *\n * ## Deduplication\n *\n * When the server provides `eventId` in the notification params,\n * the subscription automatically deduplicates events. This handles\n * scenarios like:\n * - Network retries delivering the same event twice\n * - Reconnection replay overlapping with already-received events\n *\n * If `eventId` is not provided, deduplication is skipped.\n *\n * ## Pause/Resume\n *\n * You can pause event delivery from the async iterator while still\n * buffering events:\n *\n * ```typescript\n * subscription.pause();\n * // Events are buffered but not yielded\n * subscription.resume();\n * // Buffered events are now yielded\n * ```\n *\n * ## Overflow Handling\n *\n * When the buffer is full, events are dropped and overflow handlers\n * are notified:\n *\n * ```typescript\n * subscription.on('overflow', (info) => {\n * console.log(`Dropped ${info.eventsDropped} events`);\n * });\n * ```\n */\nexport class Subscription implements AsyncIterable<Event> {\n readonly id: SubscriptionId;\n readonly filter?: SubscriptionFilter;\n\n readonly #eventHandlers: Set<EventHandler> = new Set();\n readonly #overflowHandlers: Set<OverflowHandler> = new Set();\n readonly #eventQueue: Event[] = [];\n readonly #bufferSize: number;\n readonly #unsubscribe: () => Promise<void>;\n readonly #sendAck?: (params: SubscriptionAckParams) => void;\n\n // Deduplication tracking\n readonly #seenEventIds: Set<string> = new Set();\n readonly #seenEventIdOrder: string[] = []; // For LRU eviction\n readonly #maxSeenEventIds: number;\n\n #eventResolver: ((event: Event | null) => void) | null = null;\n #pauseResolver: (() => void) | null = null;\n #state: SubscriptionState = 'active';\n #lastSequenceNumber = -1;\n #lastEventId: string | undefined;\n #lastTimestamp: number | undefined;\n\n // Overflow tracking\n #totalDropped = 0;\n #oldestDroppedId?: string;\n #newestDroppedId?: string;\n\n // Ack support\n #serverSupportsAck = false;\n\n constructor(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options: SubscriptionOptions = {},\n sendAck?: (params: SubscriptionAckParams) => void\n ) {\n this.id = id;\n this.filter = options.filter;\n this.#bufferSize = options.bufferSize ?? 1000;\n this.#maxSeenEventIds = options.maxSeenEventIds ?? 10000;\n this.#unsubscribe = unsubscribe;\n this.#sendAck = sendAck;\n }\n\n /**\n * Current subscription state\n */\n get state(): SubscriptionState {\n return this.#state;\n }\n\n /**\n * Whether the subscription is closed\n */\n get isClosed(): boolean {\n return this.#state === 'closed';\n }\n\n /**\n * Whether the subscription is paused\n */\n get isPaused(): boolean {\n return this.#state === 'paused';\n }\n\n /**\n * Last received sequence number (for ordering verification)\n */\n get lastSequenceNumber(): number {\n return this.#lastSequenceNumber;\n }\n\n /**\n * Last received eventId (for replay positioning)\n */\n get lastEventId(): string | undefined {\n return this.#lastEventId;\n }\n\n /**\n * Last received server timestamp\n */\n get lastTimestamp(): number | undefined {\n return this.#lastTimestamp;\n }\n\n /**\n * Number of events currently buffered\n */\n get bufferedCount(): number {\n return this.#eventQueue.length;\n }\n\n /**\n * Number of eventIds being tracked for deduplication\n */\n get trackedEventIdCount(): number {\n return this.#seenEventIds.size;\n }\n\n /**\n * Total number of events dropped due to buffer overflow\n */\n get totalDropped(): number {\n return this.#totalDropped;\n }\n\n /**\n * Whether the server supports acknowledgments\n */\n get supportsAck(): boolean {\n return this.#serverSupportsAck && !!this.#sendAck;\n }\n\n /**\n * Pause event delivery from the async iterator.\n * Events are still buffered but not yielded until resume() is called.\n * Event handlers (on('event', ...)) still receive events while paused.\n */\n pause(): void {\n if (this.#state === 'closed') return;\n this.#state = 'paused';\n }\n\n /**\n * Resume event delivery from the async iterator.\n * Any events buffered during pause will be yielded.\n */\n resume(): void {\n if (this.#state === 'closed') return;\n this.#state = 'active';\n\n // Wake up paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // If iterator is waiting for events and we have buffered events, deliver one\n if (this.#eventResolver && this.#eventQueue.length > 0) {\n const event = this.#eventQueue.shift()!;\n this.#eventResolver(event);\n this.#eventResolver = null;\n }\n }\n\n /**\n * Acknowledge events up to a sequence number.\n * No-op if server doesn't support acks.\n *\n * @param upToSequence - Acknowledge all events up to and including this sequence.\n * If omitted, acknowledges up to lastSequenceNumber.\n */\n ack(upToSequence?: number): void {\n if (!this.supportsAck) return;\n\n const seq = upToSequence ?? this.#lastSequenceNumber;\n if (seq < 0) return; // No events received yet\n\n this.#sendAck!({\n subscriptionId: this.id,\n upToSequence: seq,\n });\n }\n\n /**\n * Register an event or overflow handler\n */\n on(type: 'event', handler: EventHandler): this;\n on(type: 'overflow', handler: OverflowHandler): this;\n on(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.add(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.add(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Remove an event or overflow handler\n */\n off(type: 'event', handler: EventHandler): this;\n off(type: 'overflow', handler: OverflowHandler): this;\n off(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.delete(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.delete(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Register a one-time event handler\n */\n once(type: 'event', handler: EventHandler): this {\n if (type === 'event') {\n const wrapper: EventHandler = (event) => {\n this.off('event', wrapper);\n handler(event);\n };\n this.on('event', wrapper);\n }\n return this;\n }\n\n /**\n * Unsubscribe and close the subscription\n */\n async unsubscribe(): Promise<void> {\n if (this.#state === 'closed') return;\n\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // Clear handlers and tracking\n this.#eventHandlers.clear();\n this.#overflowHandlers.clear();\n this.#seenEventIds.clear();\n this.#seenEventIdOrder.length = 0;\n\n // Call the unsubscribe callback\n await this.#unsubscribe();\n }\n\n /**\n * Set whether server supports acknowledgments.\n * Called by connection after capability negotiation.\n * @internal\n */\n _setServerSupportsAck(supports: boolean): void {\n this.#serverSupportsAck = supports;\n }\n\n /**\n * Push an event to the subscription (called by connection)\n * @internal\n */\n _pushEvent(params: EventNotificationParams): void {\n if (this.#state === 'closed') return;\n\n const { sequenceNumber, eventId, timestamp, event } = params;\n\n // Deduplicate by eventId if provided\n if (eventId) {\n if (this.#seenEventIds.has(eventId)) {\n // Duplicate event, skip silently\n return;\n }\n\n // Track this eventId\n this.#seenEventIds.add(eventId);\n this.#seenEventIdOrder.push(eventId);\n\n // LRU eviction if we've exceeded the limit\n while (this.#seenEventIds.size > this.#maxSeenEventIds) {\n const oldestId = this.#seenEventIdOrder.shift();\n if (oldestId) {\n this.#seenEventIds.delete(oldestId);\n }\n }\n\n // Track last eventId for replay positioning\n this.#lastEventId = eventId;\n }\n\n // Track last timestamp\n if (timestamp !== undefined) {\n this.#lastTimestamp = timestamp;\n }\n\n // Check for sequence gaps (out of order or missed events)\n if (this.#lastSequenceNumber >= 0 && sequenceNumber !== this.#lastSequenceNumber + 1) {\n console.warn(\n `MAP: Subscription ${this.id} sequence gap: expected ${this.#lastSequenceNumber + 1}, got ${sequenceNumber}`\n );\n }\n this.#lastSequenceNumber = sequenceNumber;\n\n // Notify event handlers (always, even when paused)\n for (const handler of this.#eventHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Event handler error:', error);\n }\n }\n\n // If there's a waiting iterator and not paused, resolve it directly\n if (this.#eventResolver && this.#state === 'active') {\n this.#eventResolver(event);\n this.#eventResolver = null;\n return;\n }\n\n // Otherwise buffer the event\n if (this.#eventQueue.length < this.#bufferSize) {\n this.#eventQueue.push(event);\n } else {\n // Buffer overflow - track and notify\n this.#totalDropped++;\n\n // Track oldest/newest dropped event IDs\n if (eventId) {\n if (this.#oldestDroppedId === undefined) {\n this.#oldestDroppedId = eventId;\n }\n this.#newestDroppedId = eventId;\n }\n\n // Notify overflow handlers\n const info: OverflowInfo = {\n eventsDropped: 1,\n oldestDroppedId: this.#oldestDroppedId,\n newestDroppedId: this.#newestDroppedId,\n timestamp: Date.now(),\n totalDropped: this.#totalDropped,\n };\n\n for (const handler of this.#overflowHandlers) {\n try {\n handler(info);\n } catch (error) {\n console.error('MAP: Overflow handler error:', error);\n }\n }\n\n console.warn(`MAP: Subscription ${this.id} buffer full, dropping event`);\n }\n }\n\n /**\n * Mark the subscription as closed (called by connection)\n * @internal\n */\n _close(): void {\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n }\n\n /**\n * Async iterator implementation\n */\n async *[Symbol.asyncIterator](): AsyncIterator<Event> {\n while (!this.isClosed) {\n // Wait while paused\n while (this.isPaused) {\n await new Promise<void>((resolve) => {\n this.#pauseResolver = resolve;\n });\n // Check if closed during pause - need to break out of both loops\n if (this.isClosed) {\n // Drain remaining buffered events before returning\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n return;\n }\n }\n\n // Return buffered events first\n if (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n continue;\n }\n\n // Wait for next event\n const event = await new Promise<Event | null>((resolve) => {\n this.#eventResolver = resolve;\n });\n\n if (event === null) {\n // Subscription closed\n break;\n }\n\n yield event;\n }\n\n // Drain remaining buffered events\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n }\n}\n\n/**\n * Create a subscription instance\n * @internal\n */\nexport function createSubscription(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options?: SubscriptionOptions,\n sendAck?: (params: SubscriptionAckParams) => void\n): Subscription {\n return new Subscription(id, unsubscribe, options, sendAck);\n}\n","/**\n * Base connection class for MAP protocol\n *\n * Handles JSON-RPC message correlation, request/response matching,\n * and connection lifecycle management.\n */\n\nimport type { Stream, AnyMessage } from '../stream';\nimport type { RequestId, MAPError } from '../types';\nimport {\n isRequest,\n isNotification,\n isResponse,\n isErrorResponse,\n createRequest,\n createNotification,\n createSuccessResponse,\n createErrorResponse,\n type JsonRpcRequest,\n type JsonRpcNotification,\n type JsonRpcResponse,\n} from '../jsonrpc';\nimport { MAPRequestError, MAPConnectionError, MAPTimeoutError } from '../errors';\n\n/**\n * Pending response tracker\n */\ninterface PendingResponse<T = unknown> {\n resolve: (result: T) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Handler for incoming requests\n */\nexport type RequestHandler = (\n method: string,\n params: unknown\n) => Promise<unknown>;\n\n/**\n * Handler for incoming notifications\n */\nexport type NotificationHandler = (\n method: string,\n params: unknown\n) => Promise<void>;\n\n/**\n * Connection state for tracking lifecycle\n */\nexport type ConnectionState =\n | 'initial'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'closed';\n\n/**\n * Handler for connection state changes\n */\nexport type StateChangeHandler = (\n newState: ConnectionState,\n oldState: ConnectionState\n) => void;\n\n/**\n * Options for base connection\n */\nexport interface BaseConnectionOptions {\n /** Default timeout for requests in milliseconds */\n defaultTimeout?: number;\n}\n\n/**\n * Base connection class providing JSON-RPC message handling.\n *\n * This class is used internally by the role-specific connection classes\n * (ClientConnection, AgentConnection, etc.)\n */\nexport class BaseConnection {\n #stream: Stream;\n readonly #pendingResponses: Map<RequestId, PendingResponse> = new Map();\n readonly #abortController: AbortController = new AbortController();\n readonly #closedPromise: Promise<void>;\n readonly #defaultTimeout: number;\n readonly #stateChangeHandlers: Set<StateChangeHandler> = new Set();\n\n #nextRequestId: number = 1;\n #writeQueue: Promise<void> = Promise.resolve();\n #requestHandler: RequestHandler | null = null;\n #notificationHandler: NotificationHandler | null = null;\n #closed = false;\n #closeResolver!: () => void;\n #state: ConnectionState = 'initial';\n\n constructor(stream: Stream, options: BaseConnectionOptions = {}) {\n this.#stream = stream;\n this.#defaultTimeout = options.defaultTimeout ?? 30000;\n\n // Create closed promise\n this.#closedPromise = new Promise((resolve) => {\n this.#closeResolver = resolve;\n });\n\n // Start receiving messages\n void this.#startReceiving();\n }\n\n /**\n * AbortSignal that triggers when the connection closes.\n * Useful for cancelling operations tied to this connection.\n */\n get signal(): AbortSignal {\n return this.#abortController.signal;\n }\n\n /**\n * Promise that resolves when the connection is closed.\n */\n get closed(): Promise<void> {\n return this.#closedPromise;\n }\n\n /**\n * Whether the connection is closed\n */\n get isClosed(): boolean {\n return this.#closed;\n }\n\n /**\n * Set the handler for incoming requests\n */\n setRequestHandler(handler: RequestHandler): void {\n this.#requestHandler = handler;\n }\n\n /**\n * Set the handler for incoming notifications\n */\n setNotificationHandler(handler: NotificationHandler): void {\n this.#notificationHandler = handler;\n }\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#state;\n }\n\n /**\n * Register a handler for state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(handler: StateChangeHandler): () => void {\n this.#stateChangeHandlers.add(handler);\n return () => this.#stateChangeHandlers.delete(handler);\n }\n\n /**\n * Transition to a new state and notify handlers.\n * @internal\n */\n _transitionTo(newState: ConnectionState): void {\n if (this.#state === newState) return;\n\n const oldState = this.#state;\n this.#state = newState;\n\n for (const handler of this.#stateChangeHandlers) {\n try {\n handler(newState, oldState);\n } catch (error) {\n console.error('MAP: State change handler error:', error);\n }\n }\n }\n\n /**\n * Reconnect with a new stream.\n *\n * This method is used by role-specific connections to replace the\n * underlying transport after a disconnect.\n *\n * @param newStream - The new stream to use\n * @throws If the connection is permanently closed\n */\n async reconnect(newStream: Stream): Promise<void> {\n if (this.#state === 'closed') {\n throw new Error('Cannot reconnect a permanently closed connection');\n }\n\n // Replace the stream\n this.#stream = newStream;\n this.#closed = false;\n\n // Reset the write queue\n this.#writeQueue = Promise.resolve();\n\n // Start receiving on the new stream\n void this.#startReceiving();\n\n this._transitionTo('connected');\n }\n\n /**\n * Send a request and wait for response\n */\n async sendRequest<TParams, TResult>(\n method: string,\n params?: TParams,\n options?: { timeout?: number }\n ): Promise<TResult> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const id = this.#nextRequestId++;\n const request = createRequest(id, method, params);\n\n const responsePromise = new Promise<TResult>((resolve, reject) => {\n const pending: PendingResponse<TResult> = { resolve, reject };\n\n // Set up timeout\n const timeout = options?.timeout ?? this.#defaultTimeout;\n if (timeout > 0) {\n pending.timeoutId = setTimeout(() => {\n this.#pendingResponses.delete(id);\n reject(new MAPTimeoutError(method, timeout));\n }, timeout);\n }\n\n this.#pendingResponses.set(id, pending as PendingResponse);\n });\n\n await this.#sendMessage(request as AnyMessage);\n\n return responsePromise;\n }\n\n /**\n * Send a notification (no response expected)\n */\n async sendNotification<TParams>(\n method: string,\n params?: TParams\n ): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const notification = createNotification(method, params);\n await this.#sendMessage(notification as AnyMessage);\n }\n\n /**\n * Send a response to a request\n */\n async sendResponse<TResult>(id: RequestId, result: TResult): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createSuccessResponse(id, result);\n await this.#sendMessage(response);\n }\n\n /**\n * Send an error response to a request\n */\n async sendErrorResponse(id: RequestId, error: MAPError): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createErrorResponse(id, error);\n await this.#sendMessage(response);\n }\n\n /**\n * Close the connection\n */\n async close(): Promise<void> {\n if (this.#closed) return;\n\n this.#closed = true;\n this._transitionTo('closed');\n this.#abortController.abort();\n\n // Reject all pending responses\n for (const [, pending] of this.#pendingResponses) {\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n pending.reject(MAPConnectionError.closed());\n }\n this.#pendingResponses.clear();\n\n // Close the stream\n try {\n const writer = this.#stream.writable.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Ignore close errors\n }\n\n this.#closeResolver();\n }\n\n /**\n * Start receiving messages from the stream\n */\n async #startReceiving(): Promise<void> {\n const reader = this.#stream.readable.getReader();\n\n try {\n while (!this.#closed) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n await this.#handleMessage(value);\n }\n } catch (error) {\n if (!this.#closed) {\n console.error('MAP: Error receiving message:', error);\n }\n } finally {\n reader.releaseLock();\n await this.close();\n }\n }\n\n /**\n * Handle an incoming message\n */\n async #handleMessage(message: AnyMessage): Promise<void> {\n try {\n if (isRequest(message)) {\n await this.#handleRequest(message);\n } else if (isNotification(message)) {\n await this.#handleNotification(message);\n } else if (isResponse(message)) {\n this.#handleResponse(message);\n } else {\n console.error('MAP: Unknown message type:', message);\n }\n } catch (error) {\n console.error('MAP: Error handling message:', error);\n }\n }\n\n /**\n * Handle an incoming request\n */\n async #handleRequest(request: JsonRpcRequest): Promise<void> {\n const { id, method, params } = request;\n\n if (!this.#requestHandler) {\n await this.sendErrorResponse(\n id,\n MAPRequestError.methodNotFound(method).toError()\n );\n return;\n }\n\n try {\n const result = await this.#requestHandler(method, params);\n await this.sendResponse(id, result ?? null);\n } catch (error) {\n if (error instanceof MAPRequestError) {\n await this.sendErrorResponse(id, error.toError());\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error';\n await this.sendErrorResponse(\n id,\n MAPRequestError.internalError(message).toError()\n );\n }\n }\n }\n\n /**\n * Handle an incoming notification\n */\n async #handleNotification(notification: JsonRpcNotification): Promise<void> {\n const { method, params } = notification;\n\n if (!this.#notificationHandler) {\n // Notifications are fire-and-forget, so just log\n console.warn('MAP: No notification handler for:', method);\n return;\n }\n\n try {\n await this.#notificationHandler(method, params);\n } catch (error) {\n console.error('MAP: Error handling notification:', method, error);\n }\n }\n\n /**\n * Handle an incoming response\n */\n #handleResponse(response: JsonRpcResponse): void {\n const { id } = response;\n const pending = this.#pendingResponses.get(id);\n\n if (!pending) {\n console.warn('MAP: Received response for unknown request:', id);\n return;\n }\n\n this.#pendingResponses.delete(id);\n\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n if (isErrorResponse(response)) {\n pending.reject(MAPRequestError.fromError(response.error));\n } else {\n pending.resolve(response.result);\n }\n }\n\n /**\n * Send a message through the stream with write queue serialization\n */\n async #sendMessage(message: AnyMessage): Promise<void> {\n this.#writeQueue = this.#writeQueue\n .then(async () => {\n if (this.#closed) return;\n\n const writer = this.#stream.writable.getWriter();\n try {\n await writer.write(message);\n } finally {\n writer.releaseLock();\n }\n })\n .catch((error) => {\n console.error('MAP: Write error:', error);\n });\n\n return this.#writeQueue;\n }\n}\n","/**\n * ULID utilities for MAP event IDs\n *\n * ULIDs (Universally Unique Lexicographically Sortable Identifiers) are:\n * - 26 characters, Crockford Base32 encoded\n * - Time-sortable (first 48 bits = millisecond timestamp)\n * - Lexicographically sortable (string comparison = chronological order)\n *\n * Format: TTTTTTTTTTRRRRRRRRRRRRRRR\n * |---------|-------------|\n * Timestamp Randomness\n * (10 chars) (16 chars)\n *\n * @example\n * ```typescript\n * import { ulid, ulidTimestamp, compareUlid } from './utils/ulid';\n *\n * const id = ulid(); // \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n * const ts = ulidTimestamp(id); // 1706123456789\n * ```\n */\n\n// Re-export from ulid package\nexport { ulid, monotonicFactory } from 'ulid';\n\n// Crockford Base32 alphabet used by ULID\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\nconst ENCODING_LEN = ENCODING.length; // 32\n\n/**\n * Extract the timestamp from a ULID.\n *\n * @param id - The ULID string\n * @returns Unix timestamp in milliseconds\n *\n * @example\n * ```typescript\n * const id = ulid();\n * const timestamp = ulidTimestamp(id);\n * console.log(new Date(timestamp));\n * ```\n */\nexport function ulidTimestamp(id: string): number {\n if (id.length !== 26) {\n throw new Error(`Invalid ULID: expected 26 characters, got ${id.length}`);\n }\n\n // Decode first 10 characters (timestamp portion)\n let time = 0;\n for (let i = 0; i < 10; i++) {\n const char = id[i].toUpperCase();\n const idx = ENCODING.indexOf(char);\n if (idx === -1) {\n throw new Error(`Invalid ULID character: ${char}`);\n }\n time = time * ENCODING_LEN + idx;\n }\n\n return time;\n}\n\n/**\n * Compare two ULIDs lexicographically.\n *\n * Since ULIDs are designed to be lexicographically sortable,\n * this comparison also gives chronological ordering.\n *\n * @param a - First ULID\n * @param b - Second ULID\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```typescript\n * const ids = [ulid(), ulid(), ulid()];\n * ids.sort(compareUlid); // Chronological order\n * ```\n */\nexport function compareUlid(a: string, b: string): number {\n return a.localeCompare(b);\n}\n\n/**\n * Check if a string is a valid ULID format.\n *\n * @param id - String to check\n * @returns True if valid ULID format\n */\nexport function isValidUlid(id: string): boolean {\n if (typeof id !== 'string' || id.length !== 26) {\n return false;\n }\n\n for (let i = 0; i < 26; i++) {\n if (ENCODING.indexOf(id[i].toUpperCase()) === -1) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Retry utilities with exponential backoff\n *\n * Provides configurable retry logic for handling transient failures\n * in network operations like reconnection.\n */\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryPolicy {\n /** Maximum number of retry attempts (default: 10) */\n maxRetries: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Add randomness to delay to prevent thundering herd (default: true) */\n jitter: boolean;\n /** Custom function to determine if an error is retryable */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Default retry policy with sensible defaults for network operations\n */\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 10,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitter: true,\n};\n\n/**\n * State passed to retry callbacks\n */\nexport interface RetryState {\n /** Current attempt number (1-indexed) */\n attempt: number;\n /** Delay before next retry in milliseconds */\n nextDelayMs: number;\n /** The error that caused this retry */\n lastError?: Error;\n}\n\n/**\n * Callbacks for monitoring retry progress\n */\nexport interface RetryCallbacks<T> {\n /** Called before each retry attempt */\n onRetry?: (state: RetryState) => void;\n /** Called on successful completion */\n onSuccess?: (result: T, attempts: number) => void;\n /** Called when all retries are exhausted */\n onFailure?: (error: Error, attempts: number) => void;\n}\n\n/**\n * Calculate delay for a retry attempt using exponential backoff.\n *\n * Formula: min(baseDelay * 2^(attempt-1), maxDelay) * jitter\n *\n * @param attempt - Current attempt number (1-indexed)\n * @param policy - Retry policy configuration\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * // With baseDelay=1000, maxDelay=30000:\n * // Attempt 1: 1000ms\n * // Attempt 2: 2000ms\n * // Attempt 3: 4000ms\n * // Attempt 4: 8000ms\n * // Attempt 5: 16000ms\n * // Attempt 6+: 30000ms (capped)\n * ```\n */\nexport function calculateDelay(attempt: number, policy: RetryPolicy): number {\n // Exponential backoff: baseDelay * 2^(attempt-1)\n let delay = Math.min(\n policy.baseDelayMs * Math.pow(2, attempt - 1),\n policy.maxDelayMs\n );\n\n // Add jitter: multiply by random factor between 0.5 and 1.5\n if (policy.jitter) {\n delay = delay * (0.5 + Math.random());\n }\n\n return Math.floor(delay);\n}\n\n/**\n * Execute an async operation with retry logic.\n *\n * Retries the operation on failure using exponential backoff until\n * either it succeeds or the maximum retries are exhausted.\n *\n * @param operation - Async function to execute\n * @param policy - Retry policy (defaults to DEFAULT_RETRY_POLICY)\n * @param callbacks - Optional callbacks for monitoring progress\n * @returns The result of the successful operation\n * @throws The last error if all retries are exhausted\n *\n * @example\n * ```typescript\n * const result = await withRetry(\n * () => fetch('https://api.example.com/data'),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true },\n * {\n * onRetry: ({ attempt, nextDelayMs }) => {\n * console.log(`Retry ${attempt}, waiting ${nextDelayMs}ms`);\n * },\n * }\n * );\n * ```\n */\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY,\n callbacks?: RetryCallbacks<T>\n): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= policy.maxRetries + 1; attempt++) {\n try {\n const result = await operation();\n callbacks?.onSuccess?.(result, attempt);\n return result;\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n const isRetryable = policy.isRetryable?.(lastError) ?? true;\n const hasMoreAttempts = attempt <= policy.maxRetries;\n\n if (!isRetryable || !hasMoreAttempts) {\n break;\n }\n\n // Calculate delay and wait\n const delay = calculateDelay(attempt, policy);\n\n callbacks?.onRetry?.({\n attempt,\n nextDelayMs: delay,\n lastError,\n });\n\n await sleep(delay);\n }\n }\n\n callbacks?.onFailure?.(lastError!, policy.maxRetries + 1);\n throw lastError;\n}\n\n/**\n * Create a retryable wrapper around an async function.\n *\n * Returns a new function with the same signature that automatically\n * retries on failure according to the policy.\n *\n * @param fn - Async function to wrap\n * @param policy - Retry policy\n * @returns Wrapped function with retry behavior\n *\n * @example\n * ```typescript\n * const fetchWithRetry = retryable(\n * async (url: string) => fetch(url),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true }\n * );\n *\n * const response = await fetchWithRetry('https://api.example.com');\n * ```\n */\nexport function retryable<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY\n): (...args: TArgs) => Promise<TResult> {\n return (...args: TArgs) => withRetry(() => fn(...args), policy);\n}\n\n/**\n * Create a partial retry policy merged with defaults.\n *\n * @param options - Partial policy options to override defaults\n * @returns Complete retry policy\n */\nexport function createRetryPolicy(\n options: Partial<RetryPolicy> = {}\n): RetryPolicy {\n return { ...DEFAULT_RETRY_POLICY, ...options };\n}\n\n/**\n * Sleep for a specified duration.\n *\n * @param ms - Duration in milliseconds\n * @returns Promise that resolves after the duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Causal Event Buffer\n *\n * Buffers events and releases them in causal order. Events with `causedBy`\n * dependencies are held until all their predecessor events have been seen.\n *\n * This is useful for:\n * - Ensuring events are processed in correct causal order\n * - Handling out-of-order event delivery\n * - Building consistent views from event streams\n */\n\nimport type { Event } from '../types';\n\n/**\n * Event with envelope metadata for causal tracking\n */\nexport interface CausalEvent {\n /** Unique event identifier */\n eventId: string;\n /** Event IDs that must be processed before this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n /** Timestamp when the event was received */\n receivedAt?: number;\n}\n\n/**\n * Options for CausalEventBuffer\n */\nexport interface CausalEventBufferOptions {\n /**\n * Maximum time (ms) to wait for causal predecessors before releasing anyway.\n * Default: 5000ms. Set to 0 or Infinity to wait indefinitely.\n */\n maxWaitTime?: number;\n\n /**\n * Maximum number of events to buffer before force-releasing oldest.\n * Default: 1000. Prevents unbounded memory growth.\n */\n maxBufferSize?: number;\n\n /**\n * Callback when an event is released despite missing predecessors (timeout or buffer overflow).\n */\n onForcedRelease?: (event: CausalEvent, missingPredecessors: string[]) => void;\n}\n\n/**\n * Result from pushing an event to the buffer\n */\nexport interface CausalBufferPushResult {\n /** Events that are now ready to be processed in causal order */\n ready: CausalEvent[];\n /** Number of events still waiting for predecessors */\n pending: number;\n}\n\n/**\n * Buffers events and releases them in causal order.\n *\n * Events with `causedBy` dependencies are held until all predecessor events\n * have been seen (pushed to the buffer). Events without dependencies are\n * released immediately.\n *\n * @example\n * ```typescript\n * const buffer = new CausalEventBuffer();\n *\n * // Event B depends on A, but arrives first\n * let result = buffer.push({\n * eventId: 'B',\n * causedBy: ['A'],\n * event: { id: 'B', type: 'effect', timestamp: 2 }\n * });\n * console.log(result.ready); // [] - B is waiting for A\n * console.log(result.pending); // 1\n *\n * // Event A arrives\n * result = buffer.push({\n * eventId: 'A',\n * event: { id: 'A', type: 'cause', timestamp: 1 }\n * });\n * console.log(result.ready); // [A, B] - Both released in order\n * console.log(result.pending); // 0\n * ```\n */\nexport class CausalEventBuffer {\n readonly #options: Required<Omit<CausalEventBufferOptions, 'onForcedRelease'>> & {\n onForcedRelease?: CausalEventBufferOptions['onForcedRelease'];\n };\n\n /** Events seen (by eventId) - used to check if predecessors exist */\n readonly #seen: Set<string> = new Set();\n\n /** Events waiting for predecessors */\n readonly #pending: Map<string, CausalEvent> = new Map();\n\n /** Map from eventId to events waiting for it */\n readonly #waitingFor: Map<string, Set<string>> = new Map();\n\n constructor(options: CausalEventBufferOptions = {}) {\n this.#options = {\n maxWaitTime: options.maxWaitTime ?? 5000,\n maxBufferSize: options.maxBufferSize ?? 1000,\n onForcedRelease: options.onForcedRelease,\n };\n }\n\n /**\n * Push an event into the buffer.\n *\n * @param event - The event to buffer\n * @returns Events that are ready to be processed (in causal order)\n */\n push(event: CausalEvent): CausalBufferPushResult {\n const ready: CausalEvent[] = [];\n\n // Check if we've already seen this event (deduplication)\n if (this.#seen.has(event.eventId)) {\n return { ready, pending: this.#pending.size };\n }\n\n // Mark as seen\n this.#seen.add(event.eventId);\n\n // Add received timestamp if not present\n if (!event.receivedAt) {\n event = { ...event, receivedAt: Date.now() };\n }\n\n // Check for missing predecessors\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n if (missingPredecessors.length === 0) {\n // No dependencies or all dependencies satisfied - release immediately\n ready.push(event);\n\n // Check if this event unblocks any pending events\n this.#releaseWaiting(event.eventId, ready);\n } else {\n // Wait for predecessors\n this.#pending.set(event.eventId, event);\n\n // Track what this event is waiting for\n for (const predecessorId of missingPredecessors) {\n if (!this.#waitingFor.has(predecessorId)) {\n this.#waitingFor.set(predecessorId, new Set());\n }\n this.#waitingFor.get(predecessorId)!.add(event.eventId);\n }\n }\n\n // Check for buffer overflow\n this.#handleBufferOverflow(ready);\n\n // Check for timeouts\n this.#handleTimeouts(ready);\n\n return { ready, pending: this.#pending.size };\n }\n\n /**\n * Get the number of events waiting for predecessors\n */\n get pendingCount(): number {\n return this.#pending.size;\n }\n\n /**\n * Get the number of unique events seen\n */\n get seenCount(): number {\n return this.#seen.size;\n }\n\n /**\n * Check if a specific event has been seen\n */\n hasSeen(eventId: string): boolean {\n return this.#seen.has(eventId);\n }\n\n /**\n * Force release all pending events, regardless of missing predecessors.\n * Useful for cleanup or when you know no more events are coming.\n *\n * @returns All pending events in the order they would be released\n */\n flush(): CausalEvent[] {\n const ready: CausalEvent[] = [];\n\n // Release all pending events, trying to maintain some order\n // Sort by receivedAt to release in arrival order\n const pendingList = Array.from(this.#pending.values()).sort(\n (a, b) => (a.receivedAt ?? 0) - (b.receivedAt ?? 0)\n );\n\n for (const event of pendingList) {\n const missingPredecessors = this.#getMissingPredecessors(event);\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n ready.push(event);\n }\n\n this.#pending.clear();\n this.#waitingFor.clear();\n\n return ready;\n }\n\n /**\n * Clear all state (seen events, pending events)\n */\n clear(): void {\n this.#seen.clear();\n this.#pending.clear();\n this.#waitingFor.clear();\n }\n\n /**\n * Get missing predecessors for an event.\n * A predecessor is considered \"missing\" if it hasn't been released yet\n * (either not seen at all, or seen but still pending).\n */\n #getMissingPredecessors(event: CausalEvent): string[] {\n if (!event.causedBy || event.causedBy.length === 0) {\n return [];\n }\n\n return event.causedBy.filter((predecessorId) => {\n // Predecessor is missing if:\n // 1. We haven't seen it at all, OR\n // 2. We've seen it but it's still pending (waiting for its own predecessors)\n return !this.#seen.has(predecessorId) || this.#pending.has(predecessorId);\n });\n }\n\n /**\n * Release events that were waiting for a specific predecessor\n */\n #releaseWaiting(predecessorId: string, ready: CausalEvent[]): void {\n const waitingEventIds = this.#waitingFor.get(predecessorId);\n if (!waitingEventIds) return;\n\n // Remove this predecessor from the waiting map\n this.#waitingFor.delete(predecessorId);\n\n for (const waitingEventId of waitingEventIds) {\n const waitingEvent = this.#pending.get(waitingEventId);\n if (!waitingEvent) continue;\n\n // Check if all predecessors are now satisfied\n const stillMissing = this.#getMissingPredecessors(waitingEvent);\n\n if (stillMissing.length === 0) {\n // All predecessors satisfied - release this event\n this.#pending.delete(waitingEventId);\n ready.push(waitingEvent);\n\n // Recursively check if this event unblocks others\n this.#releaseWaiting(waitingEventId, ready);\n }\n }\n }\n\n /**\n * Handle buffer overflow by force-releasing oldest events\n */\n #handleBufferOverflow(ready: CausalEvent[]): void {\n while (this.#pending.size > this.#options.maxBufferSize) {\n // Find oldest pending event by receivedAt\n let oldest: CausalEvent | null = null;\n for (const event of this.#pending.values()) {\n if (!oldest || (event.receivedAt ?? 0) < (oldest.receivedAt ?? 0)) {\n oldest = event;\n }\n }\n\n if (oldest) {\n this.#forceRelease(oldest, ready);\n }\n }\n }\n\n /**\n * Handle events that have been waiting too long\n */\n #handleTimeouts(ready: CausalEvent[]): void {\n if (this.#options.maxWaitTime <= 0 || this.#options.maxWaitTime === Infinity) {\n return;\n }\n\n const now = Date.now();\n const toRelease: CausalEvent[] = [];\n\n for (const event of this.#pending.values()) {\n const waitTime = now - (event.receivedAt ?? now);\n if (waitTime >= this.#options.maxWaitTime) {\n toRelease.push(event);\n }\n }\n\n for (const event of toRelease) {\n this.#forceRelease(event, ready);\n }\n }\n\n /**\n * Force release an event despite missing predecessors\n */\n #forceRelease(event: CausalEvent, ready: CausalEvent[]): void {\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n // Remove from pending\n this.#pending.delete(event.eventId);\n\n // Remove from waiting lists\n for (const predecessorId of event.causedBy ?? []) {\n const waiting = this.#waitingFor.get(predecessorId);\n if (waiting) {\n waiting.delete(event.eventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(predecessorId);\n }\n }\n }\n\n // Notify callback\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n\n // Add to ready list\n ready.push(event);\n\n // Check if this unblocks others\n this.#releaseWaiting(event.eventId, ready);\n }\n}\n\n/**\n * Validate that events are in causal order.\n *\n * An event sequence is in causal order if no event appears before\n * any of its predecessors (events in its causedBy array).\n *\n * @param events - Events to validate\n * @returns True if events are in valid causal order\n *\n * @example\n * ```typescript\n * const events = [\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * ];\n * console.log(validateCausalOrder(events)); // true\n *\n * const badOrder = [\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'A', event: {...} }, // A should come before B\n * ];\n * console.log(validateCausalOrder(badOrder)); // false\n * ```\n */\nexport function validateCausalOrder(events: CausalEvent[]): boolean {\n const seen = new Set<string>();\n\n for (const event of events) {\n // Check all predecessors have been seen\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!seen.has(predecessorId)) {\n return false;\n }\n }\n }\n\n seen.add(event.eventId);\n }\n\n return true;\n}\n\n/**\n * Sort events into causal order using topological sort.\n *\n * If the events form a valid DAG (no cycles), returns them in an order\n * where no event appears before its predecessors. If there are cycles\n * or missing predecessors, throws an error.\n *\n * @param events - Events to sort\n * @returns Events in causal order\n * @throws If events contain cycles or reference missing predecessors\n *\n * @example\n * ```typescript\n * const unordered = [\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * ];\n * const ordered = sortCausalOrder(unordered);\n * // ordered = [A, B, C]\n * ```\n */\nexport function sortCausalOrder(events: CausalEvent[]): CausalEvent[] {\n const eventMap = new Map<string, CausalEvent>();\n for (const event of events) {\n eventMap.set(event.eventId, event);\n }\n\n const result: CausalEvent[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n\n function visit(eventId: string): void {\n if (visited.has(eventId)) return;\n\n if (visiting.has(eventId)) {\n throw new Error(`Cycle detected involving event: ${eventId}`);\n }\n\n const event = eventMap.get(eventId);\n if (!event) {\n throw new Error(`Missing event: ${eventId}`);\n }\n\n visiting.add(eventId);\n\n // Visit predecessors first\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!eventMap.has(predecessorId)) {\n throw new Error(`Missing predecessor: ${predecessorId} for event: ${eventId}`);\n }\n visit(predecessorId);\n }\n }\n\n visiting.delete(eventId);\n visited.add(eventId);\n result.push(event);\n }\n\n for (const event of events) {\n visit(event.eventId);\n }\n\n return result;\n}\n","/**\n * 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 * 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 * Federation Envelope Utilities\n *\n * Provides functions for creating and processing federation envelopes\n * for routing messages between federated MAP systems.\n */\n\nimport type { FederationEnvelope, FederationRoutingConfig } from '../types';\nimport { ERROR_CODES } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for creating a federation envelope.\n */\nexport interface CreateEnvelopeOptions {\n /** Correlation ID for cross-system tracing */\n correlationId?: string;\n /** Maximum number of hops before rejection */\n maxHops?: number;\n /** Whether to track the full routing path */\n trackPath?: boolean;\n}\n\n/**\n * Result of processing a federation envelope.\n */\nexport type ProcessEnvelopeResult<T> =\n | {\n success: true;\n envelope: FederationEnvelope<T>;\n }\n | {\n success: false;\n errorCode: number;\n errorMessage: string;\n };\n\n// =============================================================================\n// Envelope Creation\n// =============================================================================\n\n/**\n * Create a new federation envelope for outbound messages.\n *\n * @param payload - The payload to wrap (typically a Message)\n * @param sourceSystem - ID of the originating system\n * @param targetSystem - ID of the destination system\n * @param options - Optional envelope options\n * @returns A new federation envelope\n *\n * @example\n * ```typescript\n * const envelope = createFederationEnvelope(\n * message,\n * 'system-alpha',\n * 'system-beta',\n * { trackPath: true, correlationId: 'req-123' }\n * );\n * ```\n */\nexport function createFederationEnvelope<T>(\n payload: T,\n sourceSystem: string,\n targetSystem: string,\n options?: CreateEnvelopeOptions\n): FederationEnvelope<T> {\n return {\n payload,\n federation: {\n sourceSystem,\n targetSystem,\n hopCount: 0,\n maxHops: options?.maxHops,\n path: options?.trackPath ? [sourceSystem] : undefined,\n originTimestamp: Date.now(),\n correlationId: options?.correlationId,\n },\n };\n}\n\n// =============================================================================\n// Envelope Processing\n// =============================================================================\n\n/**\n * Process an incoming federation envelope for forwarding.\n *\n * Validates the envelope against routing configuration and returns\n * an updated envelope ready for forwarding, or an error if routing\n * should be rejected.\n *\n * Checks performed:\n * 1. Hop count hasn't exceeded maximum\n * 2. No routing loops (if path tracking enabled)\n * 3. Source system is in allowed sources (if configured)\n * 4. Target system is in allowed targets (if configured)\n *\n * @param envelope - The incoming envelope\n * @param config - Routing configuration for this system\n * @returns Updated envelope or error result\n *\n * @example\n * ```typescript\n * const result = processFederationEnvelope(envelope, {\n * systemId: 'system-gamma',\n * maxHops: 5,\n * trackPath: true,\n * });\n *\n * if (result.success) {\n * forwardToNext(result.envelope);\n * } else {\n * rejectWithError(result.errorCode, result.errorMessage);\n * }\n * ```\n */\nexport function processFederationEnvelope<T>(\n envelope: FederationEnvelope<T>,\n config: FederationRoutingConfig\n): ProcessEnvelopeResult<T> {\n const { federation } = envelope;\n const maxHops = federation.maxHops ?? config.maxHops ?? 10;\n\n // Check hop count\n if (federation.hopCount >= maxHops) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_MAX_HOPS_EXCEEDED,\n errorMessage: `Message exceeded maximum hop count of ${maxHops}`,\n };\n }\n\n // Check for loops (if path tracking enabled)\n if (federation.path?.includes(config.systemId)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_LOOP_DETECTED,\n errorMessage: `Loop detected: message already visited ${config.systemId}`,\n };\n }\n\n // Check source allowlist\n if (config.allowedSources && !config.allowedSources.includes(federation.sourceSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Source system ${federation.sourceSystem} not in allowed sources`,\n };\n }\n\n // Check target allowlist\n if (config.allowedTargets && !config.allowedTargets.includes(federation.targetSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Target system ${federation.targetSystem} not in allowed targets`,\n };\n }\n\n // Update for forwarding\n return {\n success: true,\n envelope: {\n payload: envelope.payload,\n federation: {\n ...federation,\n hopCount: federation.hopCount + 1,\n path: config.trackPath ? [...(federation.path ?? []), config.systemId] : federation.path,\n },\n },\n };\n}\n\n// =============================================================================\n// Envelope Utilities\n// =============================================================================\n\n/**\n * Check if an envelope has reached its final destination.\n *\n * @param envelope - The envelope to check\n * @param currentSystemId - ID of the current system\n * @returns true if this is the target system\n */\nexport function isEnvelopeAtDestination(\n envelope: FederationEnvelope<unknown>,\n currentSystemId: string\n): boolean {\n return envelope.federation.targetSystem === currentSystemId;\n}\n\n/**\n * Extract the payload from a federation envelope.\n *\n * @param envelope - The envelope to unwrap\n * @returns The payload\n */\nexport function unwrapEnvelope<T>(envelope: FederationEnvelope<T>): T {\n return envelope.payload;\n}\n\n/**\n * Get routing metadata for logging/debugging.\n *\n * @param envelope - The envelope to inspect\n * @returns Routing information\n */\nexport function getEnvelopeRoutingInfo(envelope: FederationEnvelope<unknown>): {\n source: string;\n target: string;\n hops: number;\n path?: string[];\n age: number;\n correlationId?: string;\n} {\n const { federation } = envelope;\n return {\n source: federation.sourceSystem,\n target: federation.targetSystem,\n hops: federation.hopCount,\n path: federation.path,\n age: Date.now() - federation.originTimestamp,\n correlationId: federation.correlationId,\n };\n}\n\n/**\n * Validate that an object is a valid federation envelope.\n *\n * @param obj - Object to validate\n * @returns true if valid envelope structure\n */\nexport function isValidEnvelope(obj: unknown): obj is FederationEnvelope<unknown> {\n if (!obj || typeof obj !== 'object') return false;\n\n const envelope = obj as Record<string, unknown>;\n if (!('payload' in envelope) || !('federation' in envelope)) return false;\n\n const federation = envelope.federation as Record<string, unknown>;\n if (!federation || typeof federation !== 'object') return false;\n\n return (\n typeof federation.sourceSystem === 'string' &&\n typeof federation.targetSystem === 'string' &&\n typeof federation.hopCount === 'number' &&\n typeof federation.originTimestamp === 'number'\n );\n}\n\n/**\n * Create an updated envelope with a new payload (for transformations).\n *\n * @param envelope - Original envelope\n * @param newPayload - New payload\n * @returns New envelope with same metadata but new payload\n */\nexport function withPayload<T, U>(\n envelope: FederationEnvelope<T>,\n newPayload: U\n): FederationEnvelope<U> {\n return {\n payload: newPayload,\n federation: envelope.federation,\n };\n}\n","/**\n * Federation Outage Buffer\n *\n * Buffers outbound messages during federation outages for later delivery\n * when the peer reconnects.\n */\n\nimport type {\n FederationEnvelope,\n FederationBufferConfig,\n Message,\n Timestamp,\n} from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * A buffered message with metadata.\n */\ninterface BufferedMessage {\n envelope: FederationEnvelope<Message>;\n enqueuedAt: Timestamp;\n size: number;\n}\n\n/**\n * Per-peer buffer state.\n */\ninterface PeerBuffer {\n messages: BufferedMessage[];\n totalEnqueued: number;\n totalDropped: number;\n totalBytes: number;\n}\n\n/**\n * Buffer statistics for a peer.\n */\nexport interface PeerBufferStats {\n /** Number of messages currently buffered */\n count: number;\n /** Age of oldest message in milliseconds */\n oldestAge: number;\n /** Total messages ever enqueued */\n totalEnqueued: number;\n /** Total messages dropped due to overflow/expiry */\n totalDropped: number;\n /** Current buffer size in bytes */\n totalBytes: number;\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nconst DEFAULT_CONFIG: Required<FederationBufferConfig> = {\n enabled: true,\n maxMessages: 1000,\n maxBytes: 10 * 1024 * 1024, // 10MB\n retentionMs: 60 * 60 * 1000, // 1 hour\n overflowStrategy: 'drop-oldest',\n};\n\n// =============================================================================\n// Buffer Implementation\n// =============================================================================\n\n/**\n * Buffer for storing outbound messages during federation outages.\n *\n * Messages are stored per-peer and drained on reconnection.\n * Supports configurable size limits, retention, and overflow strategies.\n *\n * @example\n * ```typescript\n * const buffer = new FederationOutageBuffer({\n * maxMessages: 500,\n * retentionMs: 30000,\n * overflowStrategy: 'drop-oldest',\n * });\n *\n * // Buffer messages during outage\n * buffer.enqueue('peer-1', envelope);\n *\n * // On reconnect, drain and send\n * const messages = buffer.drain('peer-1');\n * for (const msg of messages) {\n * await send(msg);\n * }\n * ```\n */\nexport class FederationOutageBuffer {\n readonly #config: Required<FederationBufferConfig>;\n readonly #buffers: Map<string, PeerBuffer> = new Map();\n\n constructor(config?: FederationBufferConfig) {\n this.#config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Whether buffering is enabled.\n */\n get enabled(): boolean {\n return this.#config.enabled;\n }\n\n /**\n * Get the configuration.\n */\n get config(): Readonly<Required<FederationBufferConfig>> {\n return this.#config;\n }\n\n /**\n * Enqueue a message for a peer.\n *\n * @param peerId - Target peer system ID\n * @param envelope - Message envelope to buffer\n * @returns true if message was buffered, false if rejected\n */\n enqueue(peerId: string, envelope: FederationEnvelope<Message>): boolean {\n if (!this.#config.enabled) return false;\n\n let buffer = this.#buffers.get(peerId);\n if (!buffer) {\n buffer = { messages: [], totalEnqueued: 0, totalDropped: 0, totalBytes: 0 };\n this.#buffers.set(peerId, buffer);\n }\n\n // Evict expired messages first\n this.#evictExpired(buffer);\n\n // Estimate message size\n const messageSize = this.#estimateSize(envelope);\n\n // Check byte limit\n while (buffer.totalBytes + messageSize > this.#config.maxBytes && buffer.messages.length > 0) {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n }\n\n // Check message count limit\n if (buffer.messages.length >= this.#config.maxMessages) {\n switch (this.#config.overflowStrategy) {\n case 'drop-oldest': {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n break;\n }\n case 'drop-newest':\n buffer.totalDropped++;\n return false;\n case 'reject':\n return false;\n }\n }\n\n buffer.messages.push({\n envelope,\n enqueuedAt: Date.now(),\n size: messageSize,\n });\n buffer.totalEnqueued++;\n buffer.totalBytes += messageSize;\n\n return true;\n }\n\n /**\n * Drain all buffered messages for a peer.\n *\n * Returns messages in FIFO order and clears the buffer.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes\n */\n drain(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired before draining\n this.#evictExpired(buffer);\n\n const messages = buffer.messages.map((m) => m.envelope);\n buffer.messages = [];\n buffer.totalBytes = 0;\n\n return messages;\n }\n\n /**\n * Peek at buffered messages without removing them.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes (still in buffer)\n */\n peek(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired\n this.#evictExpired(buffer);\n\n return buffer.messages.map((m) => m.envelope);\n }\n\n /**\n * Get statistics for all peer buffers.\n *\n * @returns Map of peer ID to buffer stats\n */\n stats(): Map<string, PeerBufferStats> {\n const result = new Map<string, PeerBufferStats>();\n const now = Date.now();\n\n for (const [peerId, buffer] of this.#buffers) {\n // Evict expired for accurate stats\n this.#evictExpired(buffer);\n\n const oldestAge =\n buffer.messages.length > 0 ? now - buffer.messages[0].enqueuedAt : 0;\n\n result.set(peerId, {\n count: buffer.messages.length,\n oldestAge,\n totalEnqueued: buffer.totalEnqueued,\n totalDropped: buffer.totalDropped,\n totalBytes: buffer.totalBytes,\n });\n }\n\n return result;\n }\n\n /**\n * Get count for a specific peer.\n *\n * @param peerId - Target peer system ID\n * @returns Number of buffered messages\n */\n count(peerId: string): number {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return 0;\n\n this.#evictExpired(buffer);\n return buffer.messages.length;\n }\n\n /**\n * Check if buffer has messages for a peer.\n *\n * @param peerId - Target peer system ID\n * @returns true if there are buffered messages\n */\n has(peerId: string): boolean {\n return this.count(peerId) > 0;\n }\n\n /**\n * Clear buffer for a specific peer.\n *\n * @param peerId - Target peer system ID\n */\n clear(peerId: string): void {\n this.#buffers.delete(peerId);\n }\n\n /**\n * Clear all buffers.\n */\n clearAll(): void {\n this.#buffers.clear();\n }\n\n /**\n * Get list of peers with buffered messages.\n *\n * @returns Array of peer IDs\n */\n peers(): string[] {\n const result: string[] = [];\n for (const [peerId, buffer] of this.#buffers) {\n this.#evictExpired(buffer);\n if (buffer.messages.length > 0) {\n result.push(peerId);\n }\n }\n return result;\n }\n\n /**\n * Evict expired messages from a buffer.\n */\n #evictExpired(buffer: PeerBuffer): void {\n const cutoff = Date.now() - this.#config.retentionMs;\n let removed = 0;\n let bytesRemoved = 0;\n\n while (buffer.messages.length > 0 && buffer.messages[0].enqueuedAt < cutoff) {\n const msg = buffer.messages.shift()!;\n bytesRemoved += msg.size;\n removed++;\n }\n\n buffer.totalDropped += removed;\n buffer.totalBytes -= bytesRemoved;\n }\n\n /**\n * Estimate the size of an envelope in bytes.\n */\n #estimateSize(envelope: FederationEnvelope<Message>): number {\n // Simple estimation using JSON serialization\n try {\n return JSON.stringify(envelope).length * 2; // UTF-16\n } catch {\n return 1024; // Default estimate if serialization fails\n }\n }\n}\n","/**\n * Gateway connection for MAP protocol federation\n *\n * Used by gateways to connect two MAP systems together,\n * routing messages between them.\n */\n\nimport type { Stream } from '../stream';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport {\n CORE_METHODS,\n FEDERATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type Message,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type FederationConnectRequestParams,\n type FederationConnectResponseResult,\n type FederationRouteRequestParams,\n type FederationRouteResponseResult,\n type FederationRoutingConfig,\n type FederationBufferConfig,\n type FederationEnvelope,\n type ReplayRequestParams,\n type ReplayResponseResult,\n type EventType,\n} from '../types';\nimport { createFederationEnvelope } from '../federation/envelope';\nimport { FederationOutageBuffer } from '../federation/buffer';\n\n/**\n * Options for automatic gateway reconnection\n */\nexport interface GatewayReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n}\n\n/**\n * Options for event replay on gateway reconnection\n */\nexport interface GatewayReplayOptions {\n /** Enable replay on reconnection (default: false) */\n enabled: boolean;\n /** Event types to replay (default: all) */\n eventTypes?: EventType[];\n /** Maximum events to replay per peer (default: 1000) */\n maxEvents?: number;\n /** Maximum age of events to replay in ms (default: 1 hour) */\n maxAgeMs?: number;\n}\n\n/**\n * Reconnection event types for gateway\n */\nexport type GatewayReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed'\n | 'bufferOverflow'\n | 'bufferDrained'\n | 'replayStarted'\n | 'replayCompleted';\n\n/**\n * Handler for gateway reconnection events\n */\nexport type GatewayReconnectionEventHandler = (event: {\n type: GatewayReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n peerId?: string;\n messagesBuffered?: number;\n messagesDrained?: number;\n eventsReplayed?: number;\n}) => void;\n\n/**\n * Options for gateway connection\n */\nexport interface GatewayConnectionOptions extends BaseConnectionOptions {\n /** Gateway name */\n name?: string;\n /** Gateway capabilities */\n capabilities?: ParticipantCapabilities;\n /** Federation routing configuration */\n routing?: FederationRoutingConfig;\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: GatewayReconnectionOptions;\n /** Outage buffer configuration */\n buffer?: FederationBufferConfig;\n /** Replay options for reconnection */\n replay?: GatewayReplayOptions;\n}\n\n/**\n * Gateway connection for MAP federation.\n *\n * Provides methods for:\n * - Connecting to peer MAP systems\n * - Routing messages between systems\n * - Automatic reconnection with message buffering\n */\nexport class GatewayConnection {\n #connection: BaseConnection;\n readonly #options: GatewayConnectionOptions;\n readonly #connectedSystems: Map<string, { name?: string; version?: string }> = new Map();\n readonly #reconnectionHandlers: Set<GatewayReconnectionEventHandler> = new Set();\n readonly #outageBuffer: FederationOutageBuffer | null;\n readonly #lastSyncTimestamps: Map<string, number> = new Map();\n\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #connected = false;\n #isReconnecting = false;\n #lastConnectOptions?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n\n constructor(stream: Stream, options: GatewayConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Initialize outage buffer if configured\n this.#outageBuffer = options.buffer?.enabled\n ? new FederationOutageBuffer(options.buffer)\n : null;\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the local MAP system\n */\n async connect(options?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n }): Promise<ConnectResponseResult> {\n const params: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'gateway',\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n auth: options?.auth,\n };\n\n const result = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, params);\n\n this.#sessionId = result.sessionId;\n this.#serverCapabilities = result.capabilities;\n this.#connected = true;\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n return result;\n }\n\n /**\n * Disconnect from the local MAP system\n */\n async disconnect(reason?: string): Promise<void> {\n if (!this.#connected) return;\n\n try {\n await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n } finally {\n await this.#connection.close();\n this.#connected = false;\n }\n }\n\n /**\n * Whether the gateway is connected to the local system\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * List of connected remote systems\n */\n get connectedSystems(): Map<string, { name?: string; version?: string }> {\n return new Map(this.#connectedSystems);\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Federation\n // ===========================================================================\n\n /**\n * Connect to a remote MAP system\n */\n async connectToSystem(\n systemId: string,\n endpoint: string,\n auth?: { method: 'bearer' | 'api-key' | 'mtls'; credentials?: string }\n ): Promise<FederationConnectResponseResult> {\n const params: FederationConnectRequestParams = {\n systemId,\n endpoint,\n auth,\n };\n\n const result = await this.#connection.sendRequest<\n FederationConnectRequestParams,\n FederationConnectResponseResult\n >(FEDERATION_METHODS.FEDERATION_CONNECT, params);\n\n if (result.connected && result.systemInfo) {\n this.#connectedSystems.set(systemId, {\n name: result.systemInfo.name,\n version: result.systemInfo.version,\n });\n }\n\n return result;\n }\n\n /**\n * Route a message to a remote system.\n *\n * If routing config is provided, wraps the message in a federation envelope\n * with proper metadata for multi-hop routing. Otherwise, sends raw message\n * for backwards compatibility.\n *\n * During reconnection, messages are buffered if buffer is configured.\n */\n async routeToSystem(\n systemId: string,\n message: Message\n ): Promise<FederationRouteResponseResult> {\n // Create envelope if routing config available\n let envelope: FederationEnvelope<Message> | undefined;\n if (this.#options.routing) {\n envelope = createFederationEnvelope(\n message,\n this.#options.routing.systemId,\n systemId,\n {\n maxHops: this.#options.routing.maxHops,\n trackPath: this.#options.routing.trackPath,\n }\n );\n }\n\n // If reconnecting and buffer is available, buffer the message\n if (this.#isReconnecting && this.#outageBuffer && envelope) {\n const buffered = this.#outageBuffer.enqueue(systemId, envelope);\n if (!buffered) {\n this.#emitReconnectionEvent({\n type: 'bufferOverflow',\n peerId: systemId,\n messagesBuffered: this.#outageBuffer.count(systemId),\n });\n }\n // Return a \"pending\" response - message will be sent on reconnect\n return { routed: false };\n }\n\n const params: FederationRouteRequestParams = { systemId };\n if (envelope) {\n params.envelope = envelope;\n } else {\n // Legacy: send raw message for backwards compatibility\n params.message = message;\n }\n\n const result = await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n\n // Update sync timestamp on successful route\n if (result.routed) {\n this.#lastSyncTimestamps.set(systemId, Date.now());\n }\n\n return result;\n }\n\n /**\n * Check if a remote system is connected\n */\n isSystemConnected(systemId: string): boolean {\n return this.#connectedSystems.has(systemId);\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Get the outage buffer (for advanced use)\n */\n get outageBuffer(): FederationOutageBuffer | null {\n return this.#outageBuffer;\n }\n\n /**\n * Get last sync timestamp for a peer\n */\n getLastSyncTimestamp(peerId: string): number | undefined {\n return this.#lastSyncTimestamps.get(peerId);\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n */\n onReconnection(handler: GatewayReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<GatewayReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Gateway reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-authenticate\n const connectResult = await this.connect(this.#lastConnectOptions);\n\n // Update stored values\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Drain buffered messages immediately on reconnect\n await this.#drainBufferedMessages();\n\n // Replay missed events from peers\n await this.#replayFromPeers();\n }\n\n /**\n * Drain buffered messages after reconnection\n */\n async #drainBufferedMessages(): Promise<void> {\n if (!this.#outageBuffer) return;\n\n const peers = this.#outageBuffer.peers();\n for (const peerId of peers) {\n const messages = this.#outageBuffer.drain(peerId);\n if (messages.length === 0) continue;\n\n // Send each buffered message\n for (const envelope of messages) {\n try {\n const params: FederationRouteRequestParams = {\n systemId: peerId,\n envelope,\n };\n\n await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n } catch (error) {\n // Log but continue draining - we don't want to lose other messages\n console.warn('MAP: Failed to send buffered message to', peerId, error);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'bufferDrained',\n peerId,\n messagesDrained: messages.length,\n });\n }\n }\n\n /**\n * Replay missed events from peers after reconnection\n */\n async #replayFromPeers(): Promise<void> {\n const replayOptions = this.#options.replay;\n if (!replayOptions?.enabled) return;\n\n // Get peers that have sync timestamps (peers we've communicated with)\n const peersToReplay = Array.from(this.#lastSyncTimestamps.entries());\n if (peersToReplay.length === 0) return;\n\n for (const [peerId, lastSync] of peersToReplay) {\n try {\n await this.#replayFromPeer(peerId, lastSync);\n } catch (error) {\n // Log but continue with other peers\n console.warn('MAP: Failed to replay events from peer', peerId, error);\n }\n }\n }\n\n /**\n * Replay missed events from a single peer\n */\n async #replayFromPeer(peerId: string, lastSyncTimestamp: number): Promise<void> {\n const replayOptions = this.#options.replay!;\n\n // Check max age\n const maxAge = replayOptions.maxAgeMs ?? 60 * 60 * 1000; // 1 hour default\n const cutoff = Date.now() - maxAge;\n if (lastSyncTimestamp < cutoff) {\n // Too old, skip replay for this peer\n return;\n }\n\n this.#emitReconnectionEvent({ type: 'replayStarted', peerId });\n\n let totalReplayed = 0;\n const maxEvents = replayOptions.maxEvents ?? 1000;\n let afterEventId: string | undefined;\n let hasMore = true;\n\n // Paginate through replay results\n while (hasMore && totalReplayed < maxEvents) {\n const params: ReplayRequestParams = {\n limit: Math.min(100, maxEvents - totalReplayed),\n };\n\n // Use eventId for pagination, or timestamp for first request\n if (afterEventId) {\n params.afterEventId = afterEventId;\n } else {\n params.fromTimestamp = lastSyncTimestamp;\n }\n\n // Filter by event types if specified\n if (replayOptions.eventTypes) {\n params.filter = { eventTypes: replayOptions.eventTypes };\n }\n\n const result = await this.#connection.sendRequest<\n ReplayRequestParams,\n ReplayResponseResult\n >(CORE_METHODS.REPLAY, params);\n\n totalReplayed += result.events.length;\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: break if no events returned\n if (result.events.length === 0) {\n break;\n }\n\n // Update sync timestamp to latest replayed event\n const lastEvent = result.events.at(-1);\n if (lastEvent) {\n this.#lastSyncTimestamps.set(peerId, lastEvent.timestamp);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'replayCompleted',\n peerId,\n eventsReplayed: totalReplayed,\n });\n }\n}\n","/**\n * Zod validators for MAP protocol types\n *\n * These validators provide runtime validation for protocol messages.\n * They are generated based on the JSON schema but hand-tuned for proper Zod compatibility.\n */\n\nimport { z } from 'zod';\n\n// ===========================================================================\n// Primitives\n// ===========================================================================\n\nexport const JsonRpcVersionSchema = z.literal('2.0');\nexport const RequestIdSchema = z.union([z.string(), z.number().int()]);\nexport const ProtocolVersionSchema = z.literal(1);\nexport const TimestampSchema = z.number().int();\nexport const MetaSchema = z.record(z.unknown()).optional();\n\n// ===========================================================================\n// Identifiers\n// ===========================================================================\n\nexport const ParticipantIdSchema = z.string();\nexport const AgentIdSchema = z.string();\nexport const ScopeIdSchema = z.string();\nexport const SessionIdSchema = z.string();\nexport const MessageIdSchema = z.string();\nexport const SubscriptionIdSchema = z.string();\nexport const CorrelationIdSchema = z.string();\n\n// ===========================================================================\n// Enums\n// ===========================================================================\n\nexport const ParticipantTypeSchema = z.enum(['agent', 'client', 'system', 'gateway']);\nexport const TransportTypeSchema = z.enum(['websocket', 'stdio', 'inprocess', 'http-sse']);\nexport const ErrorCategorySchema = z.enum([\n 'protocol',\n 'auth',\n 'routing',\n 'agent',\n 'resource',\n 'federation',\n 'internal',\n]);\n\nexport const AgentVisibilitySchema = z.enum(['public', 'parent-only', 'scope', 'system']);\n\n// Agent state: standard states + custom x-* states\nexport const AgentStateSchema = z.union([\n z.enum(['registered', 'idle', 'busy', 'waiting', 'stopping', 'stopped', 'error']),\n z.string().regex(/^x-/),\n]);\n\nexport const MessagePrioritySchema = z.enum(['low', 'normal', 'high', 'urgent']);\nexport const DeliverySemanticsSchema = z.enum(['at-most-once', 'at-least-once', 'exactly-once']);\nexport const MessageRelationshipSchema = z.enum([\n 'peer',\n 'parent-to-child',\n 'child-to-parent',\n 'supervisor-to-supervised',\n 'broadcast',\n]);\n\nexport const EventTypeSchema = z.enum([\n 'agent.registered',\n 'agent.unregistered',\n 'agent.state-changed',\n 'agent.spawned',\n 'scope.created',\n 'scope.deleted',\n 'scope.joined',\n 'scope.left',\n 'message.sent',\n 'message.delivered',\n 'session.started',\n 'session.ended',\n 'system.error',\n 'system.shutdown',\n]);\n\nexport const ScopeJoinPolicySchema = z.enum(['open', 'approval', 'invite']);\nexport const ScopeVisibilitySchema = z.enum(['public', 'private', 'unlisted']);\nexport const MessageVisibilitySchema = z.enum(['members', 'public']);\nexport const ScopeSendPolicySchema = z.enum(['anyone', 'members']);\n\n// ===========================================================================\n// Capabilities\n// ===========================================================================\n\nexport const ParticipantCapabilitiesSchema = z\n .object({\n observation: z\n .object({\n canObserve: z.boolean().optional(),\n canQuery: z.boolean().optional(),\n })\n .strict()\n .optional(),\n messaging: z\n .object({\n canSend: z.boolean().optional(),\n canReceive: z.boolean().optional(),\n canBroadcast: z.boolean().optional(),\n })\n .strict()\n .optional(),\n lifecycle: z\n .object({\n canSpawn: z.boolean().optional(),\n canRegister: z.boolean().optional(),\n canUnregister: z.boolean().optional(),\n canSteer: z.boolean().optional(),\n canStop: z.boolean().optional(),\n })\n .strict()\n .optional(),\n scopes: z\n .object({\n canCreateScopes: z.boolean().optional(),\n canManageScopes: z.boolean().optional(),\n })\n .strict()\n .optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Addresses\n// ===========================================================================\n\nexport const DirectAddressSchema = z.object({ agent: AgentIdSchema }).strict();\nexport const MultiAddressSchema = z.object({ agents: z.array(AgentIdSchema).min(1) }).strict();\nexport const ScopeAddressSchema = z.object({ scope: ScopeIdSchema }).strict();\nexport const RoleAddressSchema = z\n .object({\n role: z.string(),\n scope: ScopeIdSchema.optional(),\n })\n .strict();\nexport const HierarchicalAddressSchema = z\n .object({\n parent: z.literal(true).optional(),\n children: z.literal(true).optional(),\n siblings: z.literal(true).optional(),\n ancestors: z.literal(true).optional(),\n descendants: z.literal(true).optional(),\n })\n .strict();\nexport const BroadcastAddressSchema = z.object({ broadcast: z.literal(true) }).strict();\nexport const SystemAddressSchema = z.object({ system: z.literal(true) }).strict();\nexport const ParticipantAddressSchema = z\n .object({ participant: ParticipantIdSchema })\n .strict();\nexport const FederatedAddressSchema = z\n .object({\n system: z.string(),\n address: z.lazy(() => AddressSchema),\n })\n .strict();\n\nexport const AddressSchema: z.ZodType<unknown> = z.union([\n DirectAddressSchema,\n MultiAddressSchema,\n ScopeAddressSchema,\n RoleAddressSchema,\n HierarchicalAddressSchema,\n BroadcastAddressSchema,\n SystemAddressSchema,\n ParticipantAddressSchema,\n FederatedAddressSchema,\n]);\n\n// ===========================================================================\n// Core Structures\n// ===========================================================================\n\nexport const AgentRelationshipSchema = z\n .object({\n type: z.enum(['peer', 'supervisor', 'supervised', 'collaborator']),\n agentId: AgentIdSchema,\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentLifecycleSchema = z\n .object({\n createdAt: TimestampSchema.optional(),\n startedAt: TimestampSchema.optional(),\n stoppedAt: TimestampSchema.optional(),\n lastActiveAt: TimestampSchema.optional(),\n exitCode: z.number().int().optional(),\n exitReason: z.string().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentSchema = z\n .object({\n id: AgentIdSchema,\n name: z.string().optional(),\n description: z.string().optional(),\n parent: AgentIdSchema.optional(),\n relationships: z.array(AgentRelationshipSchema).optional(),\n state: AgentStateSchema,\n role: z.string().optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n visibility: AgentVisibilitySchema.optional(),\n lifecycle: AgentLifecycleSchema.optional(),\n capabilities: ParticipantCapabilitiesSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const ScopeSchema = z\n .object({\n id: ScopeIdSchema,\n name: z.string().optional(),\n parent: ScopeIdSchema.optional(),\n children: z.array(ScopeIdSchema).optional(),\n joinPolicy: ScopeJoinPolicySchema.optional(),\n visibility: ScopeVisibilitySchema.optional(),\n messageVisibility: MessageVisibilitySchema.optional(),\n sendPolicy: ScopeSendPolicySchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageMetaSchema = z\n .object({\n correlationId: CorrelationIdSchema.optional(),\n causationId: MessageIdSchema.optional(),\n traceId: z.string().optional(),\n spanId: z.string().optional(),\n priority: MessagePrioritySchema.optional(),\n delivery: DeliverySemanticsSchema.optional(),\n relationship: MessageRelationshipSchema.optional(),\n expiresAt: TimestampSchema.optional(),\n isResult: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageSchema = z\n .object({\n id: MessageIdSchema,\n from: ParticipantIdSchema,\n to: AddressSchema,\n timestamp: TimestampSchema,\n payload: z.unknown().optional(),\n meta: MessageMetaSchema.optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const EventSchema = z\n .object({\n type: EventTypeSchema,\n timestamp: TimestampSchema,\n data: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const SubscriptionFilterSchema = z\n .object({\n eventTypes: z.array(EventTypeSchema).optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n agents: z.array(AgentIdSchema).optional(),\n includeChildren: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Error\n// ===========================================================================\n\nexport const MAPErrorDataSchema = z\n .object({\n category: ErrorCategorySchema.optional(),\n retryable: z.boolean().optional(),\n retryAfterMs: z.number().int().optional(),\n details: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .passthrough();\n\nexport const MAPErrorSchema = z\n .object({\n code: z.number().int(),\n message: z.string(),\n data: MAPErrorDataSchema.optional(),\n })\n .strict();\n\n// ===========================================================================\n// JSON-RPC Messages\n// ===========================================================================\n\nexport const MAPRequestSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const MAPResponseSuccessSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n result: z.unknown(),\n })\n .strict();\n\nexport const MAPResponseErrorSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n error: MAPErrorSchema,\n })\n .strict();\n\nexport const MAPResponseSchema = z.union([MAPResponseSuccessSchema, MAPResponseErrorSchema]);\n\nexport const MAPNotificationSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\n// ===========================================================================\n// Inferred Types (for convenience)\n// ===========================================================================\n\nexport type ParticipantIdValidated = z.infer<typeof ParticipantIdSchema>;\nexport type AgentIdValidated = z.infer<typeof AgentIdSchema>;\nexport type ScopeIdValidated = z.infer<typeof ScopeIdSchema>;\nexport type SessionIdValidated = z.infer<typeof SessionIdSchema>;\nexport type MessageIdValidated = z.infer<typeof MessageIdSchema>;\nexport type ParticipantTypeValidated = z.infer<typeof ParticipantTypeSchema>;\nexport type AgentStateValidated = z.infer<typeof AgentStateSchema>;\nexport type AgentValidated = z.infer<typeof AgentSchema>;\nexport type ScopeValidated = z.infer<typeof ScopeSchema>;\nexport type MessageValidated = z.infer<typeof MessageSchema>;\nexport type EventValidated = z.infer<typeof EventSchema>;\nexport type AddressValidated = z.infer<typeof AddressSchema>;\nexport type MAPRequestValidated = z.infer<typeof MAPRequestSchema>;\nexport type MAPResponseValidated = z.infer<typeof MAPResponseSchema>;\nexport type MAPNotificationValidated = z.infer<typeof MAPNotificationSchema>;\nexport type MAPErrorValidated = z.infer<typeof MAPErrorSchema>;\nexport type ParticipantCapabilitiesValidated = z.infer<typeof ParticipantCapabilitiesSchema>;\nexport type SubscriptionFilterValidated = z.infer<typeof SubscriptionFilterSchema>;\n","/**\n * Protocol utilities for MAP SDK\n *\n * Provides:\n * - METHOD_REGISTRY: Single source of truth for all methods with metadata\n * - Response builders: Type-safe response construction\n * - Helper functions for method capability checking\n */\n\nimport type {\n Agent,\n Scope,\n ParticipantCapabilities,\n ConnectResponseResult,\n DisconnectResponseResult,\n SendResponseResult,\n AgentsRegisterResponseResult,\n AgentsUnregisterResponseResult,\n AgentsListResponseResult,\n AgentsGetResponseResult,\n AgentsUpdateResponseResult,\n AgentsSpawnResponseResult,\n ScopesCreateResponseResult,\n ScopesListResponseResult,\n ScopesJoinResponseResult,\n ScopesLeaveResponseResult,\n SubscribeResponseResult,\n UnsubscribeResponseResult,\n SessionInfo,\n SubscriptionId,\n MessageId,\n ParticipantId,\n ProtocolVersion,\n SessionId,\n} from '../types';\n\n// =============================================================================\n// Method Registry\n// =============================================================================\n\n/** Method category for organization */\nexport type MethodCategory =\n | 'core'\n | 'observation'\n | 'lifecycle'\n | 'state'\n | 'steering'\n | 'scope'\n | 'session'\n | 'auth'\n | 'federation'\n | 'notification';\n\n/** Capability path like 'observation.canQuery' */\nexport type CapabilityPath = string;\n\n/** Method metadata */\nexport interface MethodInfo {\n /** The wire method name */\n method: string;\n /** Category for organization */\n category: MethodCategory;\n /** Required capabilities (empty = no special capabilities needed) */\n capabilities: CapabilityPath[];\n /** Human-readable description */\n description: string;\n}\n\n/**\n * Method Registry - Single source of truth for all MAP methods\n *\n * Use this instead of individual method constants for:\n * - Capability checking\n * - Method validation\n * - Documentation generation\n */\nexport const METHOD_REGISTRY: Record<string, MethodInfo> = {\n // Core methods\n 'connect': {\n method: 'map/connect',\n category: 'core',\n capabilities: [],\n description: 'Establish connection to MAP system',\n },\n 'disconnect': {\n method: 'map/disconnect',\n category: 'core',\n capabilities: [],\n description: 'Disconnect from MAP system',\n },\n 'send': {\n method: 'map/send',\n category: 'core',\n capabilities: ['messaging.canSend'],\n description: 'Send a message to an address',\n },\n 'subscribe': {\n method: 'map/subscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Subscribe to event stream',\n },\n 'unsubscribe': {\n method: 'map/unsubscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Unsubscribe from event stream',\n },\n 'replay': {\n method: 'map/replay',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Replay historical events with filtering and pagination',\n },\n\n // Observation methods\n 'agents/list': {\n method: 'map/agents/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List agents with optional filters',\n },\n 'agents/get': {\n method: 'map/agents/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent by ID with optional hierarchy',\n },\n 'scopes/list': {\n method: 'map/scopes/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List all scopes',\n },\n 'scopes/get': {\n method: 'map/scopes/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get scope by ID',\n },\n 'scopes/members': {\n method: 'map/scopes/members',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List scope members',\n },\n 'structure/graph': {\n method: 'map/structure/graph',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent hierarchy graph',\n },\n\n // Lifecycle methods\n 'agents/register': {\n method: 'map/agents/register',\n category: 'lifecycle',\n capabilities: ['lifecycle.canRegister'],\n description: 'Register a new agent',\n },\n 'agents/unregister': {\n method: 'map/agents/unregister',\n category: 'lifecycle',\n capabilities: ['lifecycle.canUnregister'],\n description: 'Unregister an agent',\n },\n 'agents/spawn': {\n method: 'map/agents/spawn',\n category: 'lifecycle',\n capabilities: ['lifecycle.canSpawn'],\n description: 'Spawn a child agent',\n },\n\n // State methods\n 'agents/update': {\n method: 'map/agents/update',\n category: 'state',\n capabilities: ['lifecycle.canRegister'],\n description: 'Update agent state or metadata',\n },\n 'agents/suspend': {\n method: 'map/agents/suspend',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Suspend an agent',\n },\n 'agents/resume': {\n method: 'map/agents/resume',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Resume a suspended agent',\n },\n 'agents/stop': {\n method: 'map/agents/stop',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Stop an agent',\n },\n\n // Steering methods\n 'inject': {\n method: 'map/inject',\n category: 'steering',\n capabilities: ['lifecycle.canSteer'],\n description: 'Inject context into an agent',\n },\n\n // Scope methods\n 'scopes/create': {\n method: 'map/scopes/create',\n category: 'scope',\n capabilities: ['scopes.canCreateScopes'],\n description: 'Create a new scope',\n },\n 'scopes/delete': {\n method: 'map/scopes/delete',\n category: 'scope',\n capabilities: ['scopes.canManageScopes'],\n description: 'Delete a scope',\n },\n 'scopes/join': {\n method: 'map/scopes/join',\n category: 'scope',\n capabilities: [],\n description: 'Join a scope',\n },\n 'scopes/leave': {\n method: 'map/scopes/leave',\n category: 'scope',\n capabilities: [],\n description: 'Leave a scope',\n },\n\n // Session methods\n 'session/list': {\n method: 'map/session/list',\n category: 'session',\n capabilities: [],\n description: 'List sessions',\n },\n 'session/load': {\n method: 'map/session/load',\n category: 'session',\n capabilities: [],\n description: 'Load a session',\n },\n 'session/close': {\n method: 'map/session/close',\n category: 'session',\n capabilities: [],\n description: 'Close a session',\n },\n\n // Auth methods\n 'auth/refresh': {\n method: 'map/auth/refresh',\n category: 'auth',\n capabilities: [],\n description: 'Refresh authentication token',\n },\n\n // Federation methods\n 'federation/connect': {\n method: 'map/federation/connect',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Connect to federated system',\n },\n 'federation/route': {\n method: 'map/federation/route',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Route message to federated system',\n },\n\n // Notification methods (client → server)\n 'subscription/ack': {\n method: 'map/subscribe.ack',\n category: 'notification',\n capabilities: [],\n description: 'Acknowledge received events for backpressure flow control',\n },\n} as const;\n\n/**\n * Get methods by category\n */\nexport function getMethodsByCategory(category: MethodCategory): MethodInfo[] {\n return Object.values(METHOD_REGISTRY).filter((m) => m.category === category);\n}\n\n/**\n * Get required capabilities for a method\n */\nexport function getRequiredCapabilities(methodName: string): CapabilityPath[] {\n // Try direct lookup first\n const info = METHOD_REGISTRY[methodName];\n if (info) return info.capabilities;\n\n // Try finding by wire method name\n const byWire = Object.values(METHOD_REGISTRY).find((m) => m.method === methodName);\n return byWire?.capabilities ?? [];\n}\n\n/**\n * Check if capabilities satisfy method requirements\n */\nexport function hasRequiredCapabilities(\n methodName: string,\n capabilities: ParticipantCapabilities\n): boolean {\n const required = getRequiredCapabilities(methodName);\n if (required.length === 0) return true;\n\n for (const path of required) {\n const [category, capability] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n if (!categoryCapabilities?.[capability]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get method info by wire method name (e.g., 'map/agents/list')\n */\nexport function getMethodInfo(wireMethod: string): MethodInfo | undefined {\n return Object.values(METHOD_REGISTRY).find((m) => m.method === wireMethod);\n}\n\n// =============================================================================\n// Response Builders\n// =============================================================================\n\n/**\n * Build connect response\n */\nexport function buildConnectResponse(params: {\n protocolVersion: ProtocolVersion;\n sessionId: SessionId;\n participantId: ParticipantId;\n capabilities: ParticipantCapabilities;\n systemInfo?: { name?: string; version?: string };\n reconnected?: boolean;\n reclaimedAgents?: Agent[];\n ownedAgents?: string[];\n}): ConnectResponseResult {\n return {\n protocolVersion: params.protocolVersion,\n sessionId: params.sessionId,\n participantId: params.participantId,\n capabilities: params.capabilities,\n systemInfo: params.systemInfo,\n reconnected: params.reconnected,\n reclaimedAgents: params.reclaimedAgents,\n ownedAgents: params.ownedAgents,\n };\n}\n\n/**\n * Build disconnect response\n */\nexport function buildDisconnectResponse(session: SessionInfo): DisconnectResponseResult {\n return { session };\n}\n\n/**\n * Build send response\n */\nexport function buildSendResponse(\n messageId: MessageId,\n delivered: ParticipantId[]\n): SendResponseResult {\n return { messageId, delivered };\n}\n\n/**\n * Build agents/register response\n */\nexport function buildAgentsRegisterResponse(agent: Agent): AgentsRegisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/unregister response\n */\nexport function buildAgentsUnregisterResponse(agent: Agent): AgentsUnregisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/list response\n */\nexport function buildAgentsListResponse(agents: Agent[]): AgentsListResponseResult {\n return { agents };\n}\n\n/**\n * Build agents/get response\n */\nexport function buildAgentsGetResponse(\n agent: Agent,\n children?: Agent[],\n descendants?: Agent[]\n): AgentsGetResponseResult {\n const result: AgentsGetResponseResult = { agent };\n if (children) result.children = children;\n if (descendants) result.descendants = descendants;\n return result;\n}\n\n/**\n * Build agents/update response\n */\nexport function buildAgentsUpdateResponse(agent: Agent): AgentsUpdateResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/spawn response\n */\nexport function buildAgentsSpawnResponse(agent: Agent): AgentsSpawnResponseResult {\n return { agent };\n}\n\n/**\n * Build scopes/create response\n */\nexport function buildScopesCreateResponse(scope: Scope): ScopesCreateResponseResult {\n return { scope };\n}\n\n/**\n * Build scopes/list response\n */\nexport function buildScopesListResponse(scopes: Scope[]): ScopesListResponseResult {\n return { scopes };\n}\n\n/**\n * Build scopes/join response\n */\nexport function buildScopesJoinResponse(scope: Scope, agent: Agent): ScopesJoinResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build scopes/leave response\n */\nexport function buildScopesLeaveResponse(scope: Scope, agent: Agent): ScopesLeaveResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build subscribe response\n */\nexport function buildSubscribeResponse(subscriptionId: SubscriptionId): SubscribeResponseResult {\n return { subscriptionId };\n}\n\n/**\n * Build unsubscribe response\n */\nexport function buildUnsubscribeResponse(\n subscriptionId: SubscriptionId,\n closedAt: number = Date.now()\n): UnsubscribeResponseResult {\n return {\n subscription: {\n id: subscriptionId,\n closedAt,\n },\n };\n}\n","/**\n * Permission utilities for MAP SDK\n *\n * Provides building blocks for implementing the 4-layer permission model:\n * - Layer 1: System configuration (what's exposed at all)\n * - Layer 2: Client permissions (what can this client do)\n * - Layer 3: Scope permissions (what's allowed in this scope)\n * - Layer 4: Agent permissions (what can this agent do)\n *\n * These utilities are opt-in building blocks for router implementations.\n * They provide the logic for permission checks but don't enforce them.\n */\n\nimport type {\n Agent,\n AgentId,\n AgentPermissions,\n AgentPermissionConfig,\n AgentVisibilityRule,\n AgentVisibility,\n AgentAcceptanceRule,\n ClientAcceptanceRule,\n SystemAcceptanceRule,\n Scope,\n ScopeId,\n Event,\n EventType,\n ParticipantCapabilities,\n ParticipantId,\n ParticipantType,\n} from '../types';\nimport { getRequiredCapabilities, hasRequiredCapabilities } from '../protocol';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * System-level exposure configuration.\n * Controls what entities are visible to participants at all.\n */\nexport interface SystemExposure {\n agents?: {\n /** Whether agents are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for agents that are always public */\n publicAgents?: string[];\n /** Glob patterns for agents that are always hidden (takes precedence) */\n hiddenAgents?: string[];\n };\n events?: {\n /** Event types that are exposed (whitelist, if provided) */\n exposedTypes?: EventType[];\n /** Event types that are always hidden (blacklist) */\n hiddenTypes?: EventType[];\n };\n scopes?: {\n /** Whether scopes are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for scopes that are always public */\n publicScopes?: string[];\n /** Glob patterns for scopes that are always hidden (takes precedence) */\n hiddenScopes?: string[];\n };\n}\n\n/**\n * Full system configuration for permissions\n */\nexport interface PermissionSystemConfig {\n /** What entities are exposed to participants */\n exposure?: SystemExposure;\n /** Resource limits */\n limits?: {\n maxConnections?: number;\n maxConnectionsPerClient?: number;\n maxSubscriptionsPerConnection?: number;\n maxAgentsPerClient?: number;\n };\n}\n\n/**\n * Represents a connected participant for permission checks\n */\nexport interface PermissionParticipant {\n /** Participant ID */\n id: string;\n /** Participant type */\n type: ParticipantType;\n /** Granted capabilities */\n capabilities: ParticipantCapabilities;\n}\n\n/**\n * Context for permission checks\n */\nexport interface PermissionContext {\n /** System-wide configuration */\n system: PermissionSystemConfig;\n /** The participant performing the action */\n participant: PermissionParticipant;\n /** Agent IDs owned by this participant */\n ownedAgentIds?: AgentId[];\n /** Scope membership: scopeId -> agent IDs that are members */\n scopeMembership?: Map<ScopeId, AgentId[]>;\n}\n\n/**\n * Action being performed for permission checking\n */\nexport interface PermissionAction {\n /** Action category */\n type: 'query' | 'message' | 'lifecycle' | 'scope' | 'subscribe';\n /** Wire method name (e.g., 'map/agents/list') */\n method: string;\n /** Target of the action */\n target?: {\n agentId?: AgentId;\n scopeId?: ScopeId;\n eventTypes?: EventType[];\n };\n}\n\n/**\n * Result of a permission check\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** Reason for denial (if denied) */\n reason?: string;\n /** Which layer denied the action (if denied) */\n layer?: 1 | 2 | 3 | 4;\n}\n\n// =============================================================================\n// Layer 1: System Exposure Checks\n// =============================================================================\n\n/**\n * Check if an agent is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n * If no configuration, agents are exposed by default.\n *\n * @param exposure - System exposure configuration\n * @param agentId - Agent ID to check\n * @returns true if the agent is exposed\n */\nexport function isAgentExposed(\n exposure: SystemExposure | undefined,\n agentId: AgentId\n): boolean {\n if (!exposure?.agents) return true; // Default: exposed\n\n const {\n publicByDefault = true,\n publicAgents = [],\n hiddenAgents = [],\n } = exposure.agents;\n\n // Hidden takes precedence\n if (matchesPatterns(agentId, hiddenAgents)) return false;\n\n // Check public list\n if (matchesPatterns(agentId, publicAgents)) return true;\n\n return publicByDefault;\n}\n\n/**\n * Check if an event type is exposed by system configuration.\n *\n * Hidden types take precedence. If a whitelist is provided,\n * only those types are exposed.\n *\n * @param exposure - System exposure configuration\n * @param eventType - Event type to check\n * @returns true if the event type is exposed\n */\nexport function isEventTypeExposed(\n exposure: SystemExposure | undefined,\n eventType: EventType\n): boolean {\n if (!exposure?.events) return true;\n\n const { exposedTypes, hiddenTypes = [] } = exposure.events;\n\n // Hidden takes precedence\n if (hiddenTypes.includes(eventType)) return false;\n\n // If whitelist exists, must be in it\n if (exposedTypes && !exposedTypes.includes(eventType)) return false;\n\n return true;\n}\n\n/**\n * Check if a scope is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n *\n * @param exposure - System exposure configuration\n * @param scopeId - Scope ID to check\n * @returns true if the scope is exposed\n */\nexport function isScopeExposed(\n exposure: SystemExposure | undefined,\n scopeId: ScopeId\n): boolean {\n if (!exposure?.scopes) return true;\n\n const {\n publicByDefault = true,\n publicScopes = [],\n hiddenScopes = [],\n } = exposure.scopes;\n\n // Hidden takes precedence\n if (matchesPatterns(scopeId, hiddenScopes)) return false;\n\n // Check public list\n if (matchesPatterns(scopeId, publicScopes)) return true;\n\n return publicByDefault;\n}\n\n// =============================================================================\n// Layer 2: Client/Participant Capability Checks\n// =============================================================================\n\n/**\n * Check if a participant has a specific capability.\n *\n * @param capabilities - Participant's capabilities\n * @param path - Capability path like 'observation.canQuery'\n * @returns true if the capability is granted\n *\n * @example\n * ```typescript\n * if (hasCapability(participant.capabilities, 'lifecycle.canSpawn')) {\n * // Can spawn agents\n * }\n * ```\n */\nexport function hasCapability(\n capabilities: ParticipantCapabilities,\n path: string\n): boolean {\n const [category, cap] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n return categoryCapabilities?.[cap] ?? false;\n}\n\n/**\n * Check if a participant can perform a method based on capabilities.\n *\n * @param method - Wire method name (e.g., 'map/agents/list')\n * @param capabilities - Participant's capabilities\n * @returns true if all required capabilities are present\n */\nexport function canPerformMethod(\n method: string,\n capabilities: ParticipantCapabilities\n): boolean {\n return hasRequiredCapabilities(method, capabilities);\n}\n\n/**\n * Get the capabilities required for a method.\n *\n * @param method - Wire method name or registry key\n * @returns Array of capability paths\n */\nexport { getRequiredCapabilities };\n\n// =============================================================================\n// Layer 3: Scope Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can see the scope\n */\nexport function canSeeScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n const visibility = scope.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can send to the scope\n */\nexport function canSendToScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n // System can always send\n if (participant.type === 'system') return true;\n\n const sendPolicy = scope.sendPolicy ?? 'members';\n\n switch (sendPolicy) {\n case 'any':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can join a scope.\n *\n * @param scope - The scope to check\n * @param participantType - Type of the participant\n * @param agentRole - Role of the agent trying to join (for role-based policies)\n * @returns true if the participant can join the scope\n */\nexport function canJoinScope(\n scope: Scope,\n participantType: ParticipantType,\n agentRole?: string\n): boolean {\n const joinPolicy = scope.joinPolicy ?? 'open';\n\n switch (joinPolicy) {\n case 'open':\n return true;\n case 'invite':\n // Would need invitation tracking - simplified to false\n return false;\n case 'role':\n // Check if agent role matches auto-join roles\n if (!agentRole || !scope.autoJoinRoles) return false;\n return scope.autoJoinRoles.includes(agentRole);\n case 'system':\n return participantType === 'system';\n default:\n return false;\n }\n}\n\n// =============================================================================\n// Layer 4: Agent Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see an agent.\n *\n * @param agent - The agent to check\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can see the agent\n */\nexport function canSeeAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n const visibility = agent.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'parent-only':\n // Can see if we own the parent or the agent itself\n if (ownedAgentIds.includes(agent.id)) return true;\n return agent.parent ? ownedAgentIds.includes(agent.parent) : false;\n case 'scope':\n // Would need scope membership check - simplified to true\n // In practice, would check if participant has agent in same scope\n return true;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to an agent.\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can message the agent\n */\nexport function canMessageAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // Must be able to see the agent first\n if (!canSeeAgent(agent, participant, ownedAgentIds)) {\n return false;\n }\n\n // Additional messaging restrictions could be added here\n // For now, if you can see it, you can message it\n return true;\n}\n\n/**\n * Check if a participant can control an agent (stop, suspend, etc.).\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can control the agent\n */\nexport function canControlAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // System can control any agent\n if (participant.type === 'system') return true;\n\n // Must own the agent or its ancestor\n if (ownedAgentIds.includes(agent.id)) return true;\n\n // Check if we own an ancestor (parent chain)\n // This would need the full agent registry in practice\n // Simplified: just check direct parent\n if (agent.parent && ownedAgentIds.includes(agent.parent)) return true;\n\n return false;\n}\n\n// =============================================================================\n// High-Level Resolution\n// =============================================================================\n\n/**\n * Check if an action is permitted across all 4 layers.\n *\n * This is the main entry point for comprehensive permission checking.\n * It evaluates each layer in order and returns the first denial or success.\n *\n * @param context - Permission context with system config and participant info\n * @param action - The action to check\n * @returns Permission result with allowed status, reason, and layer\n *\n * @example\n * ```typescript\n * const result = canPerformAction(\n * {\n * system: { exposure: { agents: { hiddenAgents: ['internal-*'] } } },\n * participant: { id: 'client-1', type: 'client', capabilities },\n * ownedAgentIds: ['agent-1'],\n * },\n * {\n * type: 'query',\n * method: 'map/agents/get',\n * target: { agentId: 'internal-worker' },\n * }\n * );\n *\n * if (!result.allowed) {\n * console.log(`Denied at layer ${result.layer}: ${result.reason}`);\n * }\n * ```\n */\nexport function canPerformAction(\n context: PermissionContext,\n action: PermissionAction\n): PermissionResult {\n // Layer 1: System exposure\n if (action.target?.agentId) {\n if (!isAgentExposed(context.system.exposure, action.target.agentId)) {\n return {\n allowed: false,\n reason: 'Agent not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.scopeId) {\n if (!isScopeExposed(context.system.exposure, action.target.scopeId)) {\n return {\n allowed: false,\n reason: 'Scope not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.eventTypes) {\n for (const eventType of action.target.eventTypes) {\n if (!isEventTypeExposed(context.system.exposure, eventType)) {\n return {\n allowed: false,\n reason: `Event type '${eventType}' not exposed by system configuration`,\n layer: 1,\n };\n }\n }\n }\n\n // Layer 2: Participant capabilities\n const requiredCaps = getRequiredCapabilities(action.method);\n for (const cap of requiredCaps) {\n if (!hasCapability(context.participant.capabilities, cap)) {\n return {\n allowed: false,\n reason: `Missing required capability: ${cap}`,\n layer: 2,\n };\n }\n }\n\n // Layer 3 and 4 would require actual entity lookups\n // These are handled by the filtering utilities below\n\n return { allowed: true };\n}\n\n// =============================================================================\n// Filtering Utilities\n// =============================================================================\n\n/**\n * Filter agents to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 4 (agent visibility).\n *\n * @param agents - Agents to filter\n * @param context - Permission context\n * @returns Filtered list of visible agents\n */\nexport function filterVisibleAgents(\n agents: Agent[],\n context: PermissionContext\n): Agent[] {\n const ownedAgentIds = context.ownedAgentIds ?? [];\n\n return agents.filter((agent) => {\n // Layer 1: System exposure\n if (!isAgentExposed(context.system.exposure, agent.id)) {\n return false;\n }\n\n // Layer 4: Agent visibility\n if (!canSeeAgent(agent, context.participant, ownedAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter scopes to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 3 (scope visibility).\n *\n * @param scopes - Scopes to filter\n * @param context - Permission context\n * @returns Filtered list of visible scopes\n */\nexport function filterVisibleScopes(\n scopes: Scope[],\n context: PermissionContext\n): Scope[] {\n const scopeMembership = context.scopeMembership ?? new Map();\n\n return scopes.filter((scope) => {\n // Layer 1: System exposure\n if (!isScopeExposed(context.system.exposure, scope.id)) {\n return false;\n }\n\n // Layer 3: Scope visibility\n const memberAgentIds = scopeMembership.get(scope.id) ?? [];\n if (!canSeeScope(scope, context.participant, memberAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter events to only those visible to the participant.\n *\n * Applies Layer 1 (system exposure) for event types.\n *\n * @param events - Events to filter\n * @param context - Permission context\n * @returns Filtered list of visible events\n */\nexport function filterVisibleEvents(\n events: Event[],\n context: PermissionContext\n): Event[] {\n return events.filter((event) => {\n // Layer 1: Event type exposure\n if (!isEventTypeExposed(context.system.exposure, event.type)) {\n return false;\n }\n\n // Additional filtering based on event source could be added here\n // e.g., filter out events from hidden agents\n\n return true;\n });\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Check if a value matches any of the glob patterns.\n *\n * @param value - Value to check\n * @param patterns - Glob patterns (supports * and ? wildcards)\n * @returns true if value matches any pattern\n */\nfunction matchesPatterns(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => matchGlob(value, pattern));\n}\n\n/**\n * Simple glob matching supporting * and ? wildcards.\n *\n * @param value - Value to match\n * @param pattern - Glob pattern\n * @returns true if value matches pattern\n */\nfunction matchGlob(value: string, pattern: string): boolean {\n // Escape special regex characters except * and ?\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(value);\n}\n\n// =============================================================================\n// Agent Permission Resolution (Hybrid Model)\n// =============================================================================\n\n/**\n * Deep clone an object (simple implementation for permission objects)\n */\nfunction deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Deep merge two permission objects.\n * Second object's fields override first at the leaf level.\n *\n * @param base - Base permissions\n * @param override - Override permissions (partial)\n * @returns Merged permissions\n */\nexport function deepMergePermissions(\n base: AgentPermissions,\n override: Partial<AgentPermissions>\n): AgentPermissions {\n const result: AgentPermissions = { ...base };\n\n if (override.canSee) {\n result.canSee = { ...base.canSee, ...override.canSee };\n }\n if (override.canMessage) {\n result.canMessage = { ...base.canMessage, ...override.canMessage };\n }\n if (override.acceptsFrom) {\n result.acceptsFrom = { ...base.acceptsFrom, ...override.acceptsFrom };\n }\n\n return result;\n}\n\n/**\n * Map legacy AgentVisibility to AgentVisibilityRule.\n *\n * @param visibility - Legacy visibility value\n * @returns Equivalent visibility rule\n */\nexport function mapVisibilityToRule(visibility: AgentVisibility): AgentVisibilityRule {\n switch (visibility) {\n case 'public':\n return 'all';\n case 'parent-only':\n return 'hierarchy';\n case 'scope':\n return 'scoped';\n case 'system':\n return 'direct';\n default:\n return 'all';\n }\n}\n\n/**\n * Default agent permission configuration.\n * Used when no configuration is provided.\n */\nexport const DEFAULT_AGENT_PERMISSION_CONFIG: AgentPermissionConfig = {\n defaultPermissions: {\n canSee: {\n agents: 'all',\n scopes: 'all',\n structure: 'full',\n },\n canMessage: {\n agents: 'all',\n scopes: 'all',\n },\n acceptsFrom: {\n agents: 'all',\n clients: 'all',\n systems: 'all',\n },\n },\n rolePermissions: {},\n};\n\n/**\n * Resolve effective permissions for an agent.\n *\n * Resolution order:\n * 1. Start with system default permissions\n * 2. If agent has a role, deep merge role permissions\n * 3. Deep merge agent's permissionOverrides\n * 4. (Backwards compat) Map legacy visibility field if no override\n *\n * @param agent - The agent to resolve permissions for\n * @param config - System permission configuration\n * @returns Resolved effective permissions\n *\n * @example\n * ```typescript\n * const config: AgentPermissionConfig = {\n * defaultPermissions: { canSee: { agents: 'all' } },\n * rolePermissions: {\n * worker: { canSee: { agents: 'hierarchy' } },\n * },\n * };\n *\n * const agent = { id: 'a1', role: 'worker', ownerId: 'c1', state: 'active' };\n * const perms = resolveAgentPermissions(agent, config);\n * // perms.canSee.agents === 'hierarchy'\n * ```\n */\nexport function resolveAgentPermissions(\n agent: Agent,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): AgentPermissions {\n // Start with defaults\n let permissions = deepClone(config.defaultPermissions);\n\n // Apply role permissions\n if (agent.role && config.rolePermissions[agent.role]) {\n permissions = deepMergePermissions(permissions, config.rolePermissions[agent.role]);\n }\n\n // Apply agent overrides\n if (agent.permissionOverrides) {\n permissions = deepMergePermissions(permissions, agent.permissionOverrides);\n }\n\n // Backwards compatibility: map legacy visibility\n if (agent.visibility && !agent.permissionOverrides?.canSee?.agents) {\n permissions.canSee = permissions.canSee ?? {};\n permissions.canSee.agents = mapVisibilityToRule(agent.visibility);\n }\n\n return permissions;\n}\n\n// =============================================================================\n// Agent Acceptance Checks\n// =============================================================================\n\n/**\n * Context for checking if an agent accepts messages from a sender.\n */\nexport interface AcceptanceContext {\n /** Type of the sender */\n senderType: ParticipantType;\n /** Participant ID of the sender */\n senderId: ParticipantId;\n /** If sender is an agent, its agent ID */\n senderAgentId?: AgentId;\n /** If sender is from a federated system, its system ID */\n senderSystemId?: string;\n\n // Hierarchy info for 'hierarchy' rules\n /** Whether sender is the parent of target */\n isParent?: boolean;\n /** Whether sender is a child of target */\n isChild?: boolean;\n /** Whether sender is an ancestor of target */\n isAncestor?: boolean;\n /** Whether sender is a descendant of target */\n isDescendant?: boolean;\n\n // Scope info for 'scoped' rules\n /** Scope IDs that both sender and target are members of */\n sharedScopes?: ScopeId[];\n}\n\n/**\n * Check if an agent acceptance rule allows the sender.\n */\nfunction checkAgentAcceptance(\n rule: AgentAcceptanceRule | undefined,\n context: AcceptanceContext\n): boolean {\n if (!rule || rule === 'all') return true;\n\n if (rule === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (rule === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof rule === 'object' && 'include' in rule) {\n return context.senderAgentId !== undefined && rule.include.includes(context.senderAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if a client acceptance rule allows the sender.\n */\nfunction checkClientAcceptance(\n rule: ClientAcceptanceRule | undefined,\n senderId: ParticipantId\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return rule.include.includes(senderId);\n }\n\n return false;\n}\n\n/**\n * Check if a system acceptance rule allows the sender.\n */\nfunction checkSystemAcceptance(\n rule: SystemAcceptanceRule | undefined,\n senderSystemId: string | undefined\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return senderSystemId !== undefined && rule.include.includes(senderSystemId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent accepts messages from the given sender.\n *\n * Uses the agent's resolved permissions to determine if the sender\n * is allowed based on sender type and acceptance rules.\n *\n * @param targetAgent - The agent that would receive the message\n * @param context - Information about the sender\n * @param config - System permission configuration\n * @returns true if the agent accepts messages from this sender\n *\n * @example\n * ```typescript\n * const accepts = canAgentAcceptMessage(\n * targetAgent,\n * {\n * senderType: 'agent',\n * senderId: 'client-1',\n * senderAgentId: 'agent-2',\n * isParent: true,\n * },\n * config\n * );\n * ```\n */\nexport function canAgentAcceptMessage(\n targetAgent: Agent,\n context: AcceptanceContext,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(targetAgent, config);\n const acceptsFrom = permissions.acceptsFrom;\n\n // No restrictions = accept all\n if (!acceptsFrom) return true;\n\n // Check based on sender type\n switch (context.senderType) {\n case 'agent':\n return checkAgentAcceptance(acceptsFrom.agents, context);\n case 'client':\n return checkClientAcceptance(acceptsFrom.clients, context.senderId);\n case 'system':\n case 'gateway':\n return checkSystemAcceptance(acceptsFrom.systems, context.senderSystemId);\n default:\n return false;\n }\n}\n\n/**\n * Check if an agent can see another agent based on permissions.\n *\n * @param viewerAgent - The agent trying to see\n * @param targetAgentId - ID of the agent being viewed\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if viewer can see target\n */\nexport function canAgentSeeAgent(\n viewerAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(viewerAgent, config);\n const canSee = permissions.canSee?.agents;\n\n if (!canSee || canSee === 'all') return true;\n\n if (canSee === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canSee === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (canSee === 'direct') {\n // Direct means explicit allowlist only\n return false;\n }\n\n if (typeof canSee === 'object' && 'include' in canSee) {\n return canSee.include.includes(targetAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent can message another agent based on permissions.\n *\n * @param senderAgent - The agent sending the message\n * @param targetAgentId - ID of the target agent\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if sender can message target\n */\nexport function canAgentMessageAgent(\n senderAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(senderAgent, config);\n const canMessage = permissions.canMessage?.agents;\n\n if (!canMessage || canMessage === 'all') return true;\n\n if (canMessage === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canMessage === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof canMessage === 'object' && 'include' in canMessage) {\n return canMessage.include.includes(targetAgentId);\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"sources":["../src/types/index.ts","../src/jsonrpc/index.ts","../src/errors/index.ts","../src/stream/index.ts","../src/subscription/index.ts","../src/connection/base.ts","../src/utils/ulid.ts","../src/utils/retry.ts","../src/utils/causal-buffer.ts","../src/connection/client.ts","../src/connection/agent.ts","../src/federation/envelope.ts","../src/federation/buffer.ts","../src/connection/gateway.ts","../src/schema/zod.gen.ts","../src/protocol/index.ts","../src/permissions/index.ts","../src/server/messages/address.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 /** Token to resume a previously disconnected session */\n resumeToken?: string;\n /** Reclaim orphaned agents from previous connection */\n reclaimAgents?: AgentId[];\n /** Policy for unexpected disconnect */\n disconnectPolicy?: DisconnectPolicy;\n 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 /** Token to resume this session later */\n resumeToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Session Request/Response Types\n// =============================================================================\n\nexport interface SessionListRequestParams {\n _meta?: Meta;\n}\n\nexport interface SessionListRequest extends MAPRequestBase<SessionListRequestParams> {\n method: 'map/session/list';\n params?: SessionListRequestParams;\n}\n\nexport interface SessionListResponseResult {\n sessions: SessionInfo[];\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequestParams {\n sessionId: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequest extends MAPRequestBase<SessionLoadRequestParams> {\n method: 'map/session/load';\n params: SessionLoadRequestParams;\n}\n\nexport interface SessionLoadResponseResult {\n sessionId: SessionId;\n restored: boolean;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequestParams {\n sessionId?: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequest extends MAPRequestBase<SessionCloseRequestParams> {\n method: 'map/session/close';\n params?: SessionCloseRequestParams;\n}\n\nexport interface SessionCloseResponseResult {\n session: SessionInfo;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Agents Request/Response Types\n// =============================================================================\n\nexport interface AgentsListFilter {\n states?: AgentState[];\n roles?: string[];\n scopes?: ScopeId[];\n parent?: AgentId;\n hasChildren?: boolean;\n ownerId?: ParticipantId;\n}\n\nexport interface AgentsListRequestParams {\n filter?: AgentsListFilter;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsListRequest extends MAPRequestBase<AgentsListRequestParams> {\n method: 'map/agents/list';\n params?: AgentsListRequestParams;\n}\n\nexport interface AgentsListResponseResult {\n agents: Agent[];\n nextCursor?: string;\n _meta?: Meta;\n}\n\n/** Options for expanding related agents */\nexport interface AgentIncludeOptions {\n parent?: boolean;\n children?: boolean;\n siblings?: boolean;\n ancestors?: boolean;\n descendants?: boolean;\n maxDepth?: number;\n}\n\nexport interface AgentsGetRequestParams {\n agentId: AgentId;\n include?: AgentIncludeOptions;\n _meta?: Meta;\n}\n\nexport interface AgentsGetRequest extends MAPRequestBase<AgentsGetRequestParams> {\n method: 'map/agents/get';\n params: AgentsGetRequestParams;\n}\n\nexport interface AgentsGetResponseResult {\n agent: Agent;\n parent?: Agent;\n children?: Agent[];\n siblings?: Agent[];\n ancestors?: Agent[];\n descendants?: Agent[];\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n metadata?: Record<string, unknown>;\n /** Permission overrides merged on top of role-based defaults */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequest extends MAPRequestBase<AgentsRegisterRequestParams> {\n method: 'map/agents/register';\n params?: AgentsRegisterRequestParams;\n}\n\nexport interface AgentsRegisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequest extends MAPRequestBase<AgentsUnregisterRequestParams> {\n method: 'map/agents/unregister';\n params: AgentsUnregisterRequestParams;\n}\n\nexport interface AgentsUnregisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequestParams {\n agentId: AgentId;\n state?: AgentState;\n metadata?: Record<string, unknown>;\n /**\n * Permission overrides to apply to the agent.\n * Merged on top of role-based defaults.\n */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequest extends MAPRequestBase<AgentsUpdateRequestParams> {\n method: 'map/agents/update';\n params: AgentsUpdateRequestParams;\n}\n\nexport interface AgentsUpdateResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n initialMessage?: Message;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequest extends MAPRequestBase<AgentsSpawnRequestParams> {\n method: 'map/agents/spawn';\n params?: AgentsSpawnRequestParams;\n}\n\nexport interface AgentsSpawnResponseResult {\n agent: Agent;\n messageId?: MessageId;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequestParams {\n agentId: AgentId;\n reason?: string;\n force?: boolean;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequest extends MAPRequestBase<AgentsStopRequestParams> {\n method: 'map/agents/stop';\n params: AgentsStopRequestParams;\n}\n\nexport interface AgentsStopResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequest extends MAPRequestBase<AgentsSuspendRequestParams> {\n method: 'map/agents/suspend';\n params: AgentsSuspendRequestParams;\n}\n\nexport interface AgentsSuspendResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequestParams {\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequest extends MAPRequestBase<AgentsResumeRequestParams> {\n method: 'map/agents/resume';\n params: AgentsResumeRequestParams;\n}\n\nexport interface AgentsResumeResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Send Types\n// =============================================================================\n\nexport interface SendRequestParams {\n to: Address;\n payload?: unknown;\n meta?: MessageMeta;\n _meta?: Meta;\n}\n\nexport interface SendRequest extends MAPRequestBase<SendRequestParams> {\n method: 'map/send';\n params: SendRequestParams;\n}\n\nexport interface SendResponseResult {\n messageId: MessageId;\n delivered?: ParticipantId[];\n _meta?: Meta;\n}\n\n// =============================================================================\n// Subscribe Types\n// =============================================================================\n\nexport interface SubscribeRequestParams {\n filter?: SubscriptionFilter;\n options?: SubscriptionOptions;\n replayFrom?: Timestamp | string;\n _meta?: Meta;\n}\n\nexport interface SubscribeRequest extends MAPRequestBase<SubscribeRequestParams> {\n method: 'map/subscribe';\n params?: SubscribeRequestParams;\n}\n\nexport interface SubscribeResponseResult {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequestParams {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequest extends MAPRequestBase<UnsubscribeRequestParams> {\n method: 'map/unsubscribe';\n params: UnsubscribeRequestParams;\n}\n\nexport interface UnsubscribeResponseResult {\n subscription: {\n id: SubscriptionId;\n closedAt: Timestamp;\n };\n _meta?: Meta;\n}\n\n// =============================================================================\n// Replay Types\n// =============================================================================\n\n/**\n * A replayed event with its envelope metadata.\n */\nexport interface ReplayedEvent {\n /** Globally unique event ID (ULID format) */\n eventId: string;\n /** Server timestamp when event was originally processed */\n timestamp: Timestamp;\n /** Event IDs that causally precede this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n}\n\n/**\n * Parameters for replaying historical events.\n *\n * Uses keyset pagination with `afterEventId` - pass the last eventId\n * from the previous response to get the next page of results.\n *\n * @example\n * ```typescript\n * // Replay from a specific point\n * const page1 = await client.replay({ limit: 100 });\n * const page2 = await client.replay({\n * afterEventId: page1.events.at(-1)?.eventId,\n * limit: 100\n * });\n * ```\n */\nexport interface ReplayRequestParams {\n /**\n * Start after this eventId (exclusive).\n * Used for keyset pagination - pass the last eventId from previous response.\n */\n afterEventId?: string;\n\n /**\n * Alternative: start from this timestamp (inclusive).\n * If both afterEventId and fromTimestamp are provided, afterEventId takes precedence.\n */\n fromTimestamp?: Timestamp;\n\n /**\n * End at this timestamp (inclusive).\n * If not provided, replays up to the most recent event.\n */\n toTimestamp?: Timestamp;\n\n /**\n * Filter events (same as subscription filter).\n */\n filter?: SubscriptionFilter;\n\n /**\n * Maximum number of events to return.\n * Default: 100, Maximum: 1000\n */\n limit?: number;\n\n _meta?: Meta;\n}\n\nexport interface ReplayRequest extends MAPRequestBase<ReplayRequestParams> {\n method: 'map/replay';\n params?: ReplayRequestParams;\n}\n\nexport interface ReplayResponseResult {\n /** Replayed events in chronological order */\n events: ReplayedEvent[];\n\n /** Whether more events exist after the last returned event */\n hasMore: boolean;\n\n /**\n * Total count of matching events (if known).\n * May be omitted for performance reasons on large result sets.\n */\n totalCount?: number;\n\n _meta?: Meta;\n}\n\n// =============================================================================\n// Auth Types\n// =============================================================================\n\nexport interface AuthRefreshRequestParams {\n refreshToken: string;\n _meta?: Meta;\n}\n\nexport interface AuthRefreshRequest extends MAPRequestBase<AuthRefreshRequestParams> {\n method: 'map/auth/refresh';\n params: AuthRefreshRequestParams;\n}\n\nexport interface AuthRefreshResponseResult {\n accessToken: string;\n expiresAt: Timestamp;\n refreshToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// 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 * JSON-RPC 2.0 utilities for MAP protocol\n */\n\nimport type { RequestId, MAPError } from '../types';\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = '2.0' as const;\n\n/**\n * Generic JSON-RPC request structure\n */\nexport interface JsonRpcRequest<TParams = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC notification structure (no id)\n */\nexport interface JsonRpcNotification<TParams = unknown> {\n jsonrpc: '2.0';\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC success response\n */\nexport interface JsonRpcSuccessResponse<TResult = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n result: TResult;\n}\n\n/**\n * Generic JSON-RPC error response\n */\nexport interface JsonRpcErrorResponse {\n jsonrpc: '2.0';\n id: RequestId;\n error: MAPError;\n}\n\n/**\n * Any JSON-RPC response\n */\nexport type JsonRpcResponse<TResult = unknown> =\n | JsonRpcSuccessResponse<TResult>\n | JsonRpcErrorResponse;\n\n/**\n * Any JSON-RPC message\n */\nexport type JsonRpcMessage =\n | JsonRpcRequest\n | JsonRpcNotification\n | JsonRpcResponse;\n\n/**\n * Check if a message is a request (has id and method)\n */\nexport function isRequest(message: unknown): message is JsonRpcRequest {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n 'method' in message\n );\n}\n\n/**\n * Check if a message is a notification (has method but no id)\n */\nexport function isNotification(message: unknown): message is JsonRpcNotification {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'method' in message &&\n !('id' in message)\n );\n}\n\n/**\n * Check if a message is a response (has id but no method)\n */\nexport function isResponse(message: unknown): message is JsonRpcResponse {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n !('method' in message)\n );\n}\n\n/**\n * Check if a response is an error response\n */\nexport function isErrorResponse(\n response: JsonRpcResponse\n): response is JsonRpcErrorResponse {\n return 'error' in response;\n}\n\n/**\n * Check if a response is a success response\n */\nexport function isSuccessResponse<T>(\n response: JsonRpcResponse<T>\n): response is JsonRpcSuccessResponse<T> {\n return 'result' in response;\n}\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest<TParams>(\n id: RequestId,\n method: string,\n params?: TParams\n): JsonRpcRequest<TParams> {\n const request: JsonRpcRequest<TParams> = {\n jsonrpc: '2.0',\n id,\n method,\n };\n if (params !== undefined) {\n request.params = params;\n }\n return request;\n}\n\n/**\n * Create a JSON-RPC notification\n */\nexport function createNotification<TParams>(\n method: string,\n params?: TParams\n): JsonRpcNotification<TParams> {\n const notification: JsonRpcNotification<TParams> = {\n jsonrpc: '2.0',\n method,\n };\n if (params !== undefined) {\n notification.params = params;\n }\n return notification;\n}\n\n/**\n * Create a JSON-RPC success response\n */\nexport function createSuccessResponse<TResult>(\n id: RequestId,\n result: TResult\n): JsonRpcSuccessResponse<TResult> {\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n}\n\n/**\n * Create a JSON-RPC error response\n */\nexport function createErrorResponse(\n id: RequestId,\n error: MAPError\n): JsonRpcErrorResponse {\n return {\n jsonrpc: '2.0',\n id,\n error,\n };\n}\n","/**\n * Error classes for MAP protocol\n */\n\nimport type { MAPError, MAPErrorData, ErrorCategory, RequestId } from '../types';\nimport {\n PROTOCOL_ERROR_CODES,\n AUTH_ERROR_CODES,\n ROUTING_ERROR_CODES,\n AGENT_ERROR_CODES,\n RESOURCE_ERROR_CODES,\n FEDERATION_ERROR_CODES,\n} from '../types';\nimport { createErrorResponse, type JsonRpcErrorResponse } from '../jsonrpc';\n\n/**\n * Error thrown when a MAP request fails.\n *\n * Extends Error with JSON-RPC error properties and provides\n * factory methods for common error types.\n */\nexport class MAPRequestError extends Error {\n readonly code: number;\n readonly data?: MAPErrorData;\n\n constructor(code: number, message: string, data?: MAPErrorData) {\n super(message);\n this.name = 'MAPRequestError';\n this.code = code;\n this.data = data;\n }\n\n /**\n * Convert to MAP error object\n */\n toError(): MAPError {\n const error: MAPError = {\n code: this.code,\n message: this.message,\n };\n if (this.data) {\n error.data = this.data;\n }\n return error;\n }\n\n /**\n * Convert to JSON-RPC error response\n */\n toResponse(id: RequestId): JsonRpcErrorResponse {\n return createErrorResponse(id, this.toError());\n }\n\n // ==========================================================================\n // Protocol Errors (-32xxx)\n // ==========================================================================\n\n static parseError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.PARSE_ERROR,\n details ?? 'Parse error',\n { category: 'protocol' }\n );\n }\n\n static invalidRequest(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_REQUEST,\n details ?? 'Invalid request',\n { category: 'protocol' }\n );\n }\n\n static methodNotFound(method: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.METHOD_NOT_FOUND,\n `Method not found: ${method}`,\n { category: 'protocol' }\n );\n }\n\n static invalidParams(details?: unknown): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_PARAMS,\n 'Invalid params',\n { category: 'protocol', details: details as Record<string, unknown> }\n );\n }\n\n static internalError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INTERNAL_ERROR,\n details ?? 'Internal error',\n { category: 'internal' }\n );\n }\n\n // ==========================================================================\n // Auth Errors (1xxx)\n // ==========================================================================\n\n static authRequired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_REQUIRED,\n 'Authentication required',\n { category: 'auth' }\n );\n }\n\n static authFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_FAILED,\n details ?? 'Authentication failed',\n { category: 'auth' }\n );\n }\n\n static tokenExpired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.TOKEN_EXPIRED,\n 'Token expired',\n { category: 'auth', retryable: true }\n );\n }\n\n static permissionDenied(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.PERMISSION_DENIED,\n required ? `Permission denied: ${required}` : 'Permission denied',\n { category: 'auth' }\n );\n }\n\n // ==========================================================================\n // Routing Errors (2xxx)\n // ==========================================================================\n\n static addressNotFound(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_NOT_FOUND,\n `Address not found: ${address}`,\n { category: 'routing' }\n );\n }\n\n static agentNotFound(agentId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.AGENT_NOT_FOUND,\n `Agent not found: ${agentId}`,\n { category: 'routing' }\n );\n }\n\n static scopeNotFound(scopeId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.SCOPE_NOT_FOUND,\n `Scope not found: ${scopeId}`,\n { category: 'routing' }\n );\n }\n\n static deliveryFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.DELIVERY_FAILED,\n details ?? 'Message delivery failed',\n { category: 'routing', retryable: true }\n );\n }\n\n static addressAmbiguous(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_AMBIGUOUS,\n `Address is ambiguous: ${address}`,\n { category: 'routing' }\n );\n }\n\n // ==========================================================================\n // Agent Errors (3xxx)\n // ==========================================================================\n\n static agentExists(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.AGENT_EXISTS,\n `Agent already exists: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static stateInvalid(currentState: string, requestedAction: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.STATE_INVALID,\n `Cannot ${requestedAction} agent in state: ${currentState}`,\n { category: 'agent' }\n );\n }\n\n static agentNotResponding(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.NOT_RESPONDING,\n `Agent not responding: ${agentId}`,\n { category: 'agent', retryable: true }\n );\n }\n\n static agentTerminated(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.TERMINATED,\n `Agent terminated: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static spawnFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.SPAWN_FAILED,\n details ?? 'Failed to spawn agent',\n { category: 'agent' }\n );\n }\n\n // ==========================================================================\n // Resource Errors (4xxx)\n // ==========================================================================\n\n static resourceExhausted(resource?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.EXHAUSTED,\n resource ? `Resource exhausted: ${resource}` : 'Resource exhausted',\n { category: 'resource', retryable: true }\n );\n }\n\n static rateLimited(retryAfterMs?: number): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.RATE_LIMITED,\n 'Rate limited',\n { category: 'resource', retryable: true, retryAfterMs }\n );\n }\n\n static quotaExceeded(quota?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.QUOTA_EXCEEDED,\n quota ? `Quota exceeded: ${quota}` : 'Quota exceeded',\n { category: 'resource' }\n );\n }\n\n // ==========================================================================\n // Federation Errors (5xxx)\n // ==========================================================================\n\n static federationUnavailable(systemId?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_UNAVAILABLE,\n systemId ? `Federation unavailable: ${systemId}` : 'Federation unavailable',\n { category: 'federation', retryable: true }\n );\n }\n\n static federationSystemNotFound(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_SYSTEM_NOT_FOUND,\n `System not found: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationAuthFailed(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_AUTH_FAILED,\n `Federation authentication failed: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationRouteRejected(systemId: string, reason?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n reason ? `Route rejected by ${systemId}: ${reason}` : `Route rejected by ${systemId}`,\n { category: 'federation' }\n );\n }\n\n // ==========================================================================\n // Utility\n // ==========================================================================\n\n /**\n * Create from a MAP error object\n */\n static fromError(error: MAPError): MAPRequestError {\n return new MAPRequestError(error.code, error.message, error.data);\n }\n\n /**\n * Check if this error is retryable\n */\n get retryable(): boolean {\n return this.data?.retryable ?? false;\n }\n\n /**\n * Get retry delay in milliseconds, if specified\n */\n get retryAfterMs(): number | undefined {\n return this.data?.retryAfterMs;\n }\n\n /**\n * Get error category\n */\n get category(): ErrorCategory | undefined {\n return this.data?.category;\n }\n}\n\n/**\n * Error thrown when a connection is closed unexpectedly\n */\nexport class MAPConnectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MAPConnectionError';\n }\n\n static closed(): MAPConnectionError {\n return new MAPConnectionError('Connection closed');\n }\n\n static timeout(): MAPConnectionError {\n return new MAPConnectionError('Connection timeout');\n }\n}\n\n/**\n * Error thrown when an operation times out\n */\nexport class MAPTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(operation: string, timeoutMs: number) {\n super(`Operation timed out after ${timeoutMs}ms: ${operation}`);\n this.name = 'MAPTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n","/**\n * Stream utilities for MAP protocol transport\n *\n * Provides helpers for converting byte streams to/from MAP message streams.\n */\n\nimport type { MAPRequest, MAPResponse, MAPNotification } from '../types';\n\n/** Any MAP message type */\nexport type AnyMessage = MAPRequest | MAPResponse | MAPNotification | Record<string, unknown>;\n\n/**\n * Bidirectional message stream interface.\n * This is the transport abstraction that connection classes use.\n */\nexport interface Stream {\n writable: WritableStream<AnyMessage>;\n readable: ReadableStream<AnyMessage>;\n}\n\n/**\n * Converts raw byte streams to newline-delimited JSON message streams.\n *\n * This is the primary transport adapter - works with any byte stream\n * (stdio, TCP socket, etc.)\n *\n * @param readable - Input byte stream\n * @param writable - Output byte stream\n * @returns Stream interface for MAP messages\n */\nexport function ndJsonStream(\n readable: ReadableStream<Uint8Array>,\n writable: WritableStream<Uint8Array>\n): Stream {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n\n // Buffer for incomplete lines\n let buffer = '';\n\n const messageReadable = new ReadableStream<AnyMessage>({\n async start(controller) {\n const reader = readable.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // Process any remaining buffer content\n if (buffer.trim()) {\n try {\n const message = JSON.parse(buffer.trim());\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse final message:', buffer);\n }\n }\n controller.close();\n break;\n }\n\n // Decode bytes and add to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n try {\n const message = JSON.parse(trimmed);\n controller.enqueue(message);\n } catch {\n console.error('MAP: Failed to parse message:', trimmed);\n }\n }\n }\n }\n } catch (error) {\n controller.error(error);\n } finally {\n reader.releaseLock();\n }\n },\n });\n\n const messageWritable = new WritableStream<AnyMessage>({\n async write(message) {\n const writer = writable.getWriter();\n try {\n const json = JSON.stringify(message) + '\\n';\n await writer.write(encoder.encode(json));\n } finally {\n writer.releaseLock();\n }\n },\n async close() {\n await writable.close();\n },\n abort(reason) {\n writable.abort(reason);\n },\n });\n\n return {\n readable: messageReadable,\n writable: messageWritable,\n };\n}\n\n/**\n * Wraps a WebSocket in a Stream interface.\n *\n * @param ws - WebSocket instance (must be open or will wait for open)\n * @returns Stream interface for MAP messages\n */\nexport function websocketStream(ws: WebSocket): Stream {\n // Queue for messages received before reader is ready\n const messageQueue: AnyMessage[] = [];\n let messageResolver: ((value: IteratorResult<AnyMessage>) => void) | null = null;\n let closed = false;\n let closeError: Error | null = null;\n\n // Handle incoming messages\n ws.addEventListener('message', (event) => {\n try {\n const message = JSON.parse(event.data as string);\n if (messageResolver) {\n messageResolver({ value: message, done: false });\n messageResolver = null;\n } else {\n messageQueue.push(message);\n }\n } catch {\n console.error('MAP: Failed to parse WebSocket message:', event.data);\n }\n });\n\n ws.addEventListener('close', () => {\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n ws.addEventListener('error', () => {\n closeError = new Error('WebSocket error');\n closed = true;\n if (messageResolver) {\n messageResolver({ value: undefined as unknown as AnyMessage, done: true });\n messageResolver = null;\n }\n });\n\n const readable = new ReadableStream<AnyMessage>({\n async pull(controller) {\n if (messageQueue.length > 0) {\n controller.enqueue(messageQueue.shift()!);\n return;\n }\n\n if (closed) {\n if (closeError) {\n controller.error(closeError);\n } else {\n controller.close();\n }\n return;\n }\n\n // Wait for next message\n await new Promise<IteratorResult<AnyMessage>>((resolve) => {\n messageResolver = resolve;\n }).then((result) => {\n if (result.done) {\n controller.close();\n } else {\n controller.enqueue(result.value);\n }\n });\n },\n });\n\n const writable = new WritableStream<AnyMessage>({\n async write(message) {\n if (ws.readyState === WebSocket.CONNECTING) {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.removeEventListener('error', onError);\n resolve();\n };\n const onError = () => {\n ws.removeEventListener('open', onOpen);\n reject(new Error('WebSocket failed to connect'));\n };\n ws.addEventListener('open', onOpen, { once: true });\n ws.addEventListener('error', onError, { once: true });\n });\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not open');\n }\n\n ws.send(JSON.stringify(message));\n },\n close() {\n ws.close();\n },\n abort() {\n ws.close();\n },\n });\n\n return { readable, writable };\n}\n\n/**\n * Wait for a WebSocket to open with timeout.\n *\n * @param ws - WebSocket instance\n * @param timeoutMs - Timeout in milliseconds (default: 10000)\n * @returns Promise that resolves when WebSocket is open\n * @throws Error if connection times out or fails\n */\nexport function waitForOpen(ws: WebSocket, timeoutMs = 10000): Promise<void> {\n return new Promise((resolve, reject) => {\n if (ws.readyState === WebSocket.OPEN) {\n resolve();\n return;\n }\n\n const timeout = setTimeout(() => {\n ws.close();\n reject(new Error(`WebSocket connection timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onOpen = () => {\n clearTimeout(timeout);\n ws.removeEventListener(\"error\", onError);\n resolve();\n };\n\n const onError = () => {\n clearTimeout(timeout);\n ws.removeEventListener(\"open\", onOpen);\n reject(new Error(\"WebSocket connection failed\"));\n };\n\n ws.addEventListener(\"open\", onOpen, { once: true });\n ws.addEventListener(\"error\", onError, { once: true });\n });\n}\n\n/**\n * Creates a pair of connected in-memory streams for testing.\n *\n * Messages written to one stream's writable appear on the other's readable.\n *\n * @returns Tuple of [clientStream, serverStream]\n */\nexport function createStreamPair(): [Stream, Stream] {\n // Queues for each direction\n const clientToServer: AnyMessage[] = [];\n const serverToClient: AnyMessage[] = [];\n\n // Resolvers for blocking reads\n let clientToServerResolver: ((msg: AnyMessage) => void) | null = null;\n let serverToClientResolver: ((msg: AnyMessage) => void) | null = null;\n\n // Closed flags\n let clientToServerClosed = false;\n let serverToClientClosed = false;\n\n function createReadable(\n queue: AnyMessage[],\n _getResolver: () => ((msg: AnyMessage) => void) | null,\n setResolver: (r: ((msg: AnyMessage) => void) | null) => void,\n isClosed: () => boolean\n ): ReadableStream<AnyMessage> {\n return new ReadableStream({\n async pull(controller) {\n if (queue.length > 0) {\n controller.enqueue(queue.shift()!);\n return;\n }\n\n if (isClosed()) {\n controller.close();\n return;\n }\n\n const message = await new Promise<AnyMessage | null>((resolve) => {\n setResolver((msg) => {\n setResolver(null);\n resolve(msg);\n });\n });\n\n if (message === null) {\n controller.close();\n } else {\n controller.enqueue(message);\n }\n },\n });\n }\n\n function createWritable(\n queue: AnyMessage[],\n getResolver: () => ((msg: AnyMessage) => void) | null,\n setClosed: () => void\n ): WritableStream<AnyMessage> {\n return new WritableStream({\n write(message) {\n const resolver = getResolver();\n if (resolver) {\n resolver(message);\n } else {\n queue.push(message);\n }\n },\n close() {\n setClosed();\n const resolver = getResolver();\n if (resolver) {\n resolver(null as unknown as AnyMessage);\n }\n },\n });\n }\n\n const clientStream: Stream = {\n // Client writes to server\n writable: createWritable(\n clientToServer,\n () => clientToServerResolver,\n () => {\n clientToServerClosed = true;\n }\n ),\n // Client reads from server\n readable: createReadable(\n serverToClient,\n () => serverToClientResolver,\n (r) => {\n serverToClientResolver = r;\n },\n () => serverToClientClosed\n ),\n };\n\n const serverStream: Stream = {\n // Server writes to client\n writable: createWritable(\n serverToClient,\n () => serverToClientResolver,\n () => {\n serverToClientClosed = true;\n }\n ),\n // Server reads from client\n readable: createReadable(\n clientToServer,\n () => clientToServerResolver,\n (r) => {\n clientToServerResolver = r;\n },\n () => clientToServerClosed\n ),\n };\n\n return [clientStream, serverStream];\n}\n","/**\n * Subscription class for MAP event streams\n *\n * Provides both AsyncIterable and event emitter patterns for consuming events.\n * Includes automatic deduplication based on eventId when provided by the server.\n */\n\nimport type {\n SubscriptionId,\n Event,\n SubscriptionFilter,\n SubscriptionState,\n SubscriptionAckParams,\n OverflowInfo,\n OverflowHandler,\n EventNotificationParams,\n} from '../types';\n\n/**\n * Event handler callback type\n */\nexport type EventHandler = (event: Event) => void;\n\n/**\n * Subscription options\n */\nexport interface SubscriptionOptions {\n /** Filter for events */\n filter?: SubscriptionFilter;\n /** Buffer size for events before backpressure */\n bufferSize?: number;\n /**\n * Maximum number of eventIds to track for deduplication.\n * Older eventIds are evicted when this limit is reached.\n * Default: 10000\n */\n maxSeenEventIds?: number;\n}\n\n/**\n * Subscription to MAP events.\n *\n * Supports both async iteration and event handler patterns:\n *\n * ```typescript\n * // Async iteration\n * for await (const event of subscription) {\n * console.log(event);\n * }\n *\n * // Event handler\n * subscription.on('event', (event) => console.log(event));\n * ```\n *\n * ## Deduplication\n *\n * When the server provides `eventId` in the notification params,\n * the subscription automatically deduplicates events. This handles\n * scenarios like:\n * - Network retries delivering the same event twice\n * - Reconnection replay overlapping with already-received events\n *\n * If `eventId` is not provided, deduplication is skipped.\n *\n * ## Pause/Resume\n *\n * You can pause event delivery from the async iterator while still\n * buffering events:\n *\n * ```typescript\n * subscription.pause();\n * // Events are buffered but not yielded\n * subscription.resume();\n * // Buffered events are now yielded\n * ```\n *\n * ## Overflow Handling\n *\n * When the buffer is full, events are dropped and overflow handlers\n * are notified:\n *\n * ```typescript\n * subscription.on('overflow', (info) => {\n * console.log(`Dropped ${info.eventsDropped} events`);\n * });\n * ```\n */\nexport class Subscription implements AsyncIterable<Event> {\n readonly id: SubscriptionId;\n readonly filter?: SubscriptionFilter;\n\n readonly #eventHandlers: Set<EventHandler> = new Set();\n readonly #overflowHandlers: Set<OverflowHandler> = new Set();\n readonly #eventQueue: Event[] = [];\n readonly #bufferSize: number;\n readonly #unsubscribe: () => Promise<void>;\n readonly #sendAck?: (params: SubscriptionAckParams) => void;\n\n // Deduplication tracking\n readonly #seenEventIds: Set<string> = new Set();\n readonly #seenEventIdOrder: string[] = []; // For LRU eviction\n readonly #maxSeenEventIds: number;\n\n #eventResolver: ((event: Event | null) => void) | null = null;\n #pauseResolver: (() => void) | null = null;\n #state: SubscriptionState = 'active';\n #lastSequenceNumber = -1;\n #lastEventId: string | undefined;\n #lastTimestamp: number | undefined;\n\n // Overflow tracking\n #totalDropped = 0;\n #oldestDroppedId?: string;\n #newestDroppedId?: string;\n\n // Ack support\n #serverSupportsAck = false;\n\n constructor(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options: SubscriptionOptions = {},\n sendAck?: (params: SubscriptionAckParams) => void\n ) {\n this.id = id;\n this.filter = options.filter;\n this.#bufferSize = options.bufferSize ?? 1000;\n this.#maxSeenEventIds = options.maxSeenEventIds ?? 10000;\n this.#unsubscribe = unsubscribe;\n this.#sendAck = sendAck;\n }\n\n /**\n * Current subscription state\n */\n get state(): SubscriptionState {\n return this.#state;\n }\n\n /**\n * Whether the subscription is closed\n */\n get isClosed(): boolean {\n return this.#state === 'closed';\n }\n\n /**\n * Whether the subscription is paused\n */\n get isPaused(): boolean {\n return this.#state === 'paused';\n }\n\n /**\n * Last received sequence number (for ordering verification)\n */\n get lastSequenceNumber(): number {\n return this.#lastSequenceNumber;\n }\n\n /**\n * Last received eventId (for replay positioning)\n */\n get lastEventId(): string | undefined {\n return this.#lastEventId;\n }\n\n /**\n * Last received server timestamp\n */\n get lastTimestamp(): number | undefined {\n return this.#lastTimestamp;\n }\n\n /**\n * Number of events currently buffered\n */\n get bufferedCount(): number {\n return this.#eventQueue.length;\n }\n\n /**\n * Number of eventIds being tracked for deduplication\n */\n get trackedEventIdCount(): number {\n return this.#seenEventIds.size;\n }\n\n /**\n * Total number of events dropped due to buffer overflow\n */\n get totalDropped(): number {\n return this.#totalDropped;\n }\n\n /**\n * Whether the server supports acknowledgments\n */\n get supportsAck(): boolean {\n return this.#serverSupportsAck && !!this.#sendAck;\n }\n\n /**\n * Pause event delivery from the async iterator.\n * Events are still buffered but not yielded until resume() is called.\n * Event handlers (on('event', ...)) still receive events while paused.\n */\n pause(): void {\n if (this.#state === 'closed') return;\n this.#state = 'paused';\n }\n\n /**\n * Resume event delivery from the async iterator.\n * Any events buffered during pause will be yielded.\n */\n resume(): void {\n if (this.#state === 'closed') return;\n this.#state = 'active';\n\n // Wake up paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // If iterator is waiting for events and we have buffered events, deliver one\n if (this.#eventResolver && this.#eventQueue.length > 0) {\n const event = this.#eventQueue.shift()!;\n this.#eventResolver(event);\n this.#eventResolver = null;\n }\n }\n\n /**\n * Acknowledge events up to a sequence number.\n * No-op if server doesn't support acks.\n *\n * @param upToSequence - Acknowledge all events up to and including this sequence.\n * If omitted, acknowledges up to lastSequenceNumber.\n */\n ack(upToSequence?: number): void {\n if (!this.supportsAck) return;\n\n const seq = upToSequence ?? this.#lastSequenceNumber;\n if (seq < 0) return; // No events received yet\n\n this.#sendAck!({\n subscriptionId: this.id,\n upToSequence: seq,\n });\n }\n\n /**\n * Register an event or overflow handler\n */\n on(type: 'event', handler: EventHandler): this;\n on(type: 'overflow', handler: OverflowHandler): this;\n on(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.add(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.add(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Remove an event or overflow handler\n */\n off(type: 'event', handler: EventHandler): this;\n off(type: 'overflow', handler: OverflowHandler): this;\n off(type: 'event' | 'overflow', handler: EventHandler | OverflowHandler): this {\n if (type === 'event') {\n this.#eventHandlers.delete(handler as EventHandler);\n } else if (type === 'overflow') {\n this.#overflowHandlers.delete(handler as OverflowHandler);\n }\n return this;\n }\n\n /**\n * Register a one-time event handler\n */\n once(type: 'event', handler: EventHandler): this {\n if (type === 'event') {\n const wrapper: EventHandler = (event) => {\n this.off('event', wrapper);\n handler(event);\n };\n this.on('event', wrapper);\n }\n return this;\n }\n\n /**\n * Unsubscribe and close the subscription\n */\n async unsubscribe(): Promise<void> {\n if (this.#state === 'closed') return;\n\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n\n // Clear handlers and tracking\n this.#eventHandlers.clear();\n this.#overflowHandlers.clear();\n this.#seenEventIds.clear();\n this.#seenEventIdOrder.length = 0;\n\n // Call the unsubscribe callback\n await this.#unsubscribe();\n }\n\n /**\n * Set whether server supports acknowledgments.\n * Called by connection after capability negotiation.\n * @internal\n */\n _setServerSupportsAck(supports: boolean): void {\n this.#serverSupportsAck = supports;\n }\n\n /**\n * Push an event to the subscription (called by connection)\n * @internal\n */\n _pushEvent(params: EventNotificationParams): void {\n if (this.#state === 'closed') return;\n\n const { sequenceNumber, eventId, timestamp, event } = params;\n\n // Deduplicate by eventId if provided\n if (eventId) {\n if (this.#seenEventIds.has(eventId)) {\n // Duplicate event, skip silently\n return;\n }\n\n // Track this eventId\n this.#seenEventIds.add(eventId);\n this.#seenEventIdOrder.push(eventId);\n\n // LRU eviction if we've exceeded the limit\n while (this.#seenEventIds.size > this.#maxSeenEventIds) {\n const oldestId = this.#seenEventIdOrder.shift();\n if (oldestId) {\n this.#seenEventIds.delete(oldestId);\n }\n }\n\n // Track last eventId for replay positioning\n this.#lastEventId = eventId;\n }\n\n // Track last timestamp\n if (timestamp !== undefined) {\n this.#lastTimestamp = timestamp;\n }\n\n // Check for sequence gaps (out of order or missed events)\n if (this.#lastSequenceNumber >= 0 && sequenceNumber !== this.#lastSequenceNumber + 1) {\n console.warn(\n `MAP: Subscription ${this.id} sequence gap: expected ${this.#lastSequenceNumber + 1}, got ${sequenceNumber}`\n );\n }\n this.#lastSequenceNumber = sequenceNumber;\n\n // Notify event handlers (always, even when paused)\n for (const handler of this.#eventHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Event handler error:', error);\n }\n }\n\n // If there's a waiting iterator and not paused, resolve it directly\n if (this.#eventResolver && this.#state === 'active') {\n this.#eventResolver(event);\n this.#eventResolver = null;\n return;\n }\n\n // Otherwise buffer the event\n if (this.#eventQueue.length < this.#bufferSize) {\n this.#eventQueue.push(event);\n } else {\n // Buffer overflow - track and notify\n this.#totalDropped++;\n\n // Track oldest/newest dropped event IDs\n if (eventId) {\n if (this.#oldestDroppedId === undefined) {\n this.#oldestDroppedId = eventId;\n }\n this.#newestDroppedId = eventId;\n }\n\n // Notify overflow handlers\n const info: OverflowInfo = {\n eventsDropped: 1,\n oldestDroppedId: this.#oldestDroppedId,\n newestDroppedId: this.#newestDroppedId,\n timestamp: Date.now(),\n totalDropped: this.#totalDropped,\n };\n\n for (const handler of this.#overflowHandlers) {\n try {\n handler(info);\n } catch (error) {\n console.error('MAP: Overflow handler error:', error);\n }\n }\n\n console.warn(`MAP: Subscription ${this.id} buffer full, dropping event`);\n }\n }\n\n /**\n * Mark the subscription as closed (called by connection)\n * @internal\n */\n _close(): void {\n this.#state = 'closed';\n\n // Resolve any waiting iterator\n if (this.#eventResolver) {\n this.#eventResolver(null);\n this.#eventResolver = null;\n }\n\n // Wake up any paused iterator\n if (this.#pauseResolver) {\n this.#pauseResolver();\n this.#pauseResolver = null;\n }\n }\n\n /**\n * Async iterator implementation\n */\n async *[Symbol.asyncIterator](): AsyncIterator<Event> {\n while (!this.isClosed) {\n // Wait while paused\n while (this.isPaused) {\n await new Promise<void>((resolve) => {\n this.#pauseResolver = resolve;\n });\n // Check if closed during pause - need to break out of both loops\n if (this.isClosed) {\n // Drain remaining buffered events before returning\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n return;\n }\n }\n\n // Return buffered events first\n if (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n continue;\n }\n\n // Wait for next event\n const event = await new Promise<Event | null>((resolve) => {\n this.#eventResolver = resolve;\n });\n\n if (event === null) {\n // Subscription closed\n break;\n }\n\n yield event;\n }\n\n // Drain remaining buffered events\n while (this.#eventQueue.length > 0) {\n yield this.#eventQueue.shift()!;\n }\n }\n}\n\n/**\n * Create a subscription instance\n * @internal\n */\nexport function createSubscription(\n id: SubscriptionId,\n unsubscribe: () => Promise<void>,\n options?: SubscriptionOptions,\n sendAck?: (params: SubscriptionAckParams) => void\n): Subscription {\n return new Subscription(id, unsubscribe, options, sendAck);\n}\n","/**\n * Base connection class for MAP protocol\n *\n * Handles JSON-RPC message correlation, request/response matching,\n * and connection lifecycle management.\n */\n\nimport type { Stream, AnyMessage } from '../stream';\nimport type { RequestId, MAPError } from '../types';\nimport {\n isRequest,\n isNotification,\n isResponse,\n isErrorResponse,\n createRequest,\n createNotification,\n createSuccessResponse,\n createErrorResponse,\n type JsonRpcRequest,\n type JsonRpcNotification,\n type JsonRpcResponse,\n} from '../jsonrpc';\nimport { MAPRequestError, MAPConnectionError, MAPTimeoutError } from '../errors';\n\n/**\n * Pending response tracker\n */\ninterface PendingResponse<T = unknown> {\n resolve: (result: T) => void;\n reject: (error: Error) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Handler for incoming requests\n */\nexport type RequestHandler = (\n method: string,\n params: unknown\n) => Promise<unknown>;\n\n/**\n * Handler for incoming notifications\n */\nexport type NotificationHandler = (\n method: string,\n params: unknown\n) => Promise<void>;\n\n/**\n * Connection state for tracking lifecycle\n */\nexport type ConnectionState =\n | 'initial'\n | 'connecting'\n | 'connected'\n | 'reconnecting'\n | 'closed';\n\n/**\n * Handler for connection state changes\n */\nexport type StateChangeHandler = (\n newState: ConnectionState,\n oldState: ConnectionState\n) => void;\n\n/**\n * Options for base connection\n */\nexport interface BaseConnectionOptions {\n /** Default timeout for requests in milliseconds */\n defaultTimeout?: number;\n}\n\n/**\n * Base connection class providing JSON-RPC message handling.\n *\n * This class is used internally by the role-specific connection classes\n * (ClientConnection, AgentConnection, etc.)\n */\nexport class BaseConnection {\n #stream: Stream;\n readonly #pendingResponses: Map<RequestId, PendingResponse> = new Map();\n readonly #abortController: AbortController = new AbortController();\n readonly #closedPromise: Promise<void>;\n readonly #defaultTimeout: number;\n readonly #stateChangeHandlers: Set<StateChangeHandler> = new Set();\n\n #nextRequestId: number = 1;\n #writeQueue: Promise<void> = Promise.resolve();\n #requestHandler: RequestHandler | null = null;\n #notificationHandler: NotificationHandler | null = null;\n #closed = false;\n #closeResolver!: () => void;\n #state: ConnectionState = 'initial';\n\n constructor(stream: Stream, options: BaseConnectionOptions = {}) {\n this.#stream = stream;\n this.#defaultTimeout = options.defaultTimeout ?? 30000;\n\n // Create closed promise\n this.#closedPromise = new Promise((resolve) => {\n this.#closeResolver = resolve;\n });\n\n // Start receiving messages\n void this.#startReceiving();\n }\n\n /**\n * AbortSignal that triggers when the connection closes.\n * Useful for cancelling operations tied to this connection.\n */\n get signal(): AbortSignal {\n return this.#abortController.signal;\n }\n\n /**\n * Promise that resolves when the connection is closed.\n */\n get closed(): Promise<void> {\n return this.#closedPromise;\n }\n\n /**\n * Whether the connection is closed\n */\n get isClosed(): boolean {\n return this.#closed;\n }\n\n /**\n * Set the handler for incoming requests\n */\n setRequestHandler(handler: RequestHandler): void {\n this.#requestHandler = handler;\n }\n\n /**\n * Set the handler for incoming notifications\n */\n setNotificationHandler(handler: NotificationHandler): void {\n this.#notificationHandler = handler;\n }\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#state;\n }\n\n /**\n * Register a handler for state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(handler: StateChangeHandler): () => void {\n this.#stateChangeHandlers.add(handler);\n return () => this.#stateChangeHandlers.delete(handler);\n }\n\n /**\n * Transition to a new state and notify handlers.\n * @internal\n */\n _transitionTo(newState: ConnectionState): void {\n if (this.#state === newState) return;\n\n const oldState = this.#state;\n this.#state = newState;\n\n for (const handler of this.#stateChangeHandlers) {\n try {\n handler(newState, oldState);\n } catch (error) {\n console.error('MAP: State change handler error:', error);\n }\n }\n }\n\n /**\n * Reconnect with a new stream.\n *\n * This method is used by role-specific connections to replace the\n * underlying transport after a disconnect.\n *\n * @param newStream - The new stream to use\n * @throws If the connection is permanently closed\n */\n async reconnect(newStream: Stream): Promise<void> {\n if (this.#state === 'closed') {\n throw new Error('Cannot reconnect a permanently closed connection');\n }\n\n // Replace the stream\n this.#stream = newStream;\n this.#closed = false;\n\n // Reset the write queue\n this.#writeQueue = Promise.resolve();\n\n // Start receiving on the new stream\n void this.#startReceiving();\n\n this._transitionTo('connected');\n }\n\n /**\n * Send a request and wait for response\n */\n async sendRequest<TParams, TResult>(\n method: string,\n params?: TParams,\n options?: { timeout?: number }\n ): Promise<TResult> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const id = this.#nextRequestId++;\n const request = createRequest(id, method, params);\n\n const responsePromise = new Promise<TResult>((resolve, reject) => {\n const pending: PendingResponse<TResult> = { resolve, reject };\n\n // Set up timeout\n const timeout = options?.timeout ?? this.#defaultTimeout;\n if (timeout > 0) {\n pending.timeoutId = setTimeout(() => {\n this.#pendingResponses.delete(id);\n reject(new MAPTimeoutError(method, timeout));\n }, timeout);\n }\n\n this.#pendingResponses.set(id, pending as PendingResponse);\n });\n\n await this.#sendMessage(request as AnyMessage);\n\n return responsePromise;\n }\n\n /**\n * Send a notification (no response expected)\n */\n async sendNotification<TParams>(\n method: string,\n params?: TParams\n ): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const notification = createNotification(method, params);\n await this.#sendMessage(notification as AnyMessage);\n }\n\n /**\n * Send a response to a request\n */\n async sendResponse<TResult>(id: RequestId, result: TResult): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createSuccessResponse(id, result);\n await this.#sendMessage(response);\n }\n\n /**\n * Send an error response to a request\n */\n async sendErrorResponse(id: RequestId, error: MAPError): Promise<void> {\n if (this.#closed) {\n throw MAPConnectionError.closed();\n }\n\n const response = createErrorResponse(id, error);\n await this.#sendMessage(response);\n }\n\n /**\n * Close the connection\n */\n async close(): Promise<void> {\n if (this.#closed) return;\n\n this.#closed = true;\n this._transitionTo('closed');\n this.#abortController.abort();\n\n // Reject all pending responses\n for (const [, pending] of this.#pendingResponses) {\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n pending.reject(MAPConnectionError.closed());\n }\n this.#pendingResponses.clear();\n\n // Close the stream\n try {\n const writer = this.#stream.writable.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Ignore close errors\n }\n\n this.#closeResolver();\n }\n\n /**\n * Start receiving messages from the stream\n */\n async #startReceiving(): Promise<void> {\n const reader = this.#stream.readable.getReader();\n\n try {\n while (!this.#closed) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n await this.#handleMessage(value);\n }\n } catch (error) {\n if (!this.#closed) {\n console.error('MAP: Error receiving message:', error);\n }\n } finally {\n reader.releaseLock();\n await this.close();\n }\n }\n\n /**\n * Handle an incoming message\n */\n async #handleMessage(message: AnyMessage): Promise<void> {\n try {\n if (isRequest(message)) {\n await this.#handleRequest(message);\n } else if (isNotification(message)) {\n await this.#handleNotification(message);\n } else if (isResponse(message)) {\n this.#handleResponse(message);\n } else {\n console.error('MAP: Unknown message type:', message);\n }\n } catch (error) {\n console.error('MAP: Error handling message:', error);\n }\n }\n\n /**\n * Handle an incoming request\n */\n async #handleRequest(request: JsonRpcRequest): Promise<void> {\n const { id, method, params } = request;\n\n if (!this.#requestHandler) {\n await this.sendErrorResponse(\n id,\n MAPRequestError.methodNotFound(method).toError()\n );\n return;\n }\n\n try {\n const result = await this.#requestHandler(method, params);\n await this.sendResponse(id, result ?? null);\n } catch (error) {\n if (error instanceof MAPRequestError) {\n await this.sendErrorResponse(id, error.toError());\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error';\n await this.sendErrorResponse(\n id,\n MAPRequestError.internalError(message).toError()\n );\n }\n }\n }\n\n /**\n * Handle an incoming notification\n */\n async #handleNotification(notification: JsonRpcNotification): Promise<void> {\n const { method, params } = notification;\n\n if (!this.#notificationHandler) {\n // Notifications are fire-and-forget, so just log\n console.warn('MAP: No notification handler for:', method);\n return;\n }\n\n try {\n await this.#notificationHandler(method, params);\n } catch (error) {\n console.error('MAP: Error handling notification:', method, error);\n }\n }\n\n /**\n * Handle an incoming response\n */\n #handleResponse(response: JsonRpcResponse): void {\n const { id } = response;\n const pending = this.#pendingResponses.get(id);\n\n if (!pending) {\n console.warn('MAP: Received response for unknown request:', id);\n return;\n }\n\n this.#pendingResponses.delete(id);\n\n if (pending.timeoutId) {\n clearTimeout(pending.timeoutId);\n }\n\n if (isErrorResponse(response)) {\n pending.reject(MAPRequestError.fromError(response.error));\n } else {\n pending.resolve(response.result);\n }\n }\n\n /**\n * Send a message through the stream with write queue serialization\n */\n async #sendMessage(message: AnyMessage): Promise<void> {\n this.#writeQueue = this.#writeQueue\n .then(async () => {\n if (this.#closed) return;\n\n const writer = this.#stream.writable.getWriter();\n try {\n await writer.write(message);\n } finally {\n writer.releaseLock();\n }\n })\n .catch((error) => {\n console.error('MAP: Write error:', error);\n });\n\n return this.#writeQueue;\n }\n}\n","/**\n * ULID utilities for MAP event IDs\n *\n * ULIDs (Universally Unique Lexicographically Sortable Identifiers) are:\n * - 26 characters, Crockford Base32 encoded\n * - Time-sortable (first 48 bits = millisecond timestamp)\n * - Lexicographically sortable (string comparison = chronological order)\n *\n * Format: TTTTTTTTTTRRRRRRRRRRRRRRR\n * |---------|-------------|\n * Timestamp Randomness\n * (10 chars) (16 chars)\n *\n * @example\n * ```typescript\n * import { ulid, ulidTimestamp, compareUlid } from './utils/ulid';\n *\n * const id = ulid(); // \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n * const ts = ulidTimestamp(id); // 1706123456789\n * ```\n */\n\n// Re-export from ulid package\nexport { ulid, monotonicFactory } from 'ulid';\n\n// Crockford Base32 alphabet used by ULID\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\nconst ENCODING_LEN = ENCODING.length; // 32\n\n/**\n * Extract the timestamp from a ULID.\n *\n * @param id - The ULID string\n * @returns Unix timestamp in milliseconds\n *\n * @example\n * ```typescript\n * const id = ulid();\n * const timestamp = ulidTimestamp(id);\n * console.log(new Date(timestamp));\n * ```\n */\nexport function ulidTimestamp(id: string): number {\n if (id.length !== 26) {\n throw new Error(`Invalid ULID: expected 26 characters, got ${id.length}`);\n }\n\n // Decode first 10 characters (timestamp portion)\n let time = 0;\n for (let i = 0; i < 10; i++) {\n const char = id[i].toUpperCase();\n const idx = ENCODING.indexOf(char);\n if (idx === -1) {\n throw new Error(`Invalid ULID character: ${char}`);\n }\n time = time * ENCODING_LEN + idx;\n }\n\n return time;\n}\n\n/**\n * Compare two ULIDs lexicographically.\n *\n * Since ULIDs are designed to be lexicographically sortable,\n * this comparison also gives chronological ordering.\n *\n * @param a - First ULID\n * @param b - Second ULID\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```typescript\n * const ids = [ulid(), ulid(), ulid()];\n * ids.sort(compareUlid); // Chronological order\n * ```\n */\nexport function compareUlid(a: string, b: string): number {\n return a.localeCompare(b);\n}\n\n/**\n * Check if a string is a valid ULID format.\n *\n * @param id - String to check\n * @returns True if valid ULID format\n */\nexport function isValidUlid(id: string): boolean {\n if (typeof id !== 'string' || id.length !== 26) {\n return false;\n }\n\n for (let i = 0; i < 26; i++) {\n if (ENCODING.indexOf(id[i].toUpperCase()) === -1) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Retry utilities with exponential backoff\n *\n * Provides configurable retry logic for handling transient failures\n * in network operations like reconnection.\n */\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryPolicy {\n /** Maximum number of retry attempts (default: 10) */\n maxRetries: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Add randomness to delay to prevent thundering herd (default: true) */\n jitter: boolean;\n /** Custom function to determine if an error is retryable */\n isRetryable?: (error: Error) => boolean;\n}\n\n/**\n * Default retry policy with sensible defaults for network operations\n */\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 10,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitter: true,\n};\n\n/**\n * State passed to retry callbacks\n */\nexport interface RetryState {\n /** Current attempt number (1-indexed) */\n attempt: number;\n /** Delay before next retry in milliseconds */\n nextDelayMs: number;\n /** The error that caused this retry */\n lastError?: Error;\n}\n\n/**\n * Callbacks for monitoring retry progress\n */\nexport interface RetryCallbacks<T> {\n /** Called before each retry attempt */\n onRetry?: (state: RetryState) => void;\n /** Called on successful completion */\n onSuccess?: (result: T, attempts: number) => void;\n /** Called when all retries are exhausted */\n onFailure?: (error: Error, attempts: number) => void;\n}\n\n/**\n * Calculate delay for a retry attempt using exponential backoff.\n *\n * Formula: min(baseDelay * 2^(attempt-1), maxDelay) * jitter\n *\n * @param attempt - Current attempt number (1-indexed)\n * @param policy - Retry policy configuration\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * // With baseDelay=1000, maxDelay=30000:\n * // Attempt 1: 1000ms\n * // Attempt 2: 2000ms\n * // Attempt 3: 4000ms\n * // Attempt 4: 8000ms\n * // Attempt 5: 16000ms\n * // Attempt 6+: 30000ms (capped)\n * ```\n */\nexport function calculateDelay(attempt: number, policy: RetryPolicy): number {\n // Exponential backoff: baseDelay * 2^(attempt-1)\n let delay = Math.min(\n policy.baseDelayMs * Math.pow(2, attempt - 1),\n policy.maxDelayMs\n );\n\n // Add jitter: multiply by random factor between 0.5 and 1.5\n if (policy.jitter) {\n delay = delay * (0.5 + Math.random());\n }\n\n return Math.floor(delay);\n}\n\n/**\n * Execute an async operation with retry logic.\n *\n * Retries the operation on failure using exponential backoff until\n * either it succeeds or the maximum retries are exhausted.\n *\n * @param operation - Async function to execute\n * @param policy - Retry policy (defaults to DEFAULT_RETRY_POLICY)\n * @param callbacks - Optional callbacks for monitoring progress\n * @returns The result of the successful operation\n * @throws The last error if all retries are exhausted\n *\n * @example\n * ```typescript\n * const result = await withRetry(\n * () => fetch('https://api.example.com/data'),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true },\n * {\n * onRetry: ({ attempt, nextDelayMs }) => {\n * console.log(`Retry ${attempt}, waiting ${nextDelayMs}ms`);\n * },\n * }\n * );\n * ```\n */\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY,\n callbacks?: RetryCallbacks<T>\n): Promise<T> {\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= policy.maxRetries + 1; attempt++) {\n try {\n const result = await operation();\n callbacks?.onSuccess?.(result, attempt);\n return result;\n } catch (error) {\n lastError = error as Error;\n\n // Check if we should retry\n const isRetryable = policy.isRetryable?.(lastError) ?? true;\n const hasMoreAttempts = attempt <= policy.maxRetries;\n\n if (!isRetryable || !hasMoreAttempts) {\n break;\n }\n\n // Calculate delay and wait\n const delay = calculateDelay(attempt, policy);\n\n callbacks?.onRetry?.({\n attempt,\n nextDelayMs: delay,\n lastError,\n });\n\n await sleep(delay);\n }\n }\n\n callbacks?.onFailure?.(lastError!, policy.maxRetries + 1);\n throw lastError;\n}\n\n/**\n * Create a retryable wrapper around an async function.\n *\n * Returns a new function with the same signature that automatically\n * retries on failure according to the policy.\n *\n * @param fn - Async function to wrap\n * @param policy - Retry policy\n * @returns Wrapped function with retry behavior\n *\n * @example\n * ```typescript\n * const fetchWithRetry = retryable(\n * async (url: string) => fetch(url),\n * { maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 5000, jitter: true }\n * );\n *\n * const response = await fetchWithRetry('https://api.example.com');\n * ```\n */\nexport function retryable<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n policy: RetryPolicy = DEFAULT_RETRY_POLICY\n): (...args: TArgs) => Promise<TResult> {\n return (...args: TArgs) => withRetry(() => fn(...args), policy);\n}\n\n/**\n * Create a partial retry policy merged with defaults.\n *\n * @param options - Partial policy options to override defaults\n * @returns Complete retry policy\n */\nexport function createRetryPolicy(\n options: Partial<RetryPolicy> = {}\n): RetryPolicy {\n return { ...DEFAULT_RETRY_POLICY, ...options };\n}\n\n/**\n * Sleep for a specified duration.\n *\n * @param ms - Duration in milliseconds\n * @returns Promise that resolves after the duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Causal Event Buffer\n *\n * Buffers events and releases them in causal order. Events with `causedBy`\n * dependencies are held until all their predecessor events have been seen.\n *\n * This is useful for:\n * - Ensuring events are processed in correct causal order\n * - Handling out-of-order event delivery\n * - Building consistent views from event streams\n */\n\nimport type { Event } from '../types';\n\n/**\n * Event with envelope metadata for causal tracking\n */\nexport interface CausalEvent {\n /** Unique event identifier */\n eventId: string;\n /** Event IDs that must be processed before this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n /** Timestamp when the event was received */\n receivedAt?: number;\n}\n\n/**\n * Mode for handling events with multiple causal dependencies.\n * - \"all\": Wait for ALL causes before releasing (stricter, default)\n * - \"any\": Release when ANY cause is seen (more permissive)\n */\nexport type MultiCauseMode = \"all\" | \"any\";\n\n/**\n * Options for CausalEventBuffer\n */\nexport interface CausalEventBufferOptions {\n /**\n * Maximum time (ms) to wait for causal predecessors before releasing anyway.\n * Default: 5000ms. Set to 0 or Infinity to wait indefinitely.\n */\n maxWaitTime?: number;\n\n /**\n * Maximum number of events to buffer before force-releasing oldest.\n * Default: 1000. Prevents unbounded memory growth.\n */\n maxBufferSize?: number;\n\n /**\n * Mode for handling events with multiple causes.\n * - \"all\" (default): Wait for ALL causes before releasing\n * - \"any\": Release when ANY cause is seen\n */\n multiCauseMode?: MultiCauseMode;\n\n /**\n * Callback when an event is released despite missing predecessors (timeout or buffer overflow).\n */\n onForcedRelease?: (event: CausalEvent, missingPredecessors: string[]) => void;\n}\n\n/**\n * Result from pushing an event to the buffer\n */\nexport interface CausalBufferPushResult {\n /** Events that are now ready to be processed in causal order */\n ready: CausalEvent[];\n /** Number of events still waiting for predecessors */\n pending: number;\n}\n\n/**\n * Buffers events and releases them in causal order.\n *\n * Events with `causedBy` dependencies are held until all predecessor events\n * have been seen (pushed to the buffer). Events without dependencies are\n * released immediately.\n *\n * @example\n * ```typescript\n * const buffer = new CausalEventBuffer();\n *\n * // Event B depends on A, but arrives first\n * let result = buffer.push({\n * eventId: 'B',\n * causedBy: ['A'],\n * event: { id: 'B', type: 'effect', timestamp: 2 }\n * });\n * console.log(result.ready); // [] - B is waiting for A\n * console.log(result.pending); // 1\n *\n * // Event A arrives\n * result = buffer.push({\n * eventId: 'A',\n * event: { id: 'A', type: 'cause', timestamp: 1 }\n * });\n * console.log(result.ready); // [A, B] - Both released in order\n * console.log(result.pending); // 0\n * ```\n */\nexport class CausalEventBuffer {\n readonly #options: Required<Omit<CausalEventBufferOptions, 'onForcedRelease'>> & {\n onForcedRelease?: CausalEventBufferOptions['onForcedRelease'];\n };\n\n /** Events seen (by eventId) - used to check if predecessors exist */\n readonly #seen: Set<string> = new Set();\n\n /** Events waiting for predecessors */\n readonly #pending: Map<string, CausalEvent> = new Map();\n\n /** Map from eventId to events waiting for it */\n readonly #waitingFor: Map<string, Set<string>> = new Map();\n\n constructor(options: CausalEventBufferOptions = {}) {\n this.#options = {\n maxWaitTime: options.maxWaitTime ?? 5000,\n maxBufferSize: options.maxBufferSize ?? 1000,\n multiCauseMode: options.multiCauseMode ?? \"all\",\n onForcedRelease: options.onForcedRelease,\n };\n }\n\n /**\n * Get the current multi-cause mode.\n */\n get multiCauseMode(): MultiCauseMode {\n return this.#options.multiCauseMode;\n }\n\n /**\n * Push an event into the buffer.\n *\n * @param event - The event to buffer\n * @returns Events that are ready to be processed (in causal order)\n */\n push(event: CausalEvent): CausalBufferPushResult {\n const ready: CausalEvent[] = [];\n\n // Check if we've already seen this event (deduplication)\n if (this.#seen.has(event.eventId)) {\n return { ready, pending: this.#pending.size };\n }\n\n // Mark as seen\n this.#seen.add(event.eventId);\n\n // Add received timestamp if not present\n if (!event.receivedAt) {\n event = { ...event, receivedAt: Date.now() };\n }\n\n // Check if predecessors are satisfied based on multi-cause mode\n const shouldRelease = this.#shouldReleaseEvent(event);\n\n if (shouldRelease) {\n // No dependencies or dependencies satisfied - release immediately\n ready.push(event);\n\n // Check if this event unblocks any pending events\n this.#releaseWaiting(event.eventId, ready);\n } else {\n // Wait for predecessors\n this.#pending.set(event.eventId, event);\n\n // Track what this event is waiting for\n const predecessors = event.causedBy ?? [];\n for (const predecessorId of predecessors) {\n if (!this.#waitingFor.has(predecessorId)) {\n this.#waitingFor.set(predecessorId, new Set());\n }\n this.#waitingFor.get(predecessorId)!.add(event.eventId);\n }\n }\n\n // Check for buffer overflow\n this.#handleBufferOverflow(ready);\n\n // Check for timeouts\n this.#handleTimeouts(ready);\n\n return { ready, pending: this.#pending.size };\n }\n\n /**\n * Get the number of events waiting for predecessors\n */\n get pendingCount(): number {\n return this.#pending.size;\n }\n\n /**\n * Get the number of unique events seen\n */\n get seenCount(): number {\n return this.#seen.size;\n }\n\n /**\n * Check if a specific event has been seen\n */\n hasSeen(eventId: string): boolean {\n return this.#seen.has(eventId);\n }\n\n /**\n * Force release all pending events, regardless of missing predecessors.\n * Useful for cleanup or when you know no more events are coming.\n *\n * @returns All pending events in the order they would be released\n */\n flush(): CausalEvent[] {\n const ready: CausalEvent[] = [];\n\n // Release all pending events, trying to maintain some order\n // Sort by receivedAt to release in arrival order\n const pendingList = Array.from(this.#pending.values()).sort(\n (a, b) => (a.receivedAt ?? 0) - (b.receivedAt ?? 0)\n );\n\n for (const event of pendingList) {\n const missingPredecessors = this.#getMissingPredecessors(event);\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n ready.push(event);\n }\n\n this.#pending.clear();\n this.#waitingFor.clear();\n\n return ready;\n }\n\n /**\n * Clear all state (seen events, pending events)\n */\n clear(): void {\n this.#seen.clear();\n this.#pending.clear();\n this.#waitingFor.clear();\n }\n\n /**\n * Check if an event should be released based on its predecessors and the multi-cause mode.\n */\n #shouldReleaseEvent(event: CausalEvent): boolean {\n if (!event.causedBy || event.causedBy.length === 0) {\n return true; // No dependencies - release immediately\n }\n\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n if (this.#options.multiCauseMode === \"any\") {\n // \"any\" mode: release if ANY predecessor is satisfied (not missing)\n // If all are missing, we must wait\n return missingPredecessors.length < event.causedBy.length;\n } else {\n // \"all\" mode (default): release only if ALL predecessors are satisfied\n return missingPredecessors.length === 0;\n }\n }\n\n /**\n * Get missing predecessors for an event.\n * A predecessor is considered \"missing\" if it hasn't been released yet\n * (either not seen at all, or seen but still pending).\n */\n #getMissingPredecessors(event: CausalEvent): string[] {\n if (!event.causedBy || event.causedBy.length === 0) {\n return [];\n }\n\n return event.causedBy.filter((predecessorId) => {\n // Predecessor is missing if:\n // 1. We haven't seen it at all, OR\n // 2. We've seen it but it's still pending (waiting for its own predecessors)\n return !this.#seen.has(predecessorId) || this.#pending.has(predecessorId);\n });\n }\n\n /**\n * Release events that were waiting for a specific predecessor\n */\n #releaseWaiting(predecessorId: string, ready: CausalEvent[]): void {\n const waitingEventIds = this.#waitingFor.get(predecessorId);\n if (!waitingEventIds) return;\n\n // Remove this predecessor from the waiting map\n this.#waitingFor.delete(predecessorId);\n\n for (const waitingEventId of waitingEventIds) {\n const waitingEvent = this.#pending.get(waitingEventId);\n if (!waitingEvent) continue;\n\n // Check if predecessors are now satisfied (respects multi-cause mode)\n if (this.#shouldReleaseEvent(waitingEvent)) {\n // Predecessors satisfied - release this event\n this.#pending.delete(waitingEventId);\n\n // Clean up waiting entries for this event's other predecessors\n if (waitingEvent.causedBy) {\n for (const otherPredId of waitingEvent.causedBy) {\n if (otherPredId !== predecessorId) {\n const waiting = this.#waitingFor.get(otherPredId);\n if (waiting) {\n waiting.delete(waitingEventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(otherPredId);\n }\n }\n }\n }\n }\n\n ready.push(waitingEvent);\n\n // Recursively check if this event unblocks others\n this.#releaseWaiting(waitingEventId, ready);\n }\n }\n }\n\n /**\n * Handle buffer overflow by force-releasing oldest events\n */\n #handleBufferOverflow(ready: CausalEvent[]): void {\n while (this.#pending.size > this.#options.maxBufferSize) {\n // Find oldest pending event by receivedAt\n let oldest: CausalEvent | null = null;\n for (const event of this.#pending.values()) {\n if (!oldest || (event.receivedAt ?? 0) < (oldest.receivedAt ?? 0)) {\n oldest = event;\n }\n }\n\n if (oldest) {\n this.#forceRelease(oldest, ready);\n }\n }\n }\n\n /**\n * Handle events that have been waiting too long\n */\n #handleTimeouts(ready: CausalEvent[]): void {\n if (this.#options.maxWaitTime <= 0 || this.#options.maxWaitTime === Infinity) {\n return;\n }\n\n const now = Date.now();\n const toRelease: CausalEvent[] = [];\n\n for (const event of this.#pending.values()) {\n const waitTime = now - (event.receivedAt ?? now);\n if (waitTime >= this.#options.maxWaitTime) {\n toRelease.push(event);\n }\n }\n\n for (const event of toRelease) {\n this.#forceRelease(event, ready);\n }\n }\n\n /**\n * Force release an event despite missing predecessors\n */\n #forceRelease(event: CausalEvent, ready: CausalEvent[]): void {\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n // Remove from pending\n this.#pending.delete(event.eventId);\n\n // Remove from waiting lists\n for (const predecessorId of event.causedBy ?? []) {\n const waiting = this.#waitingFor.get(predecessorId);\n if (waiting) {\n waiting.delete(event.eventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(predecessorId);\n }\n }\n }\n\n // Notify callback\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n\n // Add to ready list\n ready.push(event);\n\n // Check if this unblocks others\n this.#releaseWaiting(event.eventId, ready);\n }\n}\n\n/**\n * Validate that events are in causal order.\n *\n * An event sequence is in causal order if no event appears before\n * any of its predecessors (events in its causedBy array).\n *\n * @param events - Events to validate\n * @returns True if events are in valid causal order\n *\n * @example\n * ```typescript\n * const events = [\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * ];\n * console.log(validateCausalOrder(events)); // true\n *\n * const badOrder = [\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'A', event: {...} }, // A should come before B\n * ];\n * console.log(validateCausalOrder(badOrder)); // false\n * ```\n */\nexport function validateCausalOrder(events: CausalEvent[]): boolean {\n const seen = new Set<string>();\n\n for (const event of events) {\n // Check all predecessors have been seen\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!seen.has(predecessorId)) {\n return false;\n }\n }\n }\n\n seen.add(event.eventId);\n }\n\n return true;\n}\n\n/**\n * Sort events into causal order using topological sort.\n *\n * If the events form a valid DAG (no cycles), returns them in an order\n * where no event appears before its predecessors. If there are cycles\n * or missing predecessors, throws an error.\n *\n * @param events - Events to sort\n * @returns Events in causal order\n * @throws If events contain cycles or reference missing predecessors\n *\n * @example\n * ```typescript\n * const unordered = [\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * ];\n * const ordered = sortCausalOrder(unordered);\n * // ordered = [A, B, C]\n * ```\n */\nexport function sortCausalOrder(events: CausalEvent[]): CausalEvent[] {\n const eventMap = new Map<string, CausalEvent>();\n for (const event of events) {\n eventMap.set(event.eventId, event);\n }\n\n const result: CausalEvent[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n\n function visit(eventId: string): void {\n if (visited.has(eventId)) return;\n\n if (visiting.has(eventId)) {\n throw new Error(`Cycle detected involving event: ${eventId}`);\n }\n\n const event = eventMap.get(eventId);\n if (!event) {\n throw new Error(`Missing event: ${eventId}`);\n }\n\n visiting.add(eventId);\n\n // Visit predecessors first\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!eventMap.has(predecessorId)) {\n throw new Error(`Missing predecessor: ${predecessorId} for event: ${eventId}`);\n }\n visit(predecessorId);\n }\n }\n\n visiting.delete(eventId);\n visited.add(eventId);\n result.push(event);\n }\n\n for (const event of events) {\n visit(event.eventId);\n }\n\n return result;\n}\n","/**\n * Client connection for MAP protocol\n *\n * Used by clients to connect to a MAP system, query agents,\n * subscribe to events, and send messages.\n */\n\nimport { type Stream, websocketStream, waitForOpen } from '../stream';\nimport { 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 * Options for ClientConnection.connect() static method\n */\nexport interface ClientConnectOptions {\n /** Client name for identification */\n name?: string;\n /** Client capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `ReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | ReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n}\n\n/**\n * 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 // Static Factory Methods\n // ===========================================================================\n\n /**\n * Connect to a MAP server via WebSocket URL.\n *\n * Handles:\n * - WebSocket creation and connection\n * - Stream wrapping\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n *\n * @param url - WebSocket URL (ws:// or wss://)\n * @param options - Connection options\n * @returns Connected ClientConnection instance\n *\n * @example\n * ```typescript\n * const client = await ClientConnection.connect('ws://localhost:8080', {\n * name: 'MyClient',\n * reconnection: true\n * });\n *\n * // Already connected, ready to use\n * const agents = await client.listAgents();\n * ```\n */\n static async connect(\n url: string,\n options?: ClientConnectOptions\n ): Promise<ClientConnection> {\n // Validate URL\n const parsedUrl = new URL(url);\n if (!['ws:', 'wss:'].includes(parsedUrl.protocol)) {\n throw new Error(\n `Unsupported protocol: ${parsedUrl.protocol}. Use ws: or wss:`\n );\n }\n\n const timeout = options?.connectTimeout ?? 10000;\n\n // Create and connect WebSocket\n const ws = new WebSocket(url);\n await waitForOpen(ws, timeout);\n const stream = websocketStream(ws);\n\n // Configure createStream for reconnection\n const createStream = async () => {\n const newWs = new WebSocket(url);\n await waitForOpen(newWs, timeout);\n return websocketStream(newWs);\n };\n\n // Normalize reconnection option\n const reconnection =\n options?.reconnection === true\n ? { enabled: true }\n : typeof options?.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const client = new ClientConnection(stream, {\n name: options?.name,\n capabilities: options?.capabilities,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake\n await client.connect({ auth: options?.auth });\n\n return client;\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the MAP system\n */\n async connect(options?: {\n sessionId?: SessionId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\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 resumeToken: options?.resumeToken,\n auth: options?.auth,\n };\n\n const result = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, params);\n\n this.#sessionId = result.sessionId;\n this.#serverCapabilities = result.capabilities;\n this.#connected = true;\n\n // 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 * @param reason - Optional reason for disconnecting\n * @returns Resume token that can be used to resume this session later\n */\n async disconnect(reason?: string): Promise<string | undefined> {\n if (!this.#connected) return undefined;\n\n let resumeToken: string | undefined;\n try {\n const result = await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n resumeToken = result.resumeToken;\n } finally {\n // Close all subscriptions\n for (const subscription of this.#subscriptions.values()) {\n subscription._close();\n }\n this.#subscriptions.clear();\n\n await this.#connection.close();\n this.#connected = false;\n }\n return resumeToken;\n }\n\n /**\n * Whether the 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 * Agent connection for MAP protocol\n *\n * Used by agents to connect to a MAP system, receive messages,\n * update state, spawn children, and communicate with peers.\n */\n\nimport { type Stream, websocketStream, waitForOpen } from '../stream';\nimport { 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 * Options for AgentConnection.connect() static method\n */\nexport interface AgentConnectOptions {\n /** Agent name */\n name?: string;\n /** Agent role */\n role?: string;\n /** Agent capabilities to advertise */\n capabilities?: ParticipantCapabilities;\n /** Agent visibility settings */\n visibility?: AgentVisibility;\n /** Parent agent ID (for child agents) */\n parent?: AgentId;\n /** Initial scopes to join */\n scopes?: ScopeId[];\n /** Initial metadata */\n metadata?: Record<string, unknown>;\n /** Authentication credentials */\n auth?: {\n method: 'bearer' | 'api-key' | 'mtls' | 'none';\n token?: string;\n };\n /**\n * Reconnection configuration.\n * - `true` = enable with defaults\n * - `false` or omitted = disabled\n * - `AgentReconnectionOptions` = enable with custom settings\n */\n reconnection?: boolean | AgentReconnectionOptions;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n}\n\n/**\n * Agent connection to a MAP system.\n *\n * Provides methods for:\n * - Registering self with the system\n * - Receiving and handling messages\n * - Sending messages to other agents\n * - Spawning child agents\n * - Updating own state\n * - Managing scope memberships\n */\nexport class AgentConnection {\n #connection: BaseConnection;\n readonly #subscriptions: Map<SubscriptionId, Subscription> = new Map();\n readonly #options: AgentConnectionOptions;\n readonly #messageHandlers: Set<MessageHandler> = new Set();\n readonly #reconnectionHandlers: Set<AgentReconnectionEventHandler> = new Set();\n readonly #scopeMemberships: Set<ScopeId> = new Set();\n\n #agentId: AgentId | null = null;\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #currentState: AgentState = 'registered';\n #connected = false;\n #lastConnectOptions?: {\n agentId?: AgentId;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n #isReconnecting = false;\n\n constructor(stream: Stream, options: AgentConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Set up notification handler for events and messages\n this.#connection.setNotificationHandler(this.#handleNotification.bind(this));\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Static Factory Methods\n // ===========================================================================\n\n /**\n * Connect and register an agent via WebSocket URL.\n *\n * Handles:\n * - WebSocket creation and connection\n * - Stream wrapping\n * - Auto-configuration of createStream for reconnection\n * - Initial MAP protocol connect handshake\n * - Agent registration\n *\n * @param url - WebSocket URL (ws:// or wss://)\n * @param options - Connection and agent options\n * @returns Connected and registered AgentConnection instance\n *\n * @example\n * ```typescript\n * const agent = await AgentConnection.connect('ws://localhost:8080', {\n * name: 'Worker',\n * role: 'processor',\n * reconnection: true\n * });\n *\n * // Already registered, ready to work\n * agent.onMessage(handleMessage);\n * await agent.busy();\n * ```\n */\n static async connect(\n url: string,\n options?: AgentConnectOptions\n ): Promise<AgentConnection> {\n // Validate URL\n const parsedUrl = new URL(url);\n if (!['ws:', 'wss:'].includes(parsedUrl.protocol)) {\n throw new Error(\n `Unsupported protocol: ${parsedUrl.protocol}. Use ws: or wss:`\n );\n }\n\n const timeout = options?.connectTimeout ?? 10000;\n\n // Create and connect WebSocket\n const ws = new WebSocket(url);\n await waitForOpen(ws, timeout);\n const stream = websocketStream(ws);\n\n // Configure createStream for reconnection\n const createStream = async () => {\n const newWs = new WebSocket(url);\n await waitForOpen(newWs, timeout);\n return websocketStream(newWs);\n };\n\n // Normalize reconnection option\n const reconnection =\n options?.reconnection === true\n ? { enabled: true }\n : typeof options?.reconnection === 'object'\n ? options.reconnection\n : undefined;\n\n // Create connection\n const agent = new AgentConnection(stream, {\n name: options?.name,\n role: options?.role,\n capabilities: options?.capabilities,\n visibility: options?.visibility,\n parent: options?.parent,\n scopes: options?.scopes,\n createStream,\n reconnection,\n });\n\n // Perform MAP handshake and registration\n await agent.connect({ auth: options?.auth });\n\n return agent;\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect and register with the MAP system\n */\n async connect(options?: {\n agentId?: AgentId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n }): Promise<{ connection: ConnectResponseResult; agent: Agent }> {\n // First, establish the connection\n const connectParams: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'agent',\n participantId: options?.agentId,\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n resumeToken: options?.resumeToken,\n auth: options?.auth,\n };\n\n const connectResult = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, connectParams);\n\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n this.#connected = true;\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n // Then register as an agent\n const registerParams: AgentsRegisterRequestParams = {\n agentId: options?.agentId,\n name: this.#options.name,\n role: this.#options.role,\n parent: this.#options.parent,\n scopes: this.#options.scopes,\n visibility: this.#options.visibility,\n capabilities: this.#options.capabilities,\n };\n\n const registerResult = await this.#connection.sendRequest<\n AgentsRegisterRequestParams,\n AgentsRegisterResponseResult\n >(LIFECYCLE_METHODS.AGENTS_REGISTER, registerParams);\n\n this.#agentId = registerResult.agent.id;\n this.#currentState = registerResult.agent.state;\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n return { connection: connectResult, agent: registerResult.agent };\n }\n\n /**\n * Disconnect from the MAP system\n * @param reason - Optional reason for disconnecting\n * @returns Resume token that can be used to resume this session later\n */\n async disconnect(reason?: string): Promise<string | undefined> {\n if (!this.#connected) return undefined;\n\n let resumeToken: string | undefined;\n try {\n // Unregister the agent first\n if (this.#agentId) {\n await this.#connection.sendRequest<\n { agentId: AgentId; reason?: string },\n AgentsUnregisterResponseResult\n >(LIFECYCLE_METHODS.AGENTS_UNREGISTER, {\n agentId: this.#agentId,\n reason,\n });\n }\n\n // Then disconnect\n const result = await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n resumeToken = result.resumeToken;\n } finally {\n // Close all subscriptions\n for (const subscription of this.#subscriptions.values()) {\n subscription._close();\n }\n this.#subscriptions.clear();\n\n await this.#connection.close();\n this.#connected = false;\n }\n return resumeToken;\n }\n\n /**\n * Whether the agent is connected\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * This agent's ID\n */\n get agentId(): AgentId | null {\n return this.#agentId;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * Current agent state\n */\n get state(): AgentState {\n return this.#currentState;\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Message Handling\n // ===========================================================================\n\n /**\n * Register a handler for incoming messages\n */\n onMessage(handler: MessageHandler): this {\n this.#messageHandlers.add(handler);\n return this;\n }\n\n /**\n * Remove a message handler\n */\n offMessage(handler: MessageHandler): this {\n this.#messageHandlers.delete(handler);\n return this;\n }\n\n // ===========================================================================\n // State Management\n // ===========================================================================\n\n /**\n * Update this agent's state\n */\n async updateState(state: AgentState): Promise<Agent> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { agentId: AgentId; state: AgentState },\n AgentsUpdateResponseResult\n >(STATE_METHODS.AGENTS_UPDATE, {\n agentId: this.#agentId,\n state,\n });\n\n this.#currentState = result.agent.state;\n return result.agent;\n }\n\n /**\n * Update this agent's metadata\n */\n async updateMetadata(metadata: Record<string, unknown>): Promise<Agent> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { agentId: AgentId; metadata: Record<string, unknown> },\n AgentsUpdateResponseResult\n >(STATE_METHODS.AGENTS_UPDATE, {\n agentId: this.#agentId,\n metadata,\n });\n\n return result.agent;\n }\n\n /**\n * Mark this agent as busy\n */\n async busy(): Promise<Agent> {\n return this.updateState('busy');\n }\n\n /**\n * Mark this agent as idle\n */\n async idle(): Promise<Agent> {\n return this.updateState('idle');\n }\n\n /**\n * Mark this agent as done/stopped\n */\n async done(result?: { exitCode?: number; exitReason?: string }): Promise<void> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n await this.updateState('stopped');\n\n // Optionally update metadata with result\n if (result) {\n await this.updateMetadata({\n exitCode: result.exitCode,\n exitReason: result.exitReason,\n });\n }\n }\n\n // ===========================================================================\n // Child Agent Management\n // ===========================================================================\n\n /**\n * Spawn a child agent\n */\n async spawn(options: {\n agentId?: AgentId;\n name?: string;\n role?: string;\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n scopes?: ScopeId[];\n initialMessage?: Message;\n metadata?: Record<string, unknown>;\n }): Promise<AgentsSpawnResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const params: AgentsSpawnRequestParams = {\n ...options,\n parent: this.#agentId,\n };\n\n return this.#connection.sendRequest<\n AgentsSpawnRequestParams,\n AgentsSpawnResponseResult\n >(LIFECYCLE_METHODS.AGENTS_SPAWN, params);\n }\n\n // ===========================================================================\n // Messaging\n // ===========================================================================\n\n /**\n * Send a message to an address\n */\n async send(\n to: Address,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n const params: SendRequestParams = { to };\n if (payload !== undefined) params.payload = payload;\n if (meta) params.meta = meta;\n\n return this.#connection.sendRequest(CORE_METHODS.SEND, params);\n }\n\n /**\n * Send a message to the parent agent\n */\n async sendToParent(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ parent: true }, payload, {\n ...meta,\n relationship: 'child-to-parent',\n });\n }\n\n /**\n * Send a message to child agents\n */\n async sendToChildren(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ children: true }, payload, {\n ...meta,\n relationship: 'parent-to-child',\n });\n }\n\n /**\n * Send a message to a specific agent\n */\n async sendToAgent(\n agentId: AgentId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: agentId }, payload, meta);\n }\n\n /**\n * Send a message to all agents in a scope\n */\n async sendToScope(\n scopeId: ScopeId,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ scope: scopeId }, payload, meta);\n }\n\n /**\n * Send a message to sibling agents\n */\n async sendToSiblings(payload?: unknown, meta?: MessageMeta): Promise<SendResponseResult> {\n return this.send({ siblings: true }, payload, {\n ...meta,\n relationship: 'peer',\n });\n }\n\n /**\n * Reply to a message (uses correlationId from original)\n */\n async reply(\n originalMessage: Message,\n payload?: unknown,\n meta?: MessageMeta\n ): Promise<SendResponseResult> {\n return this.send({ agent: originalMessage.from as AgentId }, payload, {\n ...meta,\n correlationId: originalMessage.meta?.correlationId ?? originalMessage.id,\n isResult: true,\n });\n }\n\n // ===========================================================================\n // Scope Management\n // ===========================================================================\n\n /**\n * Create a new scope\n */\n async createScope(options: ScopesCreateRequestParams): Promise<Scope> {\n const result = await this.#connection.sendRequest<\n ScopesCreateRequestParams,\n ScopesCreateResponseResult\n >(SCOPE_METHODS.SCOPES_CREATE, options);\n return result.scope;\n }\n\n /**\n * Join a scope\n */\n async joinScope(scopeId: ScopeId): Promise<ScopesJoinResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId; agentId: AgentId },\n ScopesJoinResponseResult\n >(SCOPE_METHODS.SCOPES_JOIN, {\n scopeId,\n agentId: this.#agentId,\n });\n\n // Track scope membership for potential restoration\n this.#scopeMemberships.add(scopeId);\n\n return result;\n }\n\n /**\n * Leave a scope\n */\n async leaveScope(scopeId: ScopeId): Promise<ScopesLeaveResponseResult> {\n if (!this.#agentId) {\n throw new Error('Agent not registered');\n }\n\n const result = await this.#connection.sendRequest<\n { scopeId: ScopeId; agentId: AgentId },\n ScopesLeaveResponseResult\n >(SCOPE_METHODS.SCOPES_LEAVE, {\n scopeId,\n agentId: this.#agentId,\n });\n\n // Remove from tracked scope memberships\n this.#scopeMemberships.delete(scopeId);\n\n return result;\n }\n\n // ===========================================================================\n // Subscriptions\n // ===========================================================================\n\n /**\n * Subscribe to events\n */\n async subscribe(filter?: SubscriptionFilter): Promise<Subscription> {\n const params: SubscribeRequestParams = {};\n if (filter) params.filter = filter;\n\n const result = await this.#connection.sendRequest<\n SubscribeRequestParams,\n SubscribeResponseResult\n >(CORE_METHODS.SUBSCRIBE, params);\n\n const subscription = createSubscription(\n result.subscriptionId,\n () => this.unsubscribe(result.subscriptionId),\n { filter }\n );\n\n this.#subscriptions.set(result.subscriptionId, subscription);\n\n return subscription;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(subscriptionId: SubscriptionId): Promise<void> {\n const subscription = this.#subscriptions.get(subscriptionId);\n if (subscription) {\n subscription._close();\n this.#subscriptions.delete(subscriptionId);\n }\n\n await this.#connection.sendRequest<\n { subscriptionId: SubscriptionId },\n UnsubscribeResponseResult\n >(CORE_METHODS.UNSUBSCRIBE, { subscriptionId });\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get connectionState(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n */\n onReconnection(handler: AgentReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Handle incoming notifications\n */\n async #handleNotification(method: string, params: unknown): Promise<void> {\n switch (method) {\n case NOTIFICATION_METHODS.EVENT: {\n const eventParams = params as EventNotificationParams;\n const subscription = this.#subscriptions.get(eventParams.subscriptionId);\n if (subscription) {\n subscription._pushEvent(eventParams);\n }\n break;\n }\n\n case NOTIFICATION_METHODS.MESSAGE: {\n const messageParams = params as MessageNotificationParams;\n // Deliver to message handlers\n for (const handler of this.#messageHandlers) {\n try {\n await handler(messageParams.message);\n } catch (error) {\n console.error('MAP: Message handler error:', error);\n }\n }\n break;\n }\n\n default:\n console.warn('MAP: Unknown notification:', method);\n }\n }\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<AgentReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n // Store current scopes for restoration\n const scopesToRestore = Array.from(this.#scopeMemberships);\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-establish connection and registration\n // Use the stored agentId to try to reclaim the same identity\n const result = await this.connect({\n agentId: this.#agentId ?? this.#lastConnectOptions?.agentId,\n auth: this.#lastConnectOptions?.auth,\n });\n\n // Update stored values\n this.#agentId = result.agent.id;\n this.#sessionId = result.connection.sessionId;\n this.#serverCapabilities = result.connection.capabilities;\n this.#currentState = result.agent.state;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Restore scope memberships if enabled\n if (options.restoreScopeMemberships !== false) {\n await this.#restoreScopeMemberships(scopesToRestore);\n }\n }\n\n /**\n * Restore scope memberships after reconnection\n */\n async #restoreScopeMemberships(scopes: ScopeId[]): Promise<void> {\n // Clear tracked memberships (will be re-added by joinScope)\n this.#scopeMemberships.clear();\n\n for (const scopeId of scopes) {\n try {\n await this.joinScope(scopeId);\n } catch (error) {\n console.warn('MAP: Failed to restore scope membership:', scopeId, error);\n }\n }\n }\n}\n","/**\n * Federation Envelope Utilities\n *\n * Provides functions for creating and processing federation envelopes\n * for routing messages between federated MAP systems.\n */\n\nimport type { FederationEnvelope, FederationRoutingConfig } from '../types';\nimport { ERROR_CODES } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Options for creating a federation envelope.\n */\nexport interface CreateEnvelopeOptions {\n /** Correlation ID for cross-system tracing */\n correlationId?: string;\n /** Maximum number of hops before rejection */\n maxHops?: number;\n /** Whether to track the full routing path */\n trackPath?: boolean;\n}\n\n/**\n * Result of processing a federation envelope.\n */\nexport type ProcessEnvelopeResult<T> =\n | {\n success: true;\n envelope: FederationEnvelope<T>;\n }\n | {\n success: false;\n errorCode: number;\n errorMessage: string;\n };\n\n// =============================================================================\n// Envelope Creation\n// =============================================================================\n\n/**\n * Create a new federation envelope for outbound messages.\n *\n * @param payload - The payload to wrap (typically a Message)\n * @param sourceSystem - ID of the originating system\n * @param targetSystem - ID of the destination system\n * @param options - Optional envelope options\n * @returns A new federation envelope\n *\n * @example\n * ```typescript\n * const envelope = createFederationEnvelope(\n * message,\n * 'system-alpha',\n * 'system-beta',\n * { trackPath: true, correlationId: 'req-123' }\n * );\n * ```\n */\nexport function createFederationEnvelope<T>(\n payload: T,\n sourceSystem: string,\n targetSystem: string,\n options?: CreateEnvelopeOptions\n): FederationEnvelope<T> {\n return {\n payload,\n federation: {\n sourceSystem,\n targetSystem,\n hopCount: 0,\n maxHops: options?.maxHops,\n path: options?.trackPath ? [sourceSystem] : undefined,\n originTimestamp: Date.now(),\n correlationId: options?.correlationId,\n },\n };\n}\n\n// =============================================================================\n// Envelope Processing\n// =============================================================================\n\n/**\n * Process an incoming federation envelope for forwarding.\n *\n * Validates the envelope against routing configuration and returns\n * an updated envelope ready for forwarding, or an error if routing\n * should be rejected.\n *\n * Checks performed:\n * 1. Hop count hasn't exceeded maximum\n * 2. No routing loops (if path tracking enabled)\n * 3. Source system is in allowed sources (if configured)\n * 4. Target system is in allowed targets (if configured)\n *\n * @param envelope - The incoming envelope\n * @param config - Routing configuration for this system\n * @returns Updated envelope or error result\n *\n * @example\n * ```typescript\n * const result = processFederationEnvelope(envelope, {\n * systemId: 'system-gamma',\n * maxHops: 5,\n * trackPath: true,\n * });\n *\n * if (result.success) {\n * forwardToNext(result.envelope);\n * } else {\n * rejectWithError(result.errorCode, result.errorMessage);\n * }\n * ```\n */\nexport function processFederationEnvelope<T>(\n envelope: FederationEnvelope<T>,\n config: FederationRoutingConfig\n): ProcessEnvelopeResult<T> {\n const { federation } = envelope;\n const maxHops = federation.maxHops ?? config.maxHops ?? 10;\n\n // Check hop count\n if (federation.hopCount >= maxHops) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_MAX_HOPS_EXCEEDED,\n errorMessage: `Message exceeded maximum hop count of ${maxHops}`,\n };\n }\n\n // Check for loops (if path tracking enabled)\n if (federation.path?.includes(config.systemId)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_LOOP_DETECTED,\n errorMessage: `Loop detected: message already visited ${config.systemId}`,\n };\n }\n\n // Check source allowlist\n if (config.allowedSources && !config.allowedSources.includes(federation.sourceSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Source system ${federation.sourceSystem} not in allowed sources`,\n };\n }\n\n // Check target allowlist\n if (config.allowedTargets && !config.allowedTargets.includes(federation.targetSystem)) {\n return {\n success: false,\n errorCode: ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n errorMessage: `Target system ${federation.targetSystem} not in allowed targets`,\n };\n }\n\n // Update for forwarding\n return {\n success: true,\n envelope: {\n payload: envelope.payload,\n federation: {\n ...federation,\n hopCount: federation.hopCount + 1,\n path: config.trackPath ? [...(federation.path ?? []), config.systemId] : federation.path,\n },\n },\n };\n}\n\n// =============================================================================\n// Envelope Utilities\n// =============================================================================\n\n/**\n * Check if an envelope has reached its final destination.\n *\n * @param envelope - The envelope to check\n * @param currentSystemId - ID of the current system\n * @returns true if this is the target system\n */\nexport function isEnvelopeAtDestination(\n envelope: FederationEnvelope<unknown>,\n currentSystemId: string\n): boolean {\n return envelope.federation.targetSystem === currentSystemId;\n}\n\n/**\n * Extract the payload from a federation envelope.\n *\n * @param envelope - The envelope to unwrap\n * @returns The payload\n */\nexport function unwrapEnvelope<T>(envelope: FederationEnvelope<T>): T {\n return envelope.payload;\n}\n\n/**\n * Get routing metadata for logging/debugging.\n *\n * @param envelope - The envelope to inspect\n * @returns Routing information\n */\nexport function getEnvelopeRoutingInfo(envelope: FederationEnvelope<unknown>): {\n source: string;\n target: string;\n hops: number;\n path?: string[];\n age: number;\n correlationId?: string;\n} {\n const { federation } = envelope;\n return {\n source: federation.sourceSystem,\n target: federation.targetSystem,\n hops: federation.hopCount,\n path: federation.path,\n age: Date.now() - federation.originTimestamp,\n correlationId: federation.correlationId,\n };\n}\n\n/**\n * Validate that an object is a valid federation envelope.\n *\n * @param obj - Object to validate\n * @returns true if valid envelope structure\n */\nexport function isValidEnvelope(obj: unknown): obj is FederationEnvelope<unknown> {\n if (!obj || typeof obj !== 'object') return false;\n\n const envelope = obj as Record<string, unknown>;\n if (!('payload' in envelope) || !('federation' in envelope)) return false;\n\n const federation = envelope.federation as Record<string, unknown>;\n if (!federation || typeof federation !== 'object') return false;\n\n return (\n typeof federation.sourceSystem === 'string' &&\n typeof federation.targetSystem === 'string' &&\n typeof federation.hopCount === 'number' &&\n typeof federation.originTimestamp === 'number'\n );\n}\n\n/**\n * Create an updated envelope with a new payload (for transformations).\n *\n * @param envelope - Original envelope\n * @param newPayload - New payload\n * @returns New envelope with same metadata but new payload\n */\nexport function withPayload<T, U>(\n envelope: FederationEnvelope<T>,\n newPayload: U\n): FederationEnvelope<U> {\n return {\n payload: newPayload,\n federation: envelope.federation,\n };\n}\n","/**\n * Federation Outage Buffer\n *\n * Buffers outbound messages during federation outages for later delivery\n * when the peer reconnects.\n */\n\nimport type {\n FederationEnvelope,\n FederationBufferConfig,\n Message,\n Timestamp,\n} from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * A buffered message with metadata.\n */\ninterface BufferedMessage {\n envelope: FederationEnvelope<Message>;\n enqueuedAt: Timestamp;\n size: number;\n}\n\n/**\n * Per-peer buffer state.\n */\ninterface PeerBuffer {\n messages: BufferedMessage[];\n totalEnqueued: number;\n totalDropped: number;\n totalBytes: number;\n}\n\n/**\n * Buffer statistics for a peer.\n */\nexport interface PeerBufferStats {\n /** Number of messages currently buffered */\n count: number;\n /** Age of oldest message in milliseconds */\n oldestAge: number;\n /** Total messages ever enqueued */\n totalEnqueued: number;\n /** Total messages dropped due to overflow/expiry */\n totalDropped: number;\n /** Current buffer size in bytes */\n totalBytes: number;\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nconst DEFAULT_CONFIG: Required<FederationBufferConfig> = {\n enabled: true,\n maxMessages: 1000,\n maxBytes: 10 * 1024 * 1024, // 10MB\n retentionMs: 60 * 60 * 1000, // 1 hour\n overflowStrategy: 'drop-oldest',\n};\n\n// =============================================================================\n// Buffer Implementation\n// =============================================================================\n\n/**\n * Buffer for storing outbound messages during federation outages.\n *\n * Messages are stored per-peer and drained on reconnection.\n * Supports configurable size limits, retention, and overflow strategies.\n *\n * @example\n * ```typescript\n * const buffer = new FederationOutageBuffer({\n * maxMessages: 500,\n * retentionMs: 30000,\n * overflowStrategy: 'drop-oldest',\n * });\n *\n * // Buffer messages during outage\n * buffer.enqueue('peer-1', envelope);\n *\n * // On reconnect, drain and send\n * const messages = buffer.drain('peer-1');\n * for (const msg of messages) {\n * await send(msg);\n * }\n * ```\n */\nexport class FederationOutageBuffer {\n readonly #config: Required<FederationBufferConfig>;\n readonly #buffers: Map<string, PeerBuffer> = new Map();\n\n constructor(config?: FederationBufferConfig) {\n this.#config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Whether buffering is enabled.\n */\n get enabled(): boolean {\n return this.#config.enabled;\n }\n\n /**\n * Get the configuration.\n */\n get config(): Readonly<Required<FederationBufferConfig>> {\n return this.#config;\n }\n\n /**\n * Enqueue a message for a peer.\n *\n * @param peerId - Target peer system ID\n * @param envelope - Message envelope to buffer\n * @returns true if message was buffered, false if rejected\n */\n enqueue(peerId: string, envelope: FederationEnvelope<Message>): boolean {\n if (!this.#config.enabled) return false;\n\n let buffer = this.#buffers.get(peerId);\n if (!buffer) {\n buffer = { messages: [], totalEnqueued: 0, totalDropped: 0, totalBytes: 0 };\n this.#buffers.set(peerId, buffer);\n }\n\n // Evict expired messages first\n this.#evictExpired(buffer);\n\n // Estimate message size\n const messageSize = this.#estimateSize(envelope);\n\n // Check byte limit\n while (buffer.totalBytes + messageSize > this.#config.maxBytes && buffer.messages.length > 0) {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n }\n\n // Check message count limit\n if (buffer.messages.length >= this.#config.maxMessages) {\n switch (this.#config.overflowStrategy) {\n case 'drop-oldest': {\n const removed = buffer.messages.shift()!;\n buffer.totalBytes -= removed.size;\n buffer.totalDropped++;\n break;\n }\n case 'drop-newest':\n buffer.totalDropped++;\n return false;\n case 'reject':\n return false;\n }\n }\n\n buffer.messages.push({\n envelope,\n enqueuedAt: Date.now(),\n size: messageSize,\n });\n buffer.totalEnqueued++;\n buffer.totalBytes += messageSize;\n\n return true;\n }\n\n /**\n * Drain all buffered messages for a peer.\n *\n * Returns messages in FIFO order and clears the buffer.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes\n */\n drain(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired before draining\n this.#evictExpired(buffer);\n\n const messages = buffer.messages.map((m) => m.envelope);\n buffer.messages = [];\n buffer.totalBytes = 0;\n\n return messages;\n }\n\n /**\n * Peek at buffered messages without removing them.\n *\n * @param peerId - Target peer system ID\n * @returns Array of buffered envelopes (still in buffer)\n */\n peek(peerId: string): FederationEnvelope<Message>[] {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return [];\n\n // Evict expired\n this.#evictExpired(buffer);\n\n return buffer.messages.map((m) => m.envelope);\n }\n\n /**\n * Get statistics for all peer buffers.\n *\n * @returns Map of peer ID to buffer stats\n */\n stats(): Map<string, PeerBufferStats> {\n const result = new Map<string, PeerBufferStats>();\n const now = Date.now();\n\n for (const [peerId, buffer] of this.#buffers) {\n // Evict expired for accurate stats\n this.#evictExpired(buffer);\n\n const oldestAge =\n buffer.messages.length > 0 ? now - buffer.messages[0].enqueuedAt : 0;\n\n result.set(peerId, {\n count: buffer.messages.length,\n oldestAge,\n totalEnqueued: buffer.totalEnqueued,\n totalDropped: buffer.totalDropped,\n totalBytes: buffer.totalBytes,\n });\n }\n\n return result;\n }\n\n /**\n * Get count for a specific peer.\n *\n * @param peerId - Target peer system ID\n * @returns Number of buffered messages\n */\n count(peerId: string): number {\n const buffer = this.#buffers.get(peerId);\n if (!buffer) return 0;\n\n this.#evictExpired(buffer);\n return buffer.messages.length;\n }\n\n /**\n * Check if buffer has messages for a peer.\n *\n * @param peerId - Target peer system ID\n * @returns true if there are buffered messages\n */\n has(peerId: string): boolean {\n return this.count(peerId) > 0;\n }\n\n /**\n * Clear buffer for a specific peer.\n *\n * @param peerId - Target peer system ID\n */\n clear(peerId: string): void {\n this.#buffers.delete(peerId);\n }\n\n /**\n * Clear all buffers.\n */\n clearAll(): void {\n this.#buffers.clear();\n }\n\n /**\n * Get list of peers with buffered messages.\n *\n * @returns Array of peer IDs\n */\n peers(): string[] {\n const result: string[] = [];\n for (const [peerId, buffer] of this.#buffers) {\n this.#evictExpired(buffer);\n if (buffer.messages.length > 0) {\n result.push(peerId);\n }\n }\n return result;\n }\n\n /**\n * Evict expired messages from a buffer.\n */\n #evictExpired(buffer: PeerBuffer): void {\n const cutoff = Date.now() - this.#config.retentionMs;\n let removed = 0;\n let bytesRemoved = 0;\n\n while (buffer.messages.length > 0 && buffer.messages[0].enqueuedAt < cutoff) {\n const msg = buffer.messages.shift()!;\n bytesRemoved += msg.size;\n removed++;\n }\n\n buffer.totalDropped += removed;\n buffer.totalBytes -= bytesRemoved;\n }\n\n /**\n * Estimate the size of an envelope in bytes.\n */\n #estimateSize(envelope: FederationEnvelope<Message>): number {\n // Simple estimation using JSON serialization\n try {\n return JSON.stringify(envelope).length * 2; // UTF-16\n } catch {\n return 1024; // Default estimate if serialization fails\n }\n }\n}\n","/**\n * Gateway connection for MAP protocol federation\n *\n * Used by gateways to connect two MAP systems together,\n * routing messages between them.\n */\n\nimport type { Stream } from '../stream';\nimport { BaseConnection, type BaseConnectionOptions, type ConnectionState } from './base';\nimport { withRetry, type RetryPolicy, DEFAULT_RETRY_POLICY } from '../utils';\nimport {\n CORE_METHODS,\n FEDERATION_METHODS,\n PROTOCOL_VERSION,\n type ParticipantCapabilities,\n type SessionId,\n type Message,\n type ConnectRequestParams,\n type ConnectResponseResult,\n type DisconnectResponseResult,\n type FederationConnectRequestParams,\n type FederationConnectResponseResult,\n type FederationRouteRequestParams,\n type FederationRouteResponseResult,\n type FederationRoutingConfig,\n type FederationBufferConfig,\n type FederationEnvelope,\n type ReplayRequestParams,\n type ReplayResponseResult,\n type EventType,\n} from '../types';\nimport { createFederationEnvelope } from '../federation/envelope';\nimport { FederationOutageBuffer } from '../federation/buffer';\n\n/**\n * Options for automatic gateway reconnection\n */\nexport interface GatewayReconnectionOptions {\n /** Enable automatic reconnection (default: false) */\n enabled: boolean;\n /** Maximum number of retry attempts (default: 10) */\n maxRetries?: number;\n /** Initial delay in milliseconds (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Add jitter to delays (default: true) */\n jitter?: boolean;\n}\n\n/**\n * Options for event replay on gateway reconnection\n */\nexport interface GatewayReplayOptions {\n /** Enable replay on reconnection (default: false) */\n enabled: boolean;\n /** Event types to replay (default: all) */\n eventTypes?: EventType[];\n /** Maximum events to replay per peer (default: 1000) */\n maxEvents?: number;\n /** Maximum age of events to replay in ms (default: 1 hour) */\n maxAgeMs?: number;\n}\n\n/**\n * Reconnection event types for gateway\n */\nexport type GatewayReconnectionEventType =\n | 'disconnected'\n | 'reconnecting'\n | 'reconnected'\n | 'reconnectFailed'\n | 'bufferOverflow'\n | 'bufferDrained'\n | 'replayStarted'\n | 'replayCompleted';\n\n/**\n * Handler for gateway reconnection events\n */\nexport type GatewayReconnectionEventHandler = (event: {\n type: GatewayReconnectionEventType;\n attempt?: number;\n delay?: number;\n error?: Error;\n peerId?: string;\n messagesBuffered?: number;\n messagesDrained?: number;\n eventsReplayed?: number;\n}) => void;\n\n/**\n * Options for gateway connection\n */\nexport interface GatewayConnectionOptions extends BaseConnectionOptions {\n /** Gateway name */\n name?: string;\n /** Gateway capabilities */\n capabilities?: ParticipantCapabilities;\n /** Federation routing configuration */\n routing?: FederationRoutingConfig;\n /** Factory to create new stream for reconnection */\n createStream?: () => Promise<Stream>;\n /** Reconnection options */\n reconnection?: GatewayReconnectionOptions;\n /** Outage buffer configuration */\n buffer?: FederationBufferConfig;\n /** Replay options for reconnection */\n replay?: GatewayReplayOptions;\n}\n\n/**\n * Gateway connection for MAP federation.\n *\n * Provides methods for:\n * - Connecting to peer MAP systems\n * - Routing messages between systems\n * - Automatic reconnection with message buffering\n */\nexport class GatewayConnection {\n #connection: BaseConnection;\n readonly #options: GatewayConnectionOptions;\n readonly #connectedSystems: Map<string, { name?: string; version?: string }> = new Map();\n readonly #reconnectionHandlers: Set<GatewayReconnectionEventHandler> = new Set();\n readonly #outageBuffer: FederationOutageBuffer | null;\n readonly #lastSyncTimestamps: Map<string, number> = new Map();\n\n #sessionId: SessionId | null = null;\n #serverCapabilities: ParticipantCapabilities | null = null;\n #connected = false;\n #isReconnecting = false;\n #lastConnectOptions?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n };\n\n constructor(stream: Stream, options: GatewayConnectionOptions = {}) {\n this.#connection = new BaseConnection(stream, options);\n this.#options = options;\n\n // Initialize outage buffer if configured\n this.#outageBuffer = options.buffer?.enabled\n ? new FederationOutageBuffer(options.buffer)\n : null;\n\n // Set up disconnect detection for auto-reconnect\n if (options.reconnection?.enabled && options.createStream) {\n this.#connection.onStateChange((newState) => {\n if (newState === 'closed' && this.#connected && !this.#isReconnecting) {\n void this.#handleDisconnect();\n }\n });\n }\n }\n\n // ===========================================================================\n // Connection Lifecycle\n // ===========================================================================\n\n /**\n * Connect to the local MAP system\n */\n async connect(options?: {\n auth?: { method: 'bearer' | 'api-key' | 'mtls' | 'none'; token?: string };\n }): Promise<ConnectResponseResult> {\n const params: ConnectRequestParams = {\n protocolVersion: PROTOCOL_VERSION,\n participantType: 'gateway',\n name: this.#options.name,\n capabilities: this.#options.capabilities,\n auth: options?.auth,\n };\n\n const result = await this.#connection.sendRequest<\n ConnectRequestParams,\n ConnectResponseResult\n >(CORE_METHODS.CONNECT, params);\n\n this.#sessionId = result.sessionId;\n this.#serverCapabilities = result.capabilities;\n this.#connected = true;\n\n // Transition to connected state\n this.#connection._transitionTo('connected');\n\n // Store connect options for potential reconnection\n this.#lastConnectOptions = options;\n\n return result;\n }\n\n /**\n * Disconnect from the local MAP system\n */\n async disconnect(reason?: string): Promise<void> {\n if (!this.#connected) return;\n\n try {\n await this.#connection.sendRequest<{ reason?: string }, DisconnectResponseResult>(\n CORE_METHODS.DISCONNECT,\n reason ? { reason } : undefined\n );\n } finally {\n await this.#connection.close();\n this.#connected = false;\n }\n }\n\n /**\n * Whether the gateway is connected to the local system\n */\n get isConnected(): boolean {\n return this.#connected && !this.#connection.isClosed;\n }\n\n /**\n * Current session ID\n */\n get sessionId(): SessionId | null {\n return this.#sessionId;\n }\n\n /**\n * Server capabilities\n */\n get serverCapabilities(): ParticipantCapabilities | null {\n return this.#serverCapabilities;\n }\n\n /**\n * List of connected remote systems\n */\n get connectedSystems(): Map<string, { name?: string; version?: string }> {\n return new Map(this.#connectedSystems);\n }\n\n /**\n * AbortSignal that triggers when the connection closes\n */\n get signal(): AbortSignal {\n return this.#connection.signal;\n }\n\n /**\n * Promise that resolves when the connection closes\n */\n get closed(): Promise<void> {\n return this.#connection.closed;\n }\n\n // ===========================================================================\n // Federation\n // ===========================================================================\n\n /**\n * Connect to a remote MAP system\n */\n async connectToSystem(\n systemId: string,\n endpoint: string,\n auth?: { method: 'bearer' | 'api-key' | 'mtls'; credentials?: string }\n ): Promise<FederationConnectResponseResult> {\n const params: FederationConnectRequestParams = {\n systemId,\n endpoint,\n auth,\n };\n\n const result = await this.#connection.sendRequest<\n FederationConnectRequestParams,\n FederationConnectResponseResult\n >(FEDERATION_METHODS.FEDERATION_CONNECT, params);\n\n if (result.connected && result.systemInfo) {\n this.#connectedSystems.set(systemId, {\n name: result.systemInfo.name,\n version: result.systemInfo.version,\n });\n }\n\n return result;\n }\n\n /**\n * Route a message to a remote system.\n *\n * If routing config is provided, wraps the message in a federation envelope\n * with proper metadata for multi-hop routing. Otherwise, sends raw message\n * for backwards compatibility.\n *\n * During reconnection, messages are buffered if buffer is configured.\n */\n async routeToSystem(\n systemId: string,\n message: Message\n ): Promise<FederationRouteResponseResult> {\n // Create envelope if routing config available\n let envelope: FederationEnvelope<Message> | undefined;\n if (this.#options.routing) {\n envelope = createFederationEnvelope(\n message,\n this.#options.routing.systemId,\n systemId,\n {\n maxHops: this.#options.routing.maxHops,\n trackPath: this.#options.routing.trackPath,\n }\n );\n }\n\n // If reconnecting and buffer is available, buffer the message\n if (this.#isReconnecting && this.#outageBuffer && envelope) {\n const buffered = this.#outageBuffer.enqueue(systemId, envelope);\n if (!buffered) {\n this.#emitReconnectionEvent({\n type: 'bufferOverflow',\n peerId: systemId,\n messagesBuffered: this.#outageBuffer.count(systemId),\n });\n }\n // Return a \"pending\" response - message will be sent on reconnect\n return { routed: false };\n }\n\n const params: FederationRouteRequestParams = { systemId };\n if (envelope) {\n params.envelope = envelope;\n } else {\n // Legacy: send raw message for backwards compatibility\n params.message = message;\n }\n\n const result = await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n\n // Update sync timestamp on successful route\n if (result.routed) {\n this.#lastSyncTimestamps.set(systemId, Date.now());\n }\n\n return result;\n }\n\n /**\n * Check if a remote system is connected\n */\n isSystemConnected(systemId: string): boolean {\n return this.#connectedSystems.has(systemId);\n }\n\n // ===========================================================================\n // Reconnection\n // ===========================================================================\n\n /**\n * Current connection state\n */\n get state(): ConnectionState {\n return this.#connection.state;\n }\n\n /**\n * Whether the connection is currently reconnecting\n */\n get isReconnecting(): boolean {\n return this.#isReconnecting;\n }\n\n /**\n * Get the outage buffer (for advanced use)\n */\n get outageBuffer(): FederationOutageBuffer | null {\n return this.#outageBuffer;\n }\n\n /**\n * Get last sync timestamp for a peer\n */\n getLastSyncTimestamp(peerId: string): number | undefined {\n return this.#lastSyncTimestamps.get(peerId);\n }\n\n /**\n * Register a handler for reconnection events.\n *\n * @param handler - Function called when reconnection events occur\n * @returns Unsubscribe function to remove the handler\n */\n onReconnection(handler: GatewayReconnectionEventHandler): () => void {\n this.#reconnectionHandlers.add(handler);\n return () => this.#reconnectionHandlers.delete(handler);\n }\n\n /**\n * Register a handler for connection state changes.\n *\n * @param handler - Function called when state changes\n * @returns Unsubscribe function to remove the handler\n */\n onStateChange(\n handler: (newState: ConnectionState, oldState: ConnectionState) => void\n ): () => void {\n return this.#connection.onStateChange(handler);\n }\n\n // ===========================================================================\n // Internal\n // ===========================================================================\n\n /**\n * Emit a reconnection event to all registered handlers\n */\n #emitReconnectionEvent(event: Parameters<GatewayReconnectionEventHandler>[0]): void {\n for (const handler of this.#reconnectionHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('MAP: Gateway reconnection event handler error:', error);\n }\n }\n }\n\n /**\n * Handle disconnect when auto-reconnect is enabled\n */\n async #handleDisconnect(): Promise<void> {\n this.#isReconnecting = true;\n this.#connected = false;\n\n this.#emitReconnectionEvent({ type: 'disconnected' });\n\n try {\n await this.#attemptReconnect();\n } catch (error) {\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({\n type: 'reconnectFailed',\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n /**\n * Attempt to reconnect with retry logic\n */\n async #attemptReconnect(): Promise<void> {\n const options = this.#options.reconnection!;\n const createStream = this.#options.createStream!;\n\n const retryPolicy: RetryPolicy = {\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_POLICY.maxRetries,\n baseDelayMs: options.baseDelayMs ?? DEFAULT_RETRY_POLICY.baseDelayMs,\n maxDelayMs: options.maxDelayMs ?? DEFAULT_RETRY_POLICY.maxDelayMs,\n jitter: options.jitter ?? DEFAULT_RETRY_POLICY.jitter,\n };\n\n await withRetry(\n async () => {\n // Create a new stream\n const newStream = await createStream();\n\n // Reconnect the base connection\n await this.#connection.reconnect(newStream);\n\n // Re-authenticate\n const connectResult = await this.connect(this.#lastConnectOptions);\n\n // Update stored values\n this.#sessionId = connectResult.sessionId;\n this.#serverCapabilities = connectResult.capabilities;\n },\n retryPolicy,\n {\n onRetry: (state) => {\n this.#emitReconnectionEvent({\n type: 'reconnecting',\n attempt: state.attempt,\n delay: state.nextDelayMs,\n error: state.lastError,\n });\n },\n }\n );\n\n this.#isReconnecting = false;\n this.#emitReconnectionEvent({ type: 'reconnected' });\n\n // Drain buffered messages immediately on reconnect\n await this.#drainBufferedMessages();\n\n // Replay missed events from peers\n await this.#replayFromPeers();\n }\n\n /**\n * Drain buffered messages after reconnection\n */\n async #drainBufferedMessages(): Promise<void> {\n if (!this.#outageBuffer) return;\n\n const peers = this.#outageBuffer.peers();\n for (const peerId of peers) {\n const messages = this.#outageBuffer.drain(peerId);\n if (messages.length === 0) continue;\n\n // Send each buffered message\n for (const envelope of messages) {\n try {\n const params: FederationRouteRequestParams = {\n systemId: peerId,\n envelope,\n };\n\n await this.#connection.sendRequest<\n FederationRouteRequestParams,\n FederationRouteResponseResult\n >(FEDERATION_METHODS.FEDERATION_ROUTE, params);\n } catch (error) {\n // Log but continue draining - we don't want to lose other messages\n console.warn('MAP: Failed to send buffered message to', peerId, error);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'bufferDrained',\n peerId,\n messagesDrained: messages.length,\n });\n }\n }\n\n /**\n * Replay missed events from peers after reconnection\n */\n async #replayFromPeers(): Promise<void> {\n const replayOptions = this.#options.replay;\n if (!replayOptions?.enabled) return;\n\n // Get peers that have sync timestamps (peers we've communicated with)\n const peersToReplay = Array.from(this.#lastSyncTimestamps.entries());\n if (peersToReplay.length === 0) return;\n\n for (const [peerId, lastSync] of peersToReplay) {\n try {\n await this.#replayFromPeer(peerId, lastSync);\n } catch (error) {\n // Log but continue with other peers\n console.warn('MAP: Failed to replay events from peer', peerId, error);\n }\n }\n }\n\n /**\n * Replay missed events from a single peer\n */\n async #replayFromPeer(peerId: string, lastSyncTimestamp: number): Promise<void> {\n const replayOptions = this.#options.replay!;\n\n // Check max age\n const maxAge = replayOptions.maxAgeMs ?? 60 * 60 * 1000; // 1 hour default\n const cutoff = Date.now() - maxAge;\n if (lastSyncTimestamp < cutoff) {\n // Too old, skip replay for this peer\n return;\n }\n\n this.#emitReconnectionEvent({ type: 'replayStarted', peerId });\n\n let totalReplayed = 0;\n const maxEvents = replayOptions.maxEvents ?? 1000;\n let afterEventId: string | undefined;\n let hasMore = true;\n\n // Paginate through replay results\n while (hasMore && totalReplayed < maxEvents) {\n const params: ReplayRequestParams = {\n limit: Math.min(100, maxEvents - totalReplayed),\n };\n\n // Use eventId for pagination, or timestamp for first request\n if (afterEventId) {\n params.afterEventId = afterEventId;\n } else {\n params.fromTimestamp = lastSyncTimestamp;\n }\n\n // Filter by event types if specified\n if (replayOptions.eventTypes) {\n params.filter = { eventTypes: replayOptions.eventTypes };\n }\n\n const result = await this.#connection.sendRequest<\n ReplayRequestParams,\n ReplayResponseResult\n >(CORE_METHODS.REPLAY, params);\n\n totalReplayed += result.events.length;\n hasMore = result.hasMore;\n afterEventId = result.events.at(-1)?.eventId;\n\n // Safety: break if no events returned\n if (result.events.length === 0) {\n break;\n }\n\n // Update sync timestamp to latest replayed event\n const lastEvent = result.events.at(-1);\n if (lastEvent) {\n this.#lastSyncTimestamps.set(peerId, lastEvent.timestamp);\n }\n }\n\n this.#emitReconnectionEvent({\n type: 'replayCompleted',\n peerId,\n eventsReplayed: totalReplayed,\n });\n }\n}\n","/**\n * Zod validators for MAP protocol types\n *\n * These validators provide runtime validation for protocol messages.\n * They are generated based on the JSON schema but hand-tuned for proper Zod compatibility.\n */\n\nimport { z } from 'zod';\n\n// ===========================================================================\n// Primitives\n// ===========================================================================\n\nexport const JsonRpcVersionSchema = z.literal('2.0');\nexport const RequestIdSchema = z.union([z.string(), z.number().int()]);\nexport const ProtocolVersionSchema = z.literal(1);\nexport const TimestampSchema = z.number().int();\nexport const MetaSchema = z.record(z.unknown()).optional();\n\n// ===========================================================================\n// Identifiers\n// ===========================================================================\n\nexport const ParticipantIdSchema = z.string();\nexport const AgentIdSchema = z.string();\nexport const ScopeIdSchema = z.string();\nexport const SessionIdSchema = z.string();\nexport const MessageIdSchema = z.string();\nexport const SubscriptionIdSchema = z.string();\nexport const CorrelationIdSchema = z.string();\n\n// ===========================================================================\n// Enums\n// ===========================================================================\n\nexport const ParticipantTypeSchema = z.enum(['agent', 'client', 'system', 'gateway']);\nexport const TransportTypeSchema = z.enum(['websocket', 'stdio', 'inprocess', 'http-sse']);\nexport const ErrorCategorySchema = z.enum([\n 'protocol',\n 'auth',\n 'routing',\n 'agent',\n 'resource',\n 'federation',\n 'internal',\n]);\n\nexport const AgentVisibilitySchema = z.enum(['public', 'parent-only', 'scope', 'system']);\n\n// Agent state: standard states + custom x-* states\nexport const AgentStateSchema = z.union([\n z.enum(['registered', 'idle', 'busy', 'waiting', 'stopping', 'stopped', 'error']),\n z.string().regex(/^x-/),\n]);\n\nexport const MessagePrioritySchema = z.enum(['low', 'normal', 'high', 'urgent']);\nexport const DeliverySemanticsSchema = z.enum(['at-most-once', 'at-least-once', 'exactly-once']);\nexport const MessageRelationshipSchema = z.enum([\n 'peer',\n 'parent-to-child',\n 'child-to-parent',\n 'supervisor-to-supervised',\n 'broadcast',\n]);\n\nexport const EventTypeSchema = z.enum([\n 'agent.registered',\n 'agent.unregistered',\n 'agent.state-changed',\n 'agent.spawned',\n 'scope.created',\n 'scope.deleted',\n 'scope.joined',\n 'scope.left',\n 'message.sent',\n 'message.delivered',\n 'session.started',\n 'session.ended',\n 'system.error',\n 'system.shutdown',\n]);\n\nexport const ScopeJoinPolicySchema = z.enum(['open', 'approval', 'invite']);\nexport const ScopeVisibilitySchema = z.enum(['public', 'private', 'unlisted']);\nexport const MessageVisibilitySchema = z.enum(['members', 'public']);\nexport const ScopeSendPolicySchema = z.enum(['anyone', 'members']);\n\n// ===========================================================================\n// Capabilities\n// ===========================================================================\n\nexport const ParticipantCapabilitiesSchema = z\n .object({\n observation: z\n .object({\n canObserve: z.boolean().optional(),\n canQuery: z.boolean().optional(),\n })\n .strict()\n .optional(),\n messaging: z\n .object({\n canSend: z.boolean().optional(),\n canReceive: z.boolean().optional(),\n canBroadcast: z.boolean().optional(),\n })\n .strict()\n .optional(),\n lifecycle: z\n .object({\n canSpawn: z.boolean().optional(),\n canRegister: z.boolean().optional(),\n canUnregister: z.boolean().optional(),\n canSteer: z.boolean().optional(),\n canStop: z.boolean().optional(),\n })\n .strict()\n .optional(),\n scopes: z\n .object({\n canCreateScopes: z.boolean().optional(),\n canManageScopes: z.boolean().optional(),\n })\n .strict()\n .optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Addresses\n// ===========================================================================\n\nexport const DirectAddressSchema = z.object({ agent: AgentIdSchema }).strict();\nexport const MultiAddressSchema = z.object({ agents: z.array(AgentIdSchema).min(1) }).strict();\nexport const ScopeAddressSchema = z.object({ scope: ScopeIdSchema }).strict();\nexport const RoleAddressSchema = z\n .object({\n role: z.string(),\n scope: ScopeIdSchema.optional(),\n })\n .strict();\nexport const HierarchicalAddressSchema = z\n .object({\n parent: z.literal(true).optional(),\n children: z.literal(true).optional(),\n siblings: z.literal(true).optional(),\n ancestors: z.literal(true).optional(),\n descendants: z.literal(true).optional(),\n })\n .strict();\nexport const BroadcastAddressSchema = z.object({ broadcast: z.literal(true) }).strict();\nexport const SystemAddressSchema = z.object({ system: z.literal(true) }).strict();\nexport const ParticipantAddressSchema = z\n .object({ participant: ParticipantIdSchema })\n .strict();\nexport const FederatedAddressSchema = z\n .object({\n system: z.string(),\n address: z.lazy(() => AddressSchema),\n })\n .strict();\n\nexport const AddressSchema: z.ZodType<unknown> = z.union([\n DirectAddressSchema,\n MultiAddressSchema,\n ScopeAddressSchema,\n RoleAddressSchema,\n HierarchicalAddressSchema,\n BroadcastAddressSchema,\n SystemAddressSchema,\n ParticipantAddressSchema,\n FederatedAddressSchema,\n]);\n\n// ===========================================================================\n// Core Structures\n// ===========================================================================\n\nexport const AgentRelationshipSchema = z\n .object({\n type: z.enum(['peer', 'supervisor', 'supervised', 'collaborator']),\n agentId: AgentIdSchema,\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentLifecycleSchema = z\n .object({\n createdAt: TimestampSchema.optional(),\n startedAt: TimestampSchema.optional(),\n stoppedAt: TimestampSchema.optional(),\n lastActiveAt: TimestampSchema.optional(),\n exitCode: z.number().int().optional(),\n exitReason: z.string().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const AgentSchema = z\n .object({\n id: AgentIdSchema,\n name: z.string().optional(),\n description: z.string().optional(),\n parent: AgentIdSchema.optional(),\n relationships: z.array(AgentRelationshipSchema).optional(),\n state: AgentStateSchema,\n role: z.string().optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n visibility: AgentVisibilitySchema.optional(),\n lifecycle: AgentLifecycleSchema.optional(),\n capabilities: ParticipantCapabilitiesSchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const ScopeSchema = z\n .object({\n id: ScopeIdSchema,\n name: z.string().optional(),\n parent: ScopeIdSchema.optional(),\n children: z.array(ScopeIdSchema).optional(),\n joinPolicy: ScopeJoinPolicySchema.optional(),\n visibility: ScopeVisibilitySchema.optional(),\n messageVisibility: MessageVisibilitySchema.optional(),\n sendPolicy: ScopeSendPolicySchema.optional(),\n metadata: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageMetaSchema = z\n .object({\n correlationId: CorrelationIdSchema.optional(),\n causationId: MessageIdSchema.optional(),\n traceId: z.string().optional(),\n spanId: z.string().optional(),\n priority: MessagePrioritySchema.optional(),\n delivery: DeliverySemanticsSchema.optional(),\n relationship: MessageRelationshipSchema.optional(),\n expiresAt: TimestampSchema.optional(),\n isResult: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const MessageSchema = z\n .object({\n id: MessageIdSchema,\n from: ParticipantIdSchema,\n to: AddressSchema,\n timestamp: TimestampSchema,\n payload: z.unknown().optional(),\n meta: MessageMetaSchema.optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const EventSchema = z\n .object({\n type: EventTypeSchema,\n timestamp: TimestampSchema,\n data: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .strict();\n\nexport const SubscriptionFilterSchema = z\n .object({\n eventTypes: z.array(EventTypeSchema).optional(),\n scopes: z.array(ScopeIdSchema).optional(),\n agents: z.array(AgentIdSchema).optional(),\n includeChildren: z.boolean().optional(),\n _meta: MetaSchema,\n })\n .strict();\n\n// ===========================================================================\n// Error\n// ===========================================================================\n\nexport const MAPErrorDataSchema = z\n .object({\n category: ErrorCategorySchema.optional(),\n retryable: z.boolean().optional(),\n retryAfterMs: z.number().int().optional(),\n details: z.record(z.unknown()).optional(),\n _meta: MetaSchema,\n })\n .passthrough();\n\nexport const MAPErrorSchema = z\n .object({\n code: z.number().int(),\n message: z.string(),\n data: MAPErrorDataSchema.optional(),\n })\n .strict();\n\n// ===========================================================================\n// JSON-RPC Messages\n// ===========================================================================\n\nexport const MAPRequestSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const MAPResponseSuccessSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n result: z.unknown(),\n })\n .strict();\n\nexport const MAPResponseErrorSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n id: RequestIdSchema,\n error: MAPErrorSchema,\n })\n .strict();\n\nexport const MAPResponseSchema = z.union([MAPResponseSuccessSchema, MAPResponseErrorSchema]);\n\nexport const MAPNotificationSchema = z\n .object({\n jsonrpc: JsonRpcVersionSchema,\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n })\n .strict();\n\n// ===========================================================================\n// Inferred Types (for convenience)\n// ===========================================================================\n\nexport type ParticipantIdValidated = z.infer<typeof ParticipantIdSchema>;\nexport type AgentIdValidated = z.infer<typeof AgentIdSchema>;\nexport type ScopeIdValidated = z.infer<typeof ScopeIdSchema>;\nexport type SessionIdValidated = z.infer<typeof SessionIdSchema>;\nexport type MessageIdValidated = z.infer<typeof MessageIdSchema>;\nexport type ParticipantTypeValidated = z.infer<typeof ParticipantTypeSchema>;\nexport type AgentStateValidated = z.infer<typeof AgentStateSchema>;\nexport type AgentValidated = z.infer<typeof AgentSchema>;\nexport type ScopeValidated = z.infer<typeof ScopeSchema>;\nexport type MessageValidated = z.infer<typeof MessageSchema>;\nexport type EventValidated = z.infer<typeof EventSchema>;\nexport type AddressValidated = z.infer<typeof AddressSchema>;\nexport type MAPRequestValidated = z.infer<typeof MAPRequestSchema>;\nexport type MAPResponseValidated = z.infer<typeof MAPResponseSchema>;\nexport type MAPNotificationValidated = z.infer<typeof MAPNotificationSchema>;\nexport type MAPErrorValidated = z.infer<typeof MAPErrorSchema>;\nexport type ParticipantCapabilitiesValidated = z.infer<typeof ParticipantCapabilitiesSchema>;\nexport type SubscriptionFilterValidated = z.infer<typeof SubscriptionFilterSchema>;\n","/**\n * Protocol utilities for MAP SDK\n *\n * Provides:\n * - METHOD_REGISTRY: Single source of truth for all methods with metadata\n * - Response builders: Type-safe response construction\n * - Helper functions for method capability checking\n */\n\nimport type {\n Agent,\n Scope,\n ParticipantCapabilities,\n ConnectResponseResult,\n DisconnectResponseResult,\n SendResponseResult,\n AgentsRegisterResponseResult,\n AgentsUnregisterResponseResult,\n AgentsListResponseResult,\n AgentsGetResponseResult,\n AgentsUpdateResponseResult,\n AgentsSpawnResponseResult,\n ScopesCreateResponseResult,\n ScopesListResponseResult,\n ScopesJoinResponseResult,\n ScopesLeaveResponseResult,\n SubscribeResponseResult,\n UnsubscribeResponseResult,\n SessionInfo,\n SubscriptionId,\n MessageId,\n ParticipantId,\n ProtocolVersion,\n SessionId,\n} from '../types';\n\n// =============================================================================\n// Method Registry\n// =============================================================================\n\n/** Method category for organization */\nexport type MethodCategory =\n | 'core'\n | 'observation'\n | 'lifecycle'\n | 'state'\n | 'steering'\n | 'scope'\n | 'session'\n | 'auth'\n | 'federation'\n | 'notification';\n\n/** Capability path like 'observation.canQuery' */\nexport type CapabilityPath = string;\n\n/** Method metadata */\nexport interface MethodInfo {\n /** The wire method name */\n method: string;\n /** Category for organization */\n category: MethodCategory;\n /** Required capabilities (empty = no special capabilities needed) */\n capabilities: CapabilityPath[];\n /** Human-readable description */\n description: string;\n}\n\n/**\n * Method Registry - Single source of truth for all MAP methods\n *\n * Use this instead of individual method constants for:\n * - Capability checking\n * - Method validation\n * - Documentation generation\n */\nexport const METHOD_REGISTRY: Record<string, MethodInfo> = {\n // Core methods\n 'connect': {\n method: 'map/connect',\n category: 'core',\n capabilities: [],\n description: 'Establish connection to MAP system',\n },\n 'disconnect': {\n method: 'map/disconnect',\n category: 'core',\n capabilities: [],\n description: 'Disconnect from MAP system',\n },\n 'send': {\n method: 'map/send',\n category: 'core',\n capabilities: ['messaging.canSend'],\n description: 'Send a message to an address',\n },\n 'subscribe': {\n method: 'map/subscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Subscribe to event stream',\n },\n 'unsubscribe': {\n method: 'map/unsubscribe',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Unsubscribe from event stream',\n },\n 'replay': {\n method: 'map/replay',\n category: 'core',\n capabilities: ['observation.canObserve'],\n description: 'Replay historical events with filtering and pagination',\n },\n\n // Observation methods\n 'agents/list': {\n method: 'map/agents/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List agents with optional filters',\n },\n 'agents/get': {\n method: 'map/agents/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent by ID with optional hierarchy',\n },\n 'scopes/list': {\n method: 'map/scopes/list',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List all scopes',\n },\n 'scopes/get': {\n method: 'map/scopes/get',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get scope by ID',\n },\n 'scopes/members': {\n method: 'map/scopes/members',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'List scope members',\n },\n 'structure/graph': {\n method: 'map/structure/graph',\n category: 'observation',\n capabilities: ['observation.canQuery'],\n description: 'Get agent hierarchy graph',\n },\n\n // Lifecycle methods\n 'agents/register': {\n method: 'map/agents/register',\n category: 'lifecycle',\n capabilities: ['lifecycle.canRegister'],\n description: 'Register a new agent',\n },\n 'agents/unregister': {\n method: 'map/agents/unregister',\n category: 'lifecycle',\n capabilities: ['lifecycle.canUnregister'],\n description: 'Unregister an agent',\n },\n 'agents/spawn': {\n method: 'map/agents/spawn',\n category: 'lifecycle',\n capabilities: ['lifecycle.canSpawn'],\n description: 'Spawn a child agent',\n },\n\n // State methods\n 'agents/update': {\n method: 'map/agents/update',\n category: 'state',\n capabilities: ['lifecycle.canRegister'],\n description: 'Update agent state or metadata',\n },\n 'agents/suspend': {\n method: 'map/agents/suspend',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Suspend an agent',\n },\n 'agents/resume': {\n method: 'map/agents/resume',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Resume a suspended agent',\n },\n 'agents/stop': {\n method: 'map/agents/stop',\n category: 'state',\n capabilities: ['lifecycle.canStop'],\n description: 'Stop an agent',\n },\n\n // Steering methods\n 'inject': {\n method: 'map/inject',\n category: 'steering',\n capabilities: ['lifecycle.canSteer'],\n description: 'Inject context into an agent',\n },\n\n // Scope methods\n 'scopes/create': {\n method: 'map/scopes/create',\n category: 'scope',\n capabilities: ['scopes.canCreateScopes'],\n description: 'Create a new scope',\n },\n 'scopes/delete': {\n method: 'map/scopes/delete',\n category: 'scope',\n capabilities: ['scopes.canManageScopes'],\n description: 'Delete a scope',\n },\n 'scopes/join': {\n method: 'map/scopes/join',\n category: 'scope',\n capabilities: [],\n description: 'Join a scope',\n },\n 'scopes/leave': {\n method: 'map/scopes/leave',\n category: 'scope',\n capabilities: [],\n description: 'Leave a scope',\n },\n\n // Session methods\n 'session/list': {\n method: 'map/session/list',\n category: 'session',\n capabilities: [],\n description: 'List sessions',\n },\n 'session/load': {\n method: 'map/session/load',\n category: 'session',\n capabilities: [],\n description: 'Load a session',\n },\n 'session/close': {\n method: 'map/session/close',\n category: 'session',\n capabilities: [],\n description: 'Close a session',\n },\n\n // Auth methods\n 'auth/refresh': {\n method: 'map/auth/refresh',\n category: 'auth',\n capabilities: [],\n description: 'Refresh authentication token',\n },\n\n // Federation methods\n 'federation/connect': {\n method: 'map/federation/connect',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Connect to federated system',\n },\n 'federation/route': {\n method: 'map/federation/route',\n category: 'federation',\n capabilities: ['federation.canFederate'],\n description: 'Route message to federated system',\n },\n\n // Notification methods (client → server)\n 'subscription/ack': {\n method: 'map/subscribe.ack',\n category: 'notification',\n capabilities: [],\n description: 'Acknowledge received events for backpressure flow control',\n },\n} as const;\n\n/**\n * Get methods by category\n */\nexport function getMethodsByCategory(category: MethodCategory): MethodInfo[] {\n return Object.values(METHOD_REGISTRY).filter((m) => m.category === category);\n}\n\n/**\n * Get required capabilities for a method\n */\nexport function getRequiredCapabilities(methodName: string): CapabilityPath[] {\n // Try direct lookup first\n const info = METHOD_REGISTRY[methodName];\n if (info) return info.capabilities;\n\n // Try finding by wire method name\n const byWire = Object.values(METHOD_REGISTRY).find((m) => m.method === methodName);\n return byWire?.capabilities ?? [];\n}\n\n/**\n * Check if capabilities satisfy method requirements\n */\nexport function hasRequiredCapabilities(\n methodName: string,\n capabilities: ParticipantCapabilities\n): boolean {\n const required = getRequiredCapabilities(methodName);\n if (required.length === 0) return true;\n\n for (const path of required) {\n const [category, capability] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n if (!categoryCapabilities?.[capability]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Get method info by wire method name (e.g., 'map/agents/list')\n */\nexport function getMethodInfo(wireMethod: string): MethodInfo | undefined {\n return Object.values(METHOD_REGISTRY).find((m) => m.method === wireMethod);\n}\n\n// =============================================================================\n// Response Builders\n// =============================================================================\n\n/**\n * Build connect response\n */\nexport function buildConnectResponse(params: {\n protocolVersion: ProtocolVersion;\n sessionId: SessionId;\n participantId: ParticipantId;\n capabilities: ParticipantCapabilities;\n systemInfo?: { name?: string; version?: string };\n reconnected?: boolean;\n reclaimedAgents?: Agent[];\n ownedAgents?: string[];\n}): ConnectResponseResult {\n return {\n protocolVersion: params.protocolVersion,\n sessionId: params.sessionId,\n participantId: params.participantId,\n capabilities: params.capabilities,\n systemInfo: params.systemInfo,\n reconnected: params.reconnected,\n reclaimedAgents: params.reclaimedAgents,\n ownedAgents: params.ownedAgents,\n };\n}\n\n/**\n * Build disconnect response\n */\nexport function buildDisconnectResponse(session: SessionInfo): DisconnectResponseResult {\n return { session };\n}\n\n/**\n * Build send response\n */\nexport function buildSendResponse(\n messageId: MessageId,\n delivered: ParticipantId[]\n): SendResponseResult {\n return { messageId, delivered };\n}\n\n/**\n * Build agents/register response\n */\nexport function buildAgentsRegisterResponse(agent: Agent): AgentsRegisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/unregister response\n */\nexport function buildAgentsUnregisterResponse(agent: Agent): AgentsUnregisterResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/list response\n */\nexport function buildAgentsListResponse(agents: Agent[]): AgentsListResponseResult {\n return { agents };\n}\n\n/**\n * Build agents/get response\n */\nexport function buildAgentsGetResponse(\n agent: Agent,\n children?: Agent[],\n descendants?: Agent[]\n): AgentsGetResponseResult {\n const result: AgentsGetResponseResult = { agent };\n if (children) result.children = children;\n if (descendants) result.descendants = descendants;\n return result;\n}\n\n/**\n * Build agents/update response\n */\nexport function buildAgentsUpdateResponse(agent: Agent): AgentsUpdateResponseResult {\n return { agent };\n}\n\n/**\n * Build agents/spawn response\n */\nexport function buildAgentsSpawnResponse(agent: Agent): AgentsSpawnResponseResult {\n return { agent };\n}\n\n/**\n * Build scopes/create response\n */\nexport function buildScopesCreateResponse(scope: Scope): ScopesCreateResponseResult {\n return { scope };\n}\n\n/**\n * Build scopes/list response\n */\nexport function buildScopesListResponse(scopes: Scope[]): ScopesListResponseResult {\n return { scopes };\n}\n\n/**\n * Build scopes/join response\n */\nexport function buildScopesJoinResponse(scope: Scope, agent: Agent): ScopesJoinResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build scopes/leave response\n */\nexport function buildScopesLeaveResponse(scope: Scope, agent: Agent): ScopesLeaveResponseResult {\n return { scope, agent };\n}\n\n/**\n * Build subscribe response\n */\nexport function buildSubscribeResponse(subscriptionId: SubscriptionId): SubscribeResponseResult {\n return { subscriptionId };\n}\n\n/**\n * Build unsubscribe response\n */\nexport function buildUnsubscribeResponse(\n subscriptionId: SubscriptionId,\n closedAt: number = Date.now()\n): UnsubscribeResponseResult {\n return {\n subscription: {\n id: subscriptionId,\n closedAt,\n },\n };\n}\n","/**\n * Permission utilities for MAP SDK\n *\n * Provides building blocks for implementing the 4-layer permission model:\n * - Layer 1: System configuration (what's exposed at all)\n * - Layer 2: Client permissions (what can this client do)\n * - Layer 3: Scope permissions (what's allowed in this scope)\n * - Layer 4: Agent permissions (what can this agent do)\n *\n * These utilities are opt-in building blocks for router implementations.\n * They provide the logic for permission checks but don't enforce them.\n */\n\nimport type {\n Agent,\n AgentId,\n AgentPermissions,\n AgentPermissionConfig,\n AgentVisibilityRule,\n AgentVisibility,\n AgentAcceptanceRule,\n ClientAcceptanceRule,\n SystemAcceptanceRule,\n Scope,\n ScopeId,\n Event,\n EventType,\n ParticipantCapabilities,\n ParticipantId,\n ParticipantType,\n} from '../types';\nimport { getRequiredCapabilities, hasRequiredCapabilities } from '../protocol';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * System-level exposure configuration.\n * Controls what entities are visible to participants at all.\n */\nexport interface SystemExposure {\n agents?: {\n /** Whether agents are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for agents that are always public */\n publicAgents?: string[];\n /** Glob patterns for agents that are always hidden (takes precedence) */\n hiddenAgents?: string[];\n };\n events?: {\n /** Event types that are exposed (whitelist, if provided) */\n exposedTypes?: EventType[];\n /** Event types that are always hidden (blacklist) */\n hiddenTypes?: EventType[];\n };\n scopes?: {\n /** Whether scopes are public by default (default: true) */\n publicByDefault?: boolean;\n /** Glob patterns for scopes that are always public */\n publicScopes?: string[];\n /** Glob patterns for scopes that are always hidden (takes precedence) */\n hiddenScopes?: string[];\n };\n}\n\n/**\n * Full system configuration for permissions\n */\nexport interface PermissionSystemConfig {\n /** What entities are exposed to participants */\n exposure?: SystemExposure;\n /** Resource limits */\n limits?: {\n maxConnections?: number;\n maxConnectionsPerClient?: number;\n maxSubscriptionsPerConnection?: number;\n maxAgentsPerClient?: number;\n };\n}\n\n/**\n * Represents a connected participant for permission checks\n */\nexport interface PermissionParticipant {\n /** Participant ID */\n id: string;\n /** Participant type */\n type: ParticipantType;\n /** Granted capabilities */\n capabilities: ParticipantCapabilities;\n}\n\n/**\n * Context for permission checks\n */\nexport interface PermissionContext {\n /** System-wide configuration */\n system: PermissionSystemConfig;\n /** The participant performing the action */\n participant: PermissionParticipant;\n /** Agent IDs owned by this participant */\n ownedAgentIds?: AgentId[];\n /** Scope membership: scopeId -> agent IDs that are members */\n scopeMembership?: Map<ScopeId, AgentId[]>;\n}\n\n/**\n * Action being performed for permission checking\n */\nexport interface PermissionAction {\n /** Action category */\n type: 'query' | 'message' | 'lifecycle' | 'scope' | 'subscribe';\n /** Wire method name (e.g., 'map/agents/list') */\n method: string;\n /** Target of the action */\n target?: {\n agentId?: AgentId;\n scopeId?: ScopeId;\n eventTypes?: EventType[];\n };\n}\n\n/**\n * Result of a permission check\n */\nexport interface PermissionResult {\n /** Whether the action is allowed */\n allowed: boolean;\n /** Reason for denial (if denied) */\n reason?: string;\n /** Which layer denied the action (if denied) */\n layer?: 1 | 2 | 3 | 4;\n}\n\n// =============================================================================\n// Layer 1: System Exposure Checks\n// =============================================================================\n\n/**\n * Check if an agent is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n * If no configuration, agents are exposed by default.\n *\n * @param exposure - System exposure configuration\n * @param agentId - Agent ID to check\n * @returns true if the agent is exposed\n */\nexport function isAgentExposed(\n exposure: SystemExposure | undefined,\n agentId: AgentId\n): boolean {\n if (!exposure?.agents) return true; // Default: exposed\n\n const {\n publicByDefault = true,\n publicAgents = [],\n hiddenAgents = [],\n } = exposure.agents;\n\n // Hidden takes precedence\n if (matchesPatterns(agentId, hiddenAgents)) return false;\n\n // Check public list\n if (matchesPatterns(agentId, publicAgents)) return true;\n\n return publicByDefault;\n}\n\n/**\n * Check if an event type is exposed by system configuration.\n *\n * Hidden types take precedence. If a whitelist is provided,\n * only those types are exposed.\n *\n * @param exposure - System exposure configuration\n * @param eventType - Event type to check\n * @returns true if the event type is exposed\n */\nexport function isEventTypeExposed(\n exposure: SystemExposure | undefined,\n eventType: EventType\n): boolean {\n if (!exposure?.events) return true;\n\n const { exposedTypes, hiddenTypes = [] } = exposure.events;\n\n // Hidden takes precedence\n if (hiddenTypes.includes(eventType)) return false;\n\n // If whitelist exists, must be in it\n if (exposedTypes && !exposedTypes.includes(eventType)) return false;\n\n return true;\n}\n\n/**\n * Check if a scope is exposed by system configuration.\n *\n * Hidden patterns take precedence over public patterns.\n *\n * @param exposure - System exposure configuration\n * @param scopeId - Scope ID to check\n * @returns true if the scope is exposed\n */\nexport function isScopeExposed(\n exposure: SystemExposure | undefined,\n scopeId: ScopeId\n): boolean {\n if (!exposure?.scopes) return true;\n\n const {\n publicByDefault = true,\n publicScopes = [],\n hiddenScopes = [],\n } = exposure.scopes;\n\n // Hidden takes precedence\n if (matchesPatterns(scopeId, hiddenScopes)) return false;\n\n // Check public list\n if (matchesPatterns(scopeId, publicScopes)) return true;\n\n return publicByDefault;\n}\n\n// =============================================================================\n// Layer 2: Client/Participant Capability Checks\n// =============================================================================\n\n/**\n * Check if a participant has a specific capability.\n *\n * @param capabilities - Participant's capabilities\n * @param path - Capability path like 'observation.canQuery'\n * @returns true if the capability is granted\n *\n * @example\n * ```typescript\n * if (hasCapability(participant.capabilities, 'lifecycle.canSpawn')) {\n * // Can spawn agents\n * }\n * ```\n */\nexport function hasCapability(\n capabilities: ParticipantCapabilities,\n path: string\n): boolean {\n const [category, cap] = path.split('.') as [keyof ParticipantCapabilities, string];\n const categoryCapabilities = capabilities[category] as Record<string, boolean> | undefined;\n return categoryCapabilities?.[cap] ?? false;\n}\n\n/**\n * Check if a participant can perform a method based on capabilities.\n *\n * @param method - Wire method name (e.g., 'map/agents/list')\n * @param capabilities - Participant's capabilities\n * @returns true if all required capabilities are present\n */\nexport function canPerformMethod(\n method: string,\n capabilities: ParticipantCapabilities\n): boolean {\n return hasRequiredCapabilities(method, capabilities);\n}\n\n/**\n * Get the capabilities required for a method.\n *\n * @param method - Wire method name or registry key\n * @returns Array of capability paths\n */\nexport { getRequiredCapabilities };\n\n// =============================================================================\n// Layer 3: Scope Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can see the scope\n */\nexport function canSeeScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n const visibility = scope.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to a scope.\n *\n * @param scope - The scope to check\n * @param participant - The participant\n * @param memberAgentIds - Agent IDs owned by participant that are scope members\n * @returns true if the participant can send to the scope\n */\nexport function canSendToScope(\n scope: Scope,\n participant: PermissionParticipant,\n memberAgentIds: AgentId[] = []\n): boolean {\n // System can always send\n if (participant.type === 'system') return true;\n\n const sendPolicy = scope.sendPolicy ?? 'members';\n\n switch (sendPolicy) {\n case 'any':\n return true;\n case 'members':\n return memberAgentIds.length > 0;\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can join a scope.\n *\n * @param scope - The scope to check\n * @param participantType - Type of the participant\n * @param agentRole - Role of the agent trying to join (for role-based policies)\n * @returns true if the participant can join the scope\n */\nexport function canJoinScope(\n scope: Scope,\n participantType: ParticipantType,\n agentRole?: string\n): boolean {\n const joinPolicy = scope.joinPolicy ?? 'open';\n\n switch (joinPolicy) {\n case 'open':\n return true;\n case 'invite':\n // Would need invitation tracking - simplified to false\n return false;\n case 'role':\n // Check if agent role matches auto-join roles\n if (!agentRole || !scope.autoJoinRoles) return false;\n return scope.autoJoinRoles.includes(agentRole);\n case 'system':\n return participantType === 'system';\n default:\n return false;\n }\n}\n\n// =============================================================================\n// Layer 4: Agent Permission Checks\n// =============================================================================\n\n/**\n * Check if a participant can see an agent.\n *\n * @param agent - The agent to check\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can see the agent\n */\nexport function canSeeAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n const visibility = agent.visibility ?? 'public';\n\n switch (visibility) {\n case 'public':\n return true;\n case 'parent-only':\n // Can see if we own the parent or the agent itself\n if (ownedAgentIds.includes(agent.id)) return true;\n return agent.parent ? ownedAgentIds.includes(agent.parent) : false;\n case 'scope':\n // Would need scope membership check - simplified to true\n // In practice, would check if participant has agent in same scope\n return true;\n case 'system':\n return participant.type === 'system';\n default:\n return false;\n }\n}\n\n/**\n * Check if a participant can send messages to an agent.\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can message the agent\n */\nexport function canMessageAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // Must be able to see the agent first\n if (!canSeeAgent(agent, participant, ownedAgentIds)) {\n return false;\n }\n\n // Additional messaging restrictions could be added here\n // For now, if you can see it, you can message it\n return true;\n}\n\n/**\n * Check if a participant can control an agent (stop, suspend, etc.).\n *\n * @param agent - Target agent\n * @param participant - The participant\n * @param ownedAgentIds - Agent IDs owned by this participant\n * @returns true if the participant can control the agent\n */\nexport function canControlAgent(\n agent: Agent,\n participant: PermissionParticipant,\n ownedAgentIds: AgentId[] = []\n): boolean {\n // System can control any agent\n if (participant.type === 'system') return true;\n\n // Must own the agent or its ancestor\n if (ownedAgentIds.includes(agent.id)) return true;\n\n // Check if we own an ancestor (parent chain)\n // This would need the full agent registry in practice\n // Simplified: just check direct parent\n if (agent.parent && ownedAgentIds.includes(agent.parent)) return true;\n\n return false;\n}\n\n// =============================================================================\n// High-Level Resolution\n// =============================================================================\n\n/**\n * Check if an action is permitted across all 4 layers.\n *\n * This is the main entry point for comprehensive permission checking.\n * It evaluates each layer in order and returns the first denial or success.\n *\n * @param context - Permission context with system config and participant info\n * @param action - The action to check\n * @returns Permission result with allowed status, reason, and layer\n *\n * @example\n * ```typescript\n * const result = canPerformAction(\n * {\n * system: { exposure: { agents: { hiddenAgents: ['internal-*'] } } },\n * participant: { id: 'client-1', type: 'client', capabilities },\n * ownedAgentIds: ['agent-1'],\n * },\n * {\n * type: 'query',\n * method: 'map/agents/get',\n * target: { agentId: 'internal-worker' },\n * }\n * );\n *\n * if (!result.allowed) {\n * console.log(`Denied at layer ${result.layer}: ${result.reason}`);\n * }\n * ```\n */\nexport function canPerformAction(\n context: PermissionContext,\n action: PermissionAction\n): PermissionResult {\n // Layer 1: System exposure\n if (action.target?.agentId) {\n if (!isAgentExposed(context.system.exposure, action.target.agentId)) {\n return {\n allowed: false,\n reason: 'Agent not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.scopeId) {\n if (!isScopeExposed(context.system.exposure, action.target.scopeId)) {\n return {\n allowed: false,\n reason: 'Scope not exposed by system configuration',\n layer: 1,\n };\n }\n }\n if (action.target?.eventTypes) {\n for (const eventType of action.target.eventTypes) {\n if (!isEventTypeExposed(context.system.exposure, eventType)) {\n return {\n allowed: false,\n reason: `Event type '${eventType}' not exposed by system configuration`,\n layer: 1,\n };\n }\n }\n }\n\n // Layer 2: Participant capabilities\n const requiredCaps = getRequiredCapabilities(action.method);\n for (const cap of requiredCaps) {\n if (!hasCapability(context.participant.capabilities, cap)) {\n return {\n allowed: false,\n reason: `Missing required capability: ${cap}`,\n layer: 2,\n };\n }\n }\n\n // Layer 3 and 4 would require actual entity lookups\n // These are handled by the filtering utilities below\n\n return { allowed: true };\n}\n\n// =============================================================================\n// Filtering Utilities\n// =============================================================================\n\n/**\n * Filter agents to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 4 (agent visibility).\n *\n * @param agents - Agents to filter\n * @param context - Permission context\n * @returns Filtered list of visible agents\n */\nexport function filterVisibleAgents(\n agents: Agent[],\n context: PermissionContext\n): Agent[] {\n const ownedAgentIds = context.ownedAgentIds ?? [];\n\n return agents.filter((agent) => {\n // Layer 1: System exposure\n if (!isAgentExposed(context.system.exposure, agent.id)) {\n return false;\n }\n\n // Layer 4: Agent visibility\n if (!canSeeAgent(agent, context.participant, ownedAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter scopes to only those visible to the participant.\n *\n * Applies both Layer 1 (system exposure) and Layer 3 (scope visibility).\n *\n * @param scopes - Scopes to filter\n * @param context - Permission context\n * @returns Filtered list of visible scopes\n */\nexport function filterVisibleScopes(\n scopes: Scope[],\n context: PermissionContext\n): Scope[] {\n const scopeMembership = context.scopeMembership ?? new Map();\n\n return scopes.filter((scope) => {\n // Layer 1: System exposure\n if (!isScopeExposed(context.system.exposure, scope.id)) {\n return false;\n }\n\n // Layer 3: Scope visibility\n const memberAgentIds = scopeMembership.get(scope.id) ?? [];\n if (!canSeeScope(scope, context.participant, memberAgentIds)) {\n return false;\n }\n\n return true;\n });\n}\n\n/**\n * Filter events to only those visible to the participant.\n *\n * Applies Layer 1 (system exposure) for event types.\n *\n * @param events - Events to filter\n * @param context - Permission context\n * @returns Filtered list of visible events\n */\nexport function filterVisibleEvents(\n events: Event[],\n context: PermissionContext\n): Event[] {\n return events.filter((event) => {\n // Layer 1: Event type exposure\n if (!isEventTypeExposed(context.system.exposure, event.type)) {\n return false;\n }\n\n // Additional filtering based on event source could be added here\n // e.g., filter out events from hidden agents\n\n return true;\n });\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Check if a value matches any of the glob patterns.\n *\n * @param value - Value to check\n * @param patterns - Glob patterns (supports * and ? wildcards)\n * @returns true if value matches any pattern\n */\nfunction matchesPatterns(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => matchGlob(value, pattern));\n}\n\n/**\n * Simple glob matching supporting * and ? wildcards.\n *\n * @param value - Value to match\n * @param pattern - Glob pattern\n * @returns true if value matches pattern\n */\nfunction matchGlob(value: string, pattern: string): boolean {\n // Escape special regex characters except * and ?\n const escaped = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(value);\n}\n\n// =============================================================================\n// Agent Permission Resolution (Hybrid Model)\n// =============================================================================\n\n/**\n * Deep clone an object (simple implementation for permission objects)\n */\nfunction deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Deep merge two permission objects.\n * Second object's fields override first at the leaf level.\n *\n * @param base - Base permissions\n * @param override - Override permissions (partial)\n * @returns Merged permissions\n */\nexport function deepMergePermissions(\n base: AgentPermissions,\n override: Partial<AgentPermissions>\n): AgentPermissions {\n const result: AgentPermissions = { ...base };\n\n if (override.canSee) {\n result.canSee = { ...base.canSee, ...override.canSee };\n }\n if (override.canMessage) {\n result.canMessage = { ...base.canMessage, ...override.canMessage };\n }\n if (override.acceptsFrom) {\n result.acceptsFrom = { ...base.acceptsFrom, ...override.acceptsFrom };\n }\n\n return result;\n}\n\n/**\n * Map legacy AgentVisibility to AgentVisibilityRule.\n *\n * @param visibility - Legacy visibility value\n * @returns Equivalent visibility rule\n */\nexport function mapVisibilityToRule(visibility: AgentVisibility): AgentVisibilityRule {\n switch (visibility) {\n case 'public':\n return 'all';\n case 'parent-only':\n return 'hierarchy';\n case 'scope':\n return 'scoped';\n case 'system':\n return 'direct';\n default:\n return 'all';\n }\n}\n\n/**\n * Default agent permission configuration.\n * Used when no configuration is provided.\n */\nexport const DEFAULT_AGENT_PERMISSION_CONFIG: AgentPermissionConfig = {\n defaultPermissions: {\n canSee: {\n agents: 'all',\n scopes: 'all',\n structure: 'full',\n },\n canMessage: {\n agents: 'all',\n scopes: 'all',\n },\n acceptsFrom: {\n agents: 'all',\n clients: 'all',\n systems: 'all',\n },\n },\n rolePermissions: {},\n};\n\n/**\n * Resolve effective permissions for an agent.\n *\n * Resolution order:\n * 1. Start with system default permissions\n * 2. If agent has a role, deep merge role permissions\n * 3. Deep merge agent's permissionOverrides\n * 4. (Backwards compat) Map legacy visibility field if no override\n *\n * @param agent - The agent to resolve permissions for\n * @param config - System permission configuration\n * @returns Resolved effective permissions\n *\n * @example\n * ```typescript\n * const config: AgentPermissionConfig = {\n * defaultPermissions: { canSee: { agents: 'all' } },\n * rolePermissions: {\n * worker: { canSee: { agents: 'hierarchy' } },\n * },\n * };\n *\n * const agent = { id: 'a1', role: 'worker', ownerId: 'c1', state: 'active' };\n * const perms = resolveAgentPermissions(agent, config);\n * // perms.canSee.agents === 'hierarchy'\n * ```\n */\nexport function resolveAgentPermissions(\n agent: Agent,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): AgentPermissions {\n // Start with defaults\n let permissions = deepClone(config.defaultPermissions);\n\n // Apply role permissions\n if (agent.role && config.rolePermissions[agent.role]) {\n permissions = deepMergePermissions(permissions, config.rolePermissions[agent.role]);\n }\n\n // Apply agent overrides\n if (agent.permissionOverrides) {\n permissions = deepMergePermissions(permissions, agent.permissionOverrides);\n }\n\n // Backwards compatibility: map legacy visibility\n if (agent.visibility && !agent.permissionOverrides?.canSee?.agents) {\n permissions.canSee = permissions.canSee ?? {};\n permissions.canSee.agents = mapVisibilityToRule(agent.visibility);\n }\n\n return permissions;\n}\n\n// =============================================================================\n// Agent Acceptance Checks\n// =============================================================================\n\n/**\n * Context for checking if an agent accepts messages from a sender.\n */\nexport interface AcceptanceContext {\n /** Type of the sender */\n senderType: ParticipantType;\n /** Participant ID of the sender */\n senderId: ParticipantId;\n /** If sender is an agent, its agent ID */\n senderAgentId?: AgentId;\n /** If sender is from a federated system, its system ID */\n senderSystemId?: string;\n\n // Hierarchy info for 'hierarchy' rules\n /** Whether sender is the parent of target */\n isParent?: boolean;\n /** Whether sender is a child of target */\n isChild?: boolean;\n /** Whether sender is an ancestor of target */\n isAncestor?: boolean;\n /** Whether sender is a descendant of target */\n isDescendant?: boolean;\n\n // Scope info for 'scoped' rules\n /** Scope IDs that both sender and target are members of */\n sharedScopes?: ScopeId[];\n}\n\n/**\n * Check if an agent acceptance rule allows the sender.\n */\nfunction checkAgentAcceptance(\n rule: AgentAcceptanceRule | undefined,\n context: AcceptanceContext\n): boolean {\n if (!rule || rule === 'all') return true;\n\n if (rule === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (rule === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof rule === 'object' && 'include' in rule) {\n return context.senderAgentId !== undefined && rule.include.includes(context.senderAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if a client acceptance rule allows the sender.\n */\nfunction checkClientAcceptance(\n rule: ClientAcceptanceRule | undefined,\n senderId: ParticipantId\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return rule.include.includes(senderId);\n }\n\n return false;\n}\n\n/**\n * Check if a system acceptance rule allows the sender.\n */\nfunction checkSystemAcceptance(\n rule: SystemAcceptanceRule | undefined,\n senderSystemId: string | undefined\n): boolean {\n if (!rule || rule === 'all') return true;\n if (rule === 'none') return false;\n\n if (typeof rule === 'object' && 'include' in rule) {\n return senderSystemId !== undefined && rule.include.includes(senderSystemId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent accepts messages from the given sender.\n *\n * Uses the agent's resolved permissions to determine if the sender\n * is allowed based on sender type and acceptance rules.\n *\n * @param targetAgent - The agent that would receive the message\n * @param context - Information about the sender\n * @param config - System permission configuration\n * @returns true if the agent accepts messages from this sender\n *\n * @example\n * ```typescript\n * const accepts = canAgentAcceptMessage(\n * targetAgent,\n * {\n * senderType: 'agent',\n * senderId: 'client-1',\n * senderAgentId: 'agent-2',\n * isParent: true,\n * },\n * config\n * );\n * ```\n */\nexport function canAgentAcceptMessage(\n targetAgent: Agent,\n context: AcceptanceContext,\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(targetAgent, config);\n const acceptsFrom = permissions.acceptsFrom;\n\n // No restrictions = accept all\n if (!acceptsFrom) return true;\n\n // Check based on sender type\n switch (context.senderType) {\n case 'agent':\n return checkAgentAcceptance(acceptsFrom.agents, context);\n case 'client':\n return checkClientAcceptance(acceptsFrom.clients, context.senderId);\n case 'system':\n case 'gateway':\n return checkSystemAcceptance(acceptsFrom.systems, context.senderSystemId);\n default:\n return false;\n }\n}\n\n/**\n * Check if an agent can see another agent based on permissions.\n *\n * @param viewerAgent - The agent trying to see\n * @param targetAgentId - ID of the agent being viewed\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if viewer can see target\n */\nexport function canAgentSeeAgent(\n viewerAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(viewerAgent, config);\n const canSee = permissions.canSee?.agents;\n\n if (!canSee || canSee === 'all') return true;\n\n if (canSee === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canSee === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (canSee === 'direct') {\n // Direct means explicit allowlist only\n return false;\n }\n\n if (typeof canSee === 'object' && 'include' in canSee) {\n return canSee.include.includes(targetAgentId);\n }\n\n return false;\n}\n\n/**\n * Check if an agent can message another agent based on permissions.\n *\n * @param senderAgent - The agent sending the message\n * @param targetAgentId - ID of the target agent\n * @param context - Hierarchy and scope context\n * @param config - System permission configuration\n * @returns true if sender can message target\n */\nexport function canAgentMessageAgent(\n senderAgent: Agent,\n targetAgentId: AgentId,\n context: {\n isParent?: boolean;\n isChild?: boolean;\n isAncestor?: boolean;\n isDescendant?: boolean;\n sharedScopes?: ScopeId[];\n },\n config: AgentPermissionConfig = DEFAULT_AGENT_PERMISSION_CONFIG\n): boolean {\n const permissions = resolveAgentPermissions(senderAgent, config);\n const canMessage = permissions.canMessage?.agents;\n\n if (!canMessage || canMessage === 'all') return true;\n\n if (canMessage === 'hierarchy') {\n return (\n context.isParent === true ||\n context.isChild === true ||\n context.isAncestor === true ||\n context.isDescendant === true\n );\n }\n\n if (canMessage === 'scoped') {\n return (context.sharedScopes?.length ?? 0) > 0;\n }\n\n if (typeof canMessage === 'object' && 'include' in canMessage) {\n return canMessage.include.includes(targetAgentId);\n }\n\n return false;\n}\n","/**\n * Address utilities for recipient disambiguation\n *\n * Provides utilities for parsing and formatting message addresses\n * with type prefixes to distinguish between agent and scope recipients.\n *\n * Format: \"{type}:{id}\"\n * - agent:abc123 -> agent recipient\n * - scope:room-1 -> scope recipient\n */\n\n/** Valid address types */\nexport type AddressType = \"agent\" | \"scope\";\n\n/** Parsed address components */\nexport interface AddressComponents {\n type: AddressType;\n id: string;\n}\n\n/** The separator used in address format */\nconst SEPARATOR = \":\";\n\n/** Valid address types for validation */\nconst VALID_ADDRESS_TYPES: readonly AddressType[] = [\"agent\", \"scope\"];\n\n/**\n * Error thrown when an address format is invalid.\n */\nexport class InvalidAddressError extends Error {\n constructor(address: string, reason: string) {\n super(`Invalid address \"${address}\": ${reason}`);\n this.name = \"InvalidAddressError\";\n }\n}\n\n/**\n * Format an address with type prefix.\n *\n * @param type - The address type (agent or scope)\n * @param id - The entity ID\n * @returns Formatted address string\n * @throws InvalidAddressError if parameters are invalid\n *\n * @example\n * formatAddress(\"agent\", \"abc123\") // \"agent:abc123\"\n * formatAddress(\"scope\", \"room-1\") // \"scope:room-1\"\n */\nexport function formatAddress(type: AddressType, id: string): string {\n if (!id) {\n throw new InvalidAddressError(\"\", \"ID cannot be empty\");\n }\n\n if (id.includes(SEPARATOR)) {\n throw new InvalidAddressError(id, \"ID cannot contain colon separator\");\n }\n\n return `${type}${SEPARATOR}${id}`;\n}\n\n/**\n * Parse an address string into its components.\n *\n * @param address - The address string to parse\n * @returns Parsed address components\n * @throws InvalidAddressError if format is invalid\n *\n * @example\n * parseAddress(\"agent:abc123\") // { type: \"agent\", id: \"abc123\" }\n * parseAddress(\"scope:room-1\") // { type: \"scope\", id: \"room-1\" }\n */\nexport function parseAddress(address: string): AddressComponents {\n const separatorIndex = address.indexOf(SEPARATOR);\n\n if (separatorIndex === -1) {\n throw new InvalidAddressError(address, \"missing type prefix\");\n }\n\n const type = address.slice(0, separatorIndex);\n const id = address.slice(separatorIndex + 1);\n\n if (!VALID_ADDRESS_TYPES.includes(type as AddressType)) {\n throw new InvalidAddressError(address, `invalid type \"${type}\", must be agent or scope`);\n }\n\n if (!id) {\n throw new InvalidAddressError(address, \"ID cannot be empty\");\n }\n\n // Check for extra colons (could be a federated ID embedded)\n // Allow federated IDs in the id portion: agent:system-a:agent:abc123\n // This means the id would be \"system-a:agent:abc123\" which is fine\n\n return {\n type: type as AddressType,\n id,\n };\n}\n\n/**\n * Check if a string is a valid prefixed address.\n *\n * @param address - The string to check\n * @returns true if valid prefixed address format\n *\n * @example\n * isAddress(\"agent:abc123\") // true\n * isAddress(\"scope:room-1\") // true\n * isAddress(\"abc123\") // false (no prefix)\n * isAddress(\"invalid:abc\") // false (invalid type)\n */\nexport function isAddress(address: string): boolean {\n try {\n parseAddress(address);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for an agent.\n *\n * @param address - The address string to check\n * @returns true if address is for an agent\n */\nexport function isAgentAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"agent\";\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for a scope.\n *\n * @param address - The address string to check\n * @returns true if address is for a scope\n */\nexport function isScopeAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"scope\";\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the ID from an address, or return the original if not prefixed.\n *\n * Useful for backward compatibility when handling both prefixed and unprefixed addresses.\n *\n * @param address - The address string\n * @returns The extracted ID or the original string\n */\nexport function extractId(address: string): string {\n try {\n const parsed = parseAddress(address);\n return parsed.id;\n } catch {\n return address;\n }\n}\n\n/**\n * Extract the type from an address, or return undefined if not prefixed.\n *\n * @param address - The address string\n * @returns The address type or undefined\n */\nexport function extractType(address: string): AddressType | undefined {\n try {\n const parsed = parseAddress(address);\n return parsed.type;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Convenience function to create an agent address.\n *\n * @param agentId - The agent ID\n * @returns Formatted agent address\n */\nexport function toAgent(agentId: string): string {\n return formatAddress(\"agent\", agentId);\n}\n\n/**\n * Convenience function to create a scope address.\n *\n * @param scopeId - The scope ID\n * @returns Formatted scope address\n */\nexport function toScope(scopeId: string): string {\n return formatAddress(\"scope\", scopeId);\n}\n"]}