{"version":3,"sources":["../src/types.ts","../src/agent.ts","../src/with-anycast.ts","../src/with-anycast-openai.ts","../src/plugins/slack.ts"],"names":["ConnectionState","createHash","SDK_VERSION","post"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Agent SDK types — mirrors the rendezvous server protocol.\n */\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface AnycastAgentOptions {\n  /** WebSocket URL of the rendezvous server (e.g., wss://agents.anycast.com/rendezvous) */\n  rendezvousUrl: string;\n  /** Agent auth token from the Anycast portal */\n  token: string;\n  /** Human-readable agent name (e.g., 'anycast-observer') */\n  name?: string;\n  /** Unique machine identifier (auto-generated if not provided) */\n  machineId?: string;\n  /** Public key for end-to-end encryption */\n  publicKey?: string;\n  /** Agent version string */\n  version?: string;\n  /** Auto-reconnect on disconnect (default: true) */\n  reconnect?: boolean;\n  /** Reconnect interval in ms (default: 3000) */\n  reconnectInterval?: number;\n  /** Connection timeout in ms (default: 30000) */\n  timeout?: number;\n  /** Heartbeat interval in ms (default: 25000) */\n  heartbeatInterval?: number;\n  /** Portal base URL for preflight (default: https://agents.anycast.com) */\n  portalUrl?: string;\n  /** Internal API key for usage tracking (POST /api/internal/agents/usage) */\n  internalKey?: string;\n  /** Auto-save context on disconnect, auto-restore on connect (default: false) */\n  persistContext?: boolean;\n  /** Discovery mode: 'rendezvous' (default), 'auto' (DHT with fallback), 'dht' (DHT only) */\n  discoveryMode?: 'rendezvous' | 'dht' | 'auto';\n  /** Enable WireGuard tunnel support (default: false) */\n  wireguard?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Connection state\n// ---------------------------------------------------------------------------\n\nexport enum ConnectionState {\n  DISCONNECTED = 'DISCONNECTED',\n  CONNECTING = 'CONNECTING',\n  CONNECTED = 'CONNECTED',\n  RECONNECTING = 'RECONNECTING',\n}\n\n// ---------------------------------------------------------------------------\n// Client → Server messages\n// ---------------------------------------------------------------------------\n\nexport interface RegisterMessage {\n  type: 'register';\n  token: string;\n  machineId: string;\n  publicKey: string;\n  name?: string;\n  version?: string;\n  os?: string;\n  arch?: string;\n}\n\nexport interface HeartbeatMessage {\n  type: 'heartbeat';\n}\n\nexport interface ConnectRequestMessage {\n  type: 'connect_request';\n  targetAgentId: string;\n  sessionId: string;\n}\n\nexport interface SignalMessage {\n  type: 'signal';\n  sessionId: string;\n  targetAgentId: string;\n  signal: {\n    type: 'offer' | 'answer' | 'ice';\n    data: string;\n  };\n}\n\nexport interface DisconnectMessage {\n  type: 'disconnect';\n  sessionId: string;\n}\n\nexport interface MessageResponseMessage {\n  type: 'message_response';\n  messageId: string;\n  text: string;\n  error?: string;\n}\n\nexport type ClientMessage =\n  | RegisterMessage\n  | HeartbeatMessage\n  | ConnectRequestMessage\n  | SignalMessage\n  | DisconnectMessage\n  | MessageResponseMessage;\n\n// ---------------------------------------------------------------------------\n// Server → Client messages\n// ---------------------------------------------------------------------------\n\nexport interface RegisteredMessage {\n  type: 'registered';\n  agentId: string;\n  tenantId: string;\n  name: string;\n  popIata?: string;\n}\n\nexport interface HeartbeatAckMessage {\n  type: 'heartbeat_ack';\n  timestamp: number;\n}\n\nexport interface ConnectIncomingMessage {\n  type: 'connect_incoming';\n  sessionId: string;\n  fromAgentId: string;\n  fromAgentName: string;\n}\n\nexport interface ConnectAcceptedMessage {\n  type: 'connect_accepted';\n  sessionId: string;\n  agentId: string;\n  agentName: string;\n  publicKey: string;\n}\n\nexport interface ConnectRejectedMessage {\n  type: 'connect_rejected';\n  sessionId: string;\n  reason: string;\n}\n\nexport interface SignalForwardMessage {\n  type: 'signal_forward';\n  sessionId: string;\n  fromAgentId: string;\n  signal: {\n    type: 'offer' | 'answer' | 'ice';\n    data: string;\n  };\n}\n\nexport interface RelayAssignedMessage {\n  type: 'relay_assigned';\n  sessionId: string;\n  relayHost: string;\n  relayPort: number;\n  relayToken: string;\n}\n\nexport interface AgentStatusMessage {\n  type: 'agent_status';\n  agentId: string;\n  status: 'online' | 'offline';\n}\n\nexport interface ErrorMessage {\n  type: 'error';\n  code: string;\n  message: string;\n  fatal?: boolean;\n}\n\nexport interface PortalMessageMessage {\n  type: 'portal_message';\n  messageId: string;\n  text: string;\n  context?: Record<string, unknown>;\n  timeoutMs?: number;\n}\n\nexport interface InterruptMessage {\n  type: 'interrupt';\n  reason: string;\n}\n\nexport type ServerMessage =\n  | RegisteredMessage\n  | HeartbeatAckMessage\n  | ConnectIncomingMessage\n  | ConnectAcceptedMessage\n  | ConnectRejectedMessage\n  | SignalForwardMessage\n  | RelayAssignedMessage\n  | AgentStatusMessage\n  | ErrorMessage\n  | PortalMessageMessage\n  | InterruptMessage;\n\n// ---------------------------------------------------------------------------\n// Event map for typed event emitter\n// ---------------------------------------------------------------------------\n\nexport interface AnycastAgentEvents {\n  connect: (info: { agentId: string; tenantId: string; name: string; popIata?: string }) => void;\n  disconnect: (reason: string) => void;\n  reconnecting: (attempt: number) => void;\n  'context_restored': (context: Record<string, unknown> | null) => void;\n  message: (payload: {\n    messageId: string;\n    text: string;\n    context?: Record<string, unknown>;\n    reply: (text: string) => void;\n  }) => void;\n  peer: (agentId: string, status: 'online' | 'offline') => void;\n  'connect_incoming': (sessionId: string, fromAgentId: string, fromAgentName: string) => void;\n  'connect_accepted': (sessionId: string, agentId: string, publicKey: string) => void;\n  'connect_rejected': (sessionId: string, reason: string) => void;\n  signal: (sessionId: string, fromAgentId: string, signal: { type: string; data: string }) => void;\n  'relay_assigned': (sessionId: string, relayHost: string, relayPort: number, relayToken: string) => void;\n  error: (error: AnycastError) => void;\n  stateChange: (state: ConnectionState) => void;\n  interrupted: (data: { reason: string }) => void;\n  discovery: (info: { mode: 'rendezvous' | 'dht' | 'auto'; fallback: boolean }) => void;\n  tunnel: (info: { tunnelId: string; localIP: string; peerIP: string; peerAgentId: string }) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Error\n// ---------------------------------------------------------------------------\n\nexport class AnycastError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public fatal: boolean = false\n  ) {\n    super(message);\n    this.name = 'AnycastError';\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Plugin system\n// ---------------------------------------------------------------------------\n\nexport interface AnycastPluginContext {\n  agentId?: string;\n  agentName?: string;\n  agentToken: string;\n  sessionId?: string;\n  attributes: Record<string, string | number | boolean>;\n  emit: (eventName: string, data?: Record<string, unknown>) => Promise<void>;\n}\n\nexport interface AnycastPlugin {\n  name: string;\n  onSessionStart?: (ctx: AnycastPluginContext) => void | Promise<void>;\n  onToolUse?: (ctx: AnycastPluginContext, toolName: string, input?: unknown) => void | Promise<void>;\n  onResult?: (ctx: AnycastPluginContext, usage: {\n    promptTokens: number;\n    completionTokens: number;\n    cacheReadTokens: number;\n    cacheCreationTokens: number;\n    costUsd: number;\n    numTurns: number;\n    durationMs: number;\n  }) => void | Promise<void>;\n  onSessionEnd?: (ctx: AnycastPluginContext) => void | Promise<void>;\n}\n","import WebSocket from 'ws';\nimport EventEmitter from 'eventemitter3';\nimport { randomBytes, createHash } from 'crypto';\nimport { execSync } from 'child_process';\nimport {\n  type AnycastAgentOptions,\n  type AnycastAgentEvents,\n  type ServerMessage,\n  type ClientMessage,\n  ConnectionState,\n  AnycastError,\n} from './types.js';\n\nconst DEFAULT_OPTIONS = {\n  reconnect: true,\n  reconnectInterval: 3000,\n  timeout: 30000,\n  heartbeatInterval: 25000,\n};\n\n/** Shared memory client interface */\nexport interface AgentMemoryClient {\n  get(key: string, options?: { scope?: 'agent' | 'tenant' }): Promise<unknown | null>;\n  set(key: string, value: unknown, options?: { scope?: 'agent' | 'tenant'; ttl?: number }): Promise<void>;\n  delete(key: string, options?: { scope?: 'agent' | 'tenant' }): Promise<void>;\n  list(prefix?: string, options?: { scope?: 'agent' | 'tenant'; limit?: number }): Promise<Array<{ key: string; updatedAt: string }>>;\n}\n\nclass AgentMemoryClientImpl implements AgentMemoryClient {\n  constructor(private agent: AnycastAgent) {}\n\n  private get portalUrl(): string {\n    return (this.agent as unknown as { opts: { portalUrl?: string; token: string } }).opts.portalUrl || 'https://agents.anycast.com';\n  }\n\n  private get token(): string {\n    return (this.agent as unknown as { opts: { token: string } }).opts.token;\n  }\n\n  private headers(): Record<string, string> {\n    return {\n      'Content-Type': 'application/json',\n      'x-agent-token': this.token,\n      ...(this.agent.agentId ? { 'x-agent-id': this.agent.agentId } : {}),\n    };\n  }\n\n  async get(key: string, options?: { scope?: 'agent' | 'tenant' }): Promise<unknown | null> {\n    try {\n      const res = await fetch(`${this.portalUrl}/api/agents/memory`, {\n        method: 'POST',\n        headers: this.headers(),\n        body: JSON.stringify({ operation: 'get', key, scope: options?.scope || 'tenant' }),\n      });\n      if (!res.ok) return null;\n      const data = await res.json() as { value: unknown };\n      return data.value ?? null;\n    } catch {\n      return null;\n    }\n  }\n\n  async set(key: string, value: unknown, options?: { scope?: 'agent' | 'tenant'; ttl?: number }): Promise<void> {\n    try {\n      await fetch(`${this.portalUrl}/api/agents/memory`, {\n        method: 'POST',\n        headers: this.headers(),\n        body: JSON.stringify({ operation: 'set', key, value, scope: options?.scope || 'tenant', ttl: options?.ttl }),\n      });\n    } catch {\n      // Non-blocking\n    }\n  }\n\n  async delete(key: string, options?: { scope?: 'agent' | 'tenant' }): Promise<void> {\n    try {\n      await fetch(`${this.portalUrl}/api/agents/memory`, {\n        method: 'POST',\n        headers: this.headers(),\n        body: JSON.stringify({ operation: 'delete', key, scope: options?.scope || 'tenant' }),\n      });\n    } catch {\n      // Non-blocking\n    }\n  }\n\n  async list(prefix?: string, options?: { scope?: 'agent' | 'tenant'; limit?: number }): Promise<Array<{ key: string; updatedAt: string }>> {\n    try {\n      const params = new URLSearchParams();\n      if (prefix) params.set('prefix', prefix);\n      if (options?.scope) params.set('scope', options.scope);\n      if (options?.limit) params.set('limit', String(options.limit));\n      const res = await fetch(`${this.portalUrl}/api/agents/memory?${params}`, {\n        headers: this.headers(),\n      });\n      if (!res.ok) return [];\n      const data = await res.json() as { keys: Array<{ key: string; updatedAt: string }> };\n      return data.keys || [];\n    } catch {\n      return [];\n    }\n  }\n}\n\n/** Session context client interface */\nexport interface AgentContextClient {\n  save(data: Record<string, unknown>): Promise<void>;\n  restore(): Promise<Record<string, unknown> | null>;\n  clear(): Promise<void>;\n}\n\nclass AgentContextClientImpl implements AgentContextClient {\n  constructor(private agent: AnycastAgent) {}\n\n  private get portalUrl(): string {\n    return (this.agent as unknown as { opts: { portalUrl?: string } }).opts.portalUrl || 'https://agents.anycast.com';\n  }\n\n  private get token(): string {\n    return (this.agent as unknown as { opts: { token: string } }).opts.token;\n  }\n\n  private headers(): Record<string, string> {\n    return {\n      'Content-Type': 'application/json',\n      'x-agent-token': this.token,\n      ...(this.agent.agentId ? { 'x-agent-id': this.agent.agentId } : {}),\n    };\n  }\n\n  async save(data: Record<string, unknown>): Promise<void> {\n    try {\n      await fetch(`${this.portalUrl}/api/agents/context`, {\n        method: 'POST',\n        headers: this.headers(),\n        body: JSON.stringify({ context: data }),\n      });\n    } catch { /* Non-blocking */ }\n  }\n\n  async restore(): Promise<Record<string, unknown> | null> {\n    try {\n      const res = await fetch(`${this.portalUrl}/api/agents/context`, { headers: this.headers() });\n      if (!res.ok) return null;\n      const data = await res.json() as { context: Record<string, unknown> | null };\n      return data.context ?? null;\n    } catch {\n      return null;\n    }\n  }\n\n  async clear(): Promise<void> {\n    try {\n      await fetch(`${this.portalUrl}/api/agents/context`, { method: 'DELETE', headers: this.headers() });\n    } catch { /* Non-blocking */ }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// WireGuard tunnel helpers\n// ---------------------------------------------------------------------------\n\n/** Derive deterministic tunnel IPs from agent/peer ID pair */\nfunction deriveTunnelIPs(agentId: string, peerId: string): { local: string; peer: string } {\n  const aHash = parseInt(createHash('md5').update(agentId).digest('hex').slice(0, 8), 16);\n  const pHash = parseInt(createHash('md5').update(peerId).digest('hex').slice(0, 8), 16);\n  return {\n    local: `10.100.${(aHash % 254) + 1}.${(pHash % 254) + 1}`,\n    peer: `10.100.${(pHash % 254) + 1}.${(aHash % 254) + 1}`,\n  };\n}\n\n/** Check if wg CLI tool is available on the system */\nfunction isWgAvailable(): boolean {\n  try {\n    execSync('which wg', { stdio: 'pipe' });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * AnycastAgent — connects to the Anycast Agents rendezvous server\n * for P2P connectivity, signaling, and relay fallback.\n *\n * @example\n * ```typescript\n * const agent = new AnycastAgent({\n *   rendezvousUrl: 'wss://agents.anycast.com/rendezvous',\n *   token: 'agt_...',\n * });\n *\n * agent.on('connect', ({ agentId }) => {\n *   console.log(`Connected as ${agentId}`);\n * });\n *\n * agent.on('peer', (peerId, status) => {\n *   console.log(`Peer ${peerId} is ${status}`);\n * });\n *\n * await agent.connect();\n * ```\n */\nexport class AnycastAgent extends EventEmitter<AnycastAgentEvents> {\n  private ws: WebSocket | null = null;\n  private state: ConnectionState = ConnectionState.DISCONNECTED;\n  private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n  private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n  private reconnectAttempt = 0;\n  private intentionalClose = false;\n\n  /** Agent ID assigned by the server after registration */\n  public agentId: string | null = null;\n  /** Tenant ID from the server */\n  public tenantId: string | null = null;\n  /** Agent name from the server */\n  public agentName: string | null = null;\n  /** PoP IATA code the agent is connected through */\n  public popIata: string | null = null;\n  /** WAN IP (NAT gateway / public IP as seen by portal) */\n  public wanIp: string | null = null;\n  /** Internal IP (agent's own network interface) */\n  public internalIp: string | null = null;\n\n  /** Shared memory client for persistent key-value storage */\n  public readonly memory: AgentMemoryClient;\n\n  /** Session context client for save/restore across restarts */\n  public readonly context: AgentContextClient;\n\n  private _contextData: Record<string, unknown> | null = null;\n  private _persistContext = false;\n\n  /** WireGuard Curve25519 keypair for tunnel negotiation */\n  private wgKeyPair: { publicKey: string; secretKey: string } | null = null;\n\n  private readonly opts: Required<\n    Pick<AnycastAgentOptions, 'rendezvousUrl' | 'token' | 'machineId' | 'publicKey' | 'reconnect' | 'reconnectInterval' | 'timeout' | 'heartbeatInterval'>\n  > & Pick<AnycastAgentOptions, 'name' | 'version' | 'portalUrl' | 'internalKey' | 'discoveryMode'>;\n\n  constructor(options: AnycastAgentOptions) {\n    super();\n\n    this.opts = {\n      rendezvousUrl: options.rendezvousUrl,\n      token: options.token,\n      name: options.name,\n      machineId: options.machineId || randomBytes(16).toString('hex'),\n      publicKey: options.publicKey || randomBytes(32).toString('base64'),\n      version: options.version,\n      portalUrl: options.portalUrl,\n      internalKey: options.internalKey,\n      discoveryMode: options.discoveryMode,\n      reconnect: options.reconnect ?? DEFAULT_OPTIONS.reconnect,\n      reconnectInterval: options.reconnectInterval ?? DEFAULT_OPTIONS.reconnectInterval,\n      timeout: options.timeout ?? DEFAULT_OPTIONS.timeout,\n      heartbeatInterval: options.heartbeatInterval ?? DEFAULT_OPTIONS.heartbeatInterval,\n    };\n\n    this.memory = new AgentMemoryClientImpl(this);\n    this.context = new AgentContextClientImpl(this);\n    this._persistContext = options.persistContext ?? false;\n\n    // Generate WireGuard Curve25519 keypair if enabled\n    if (options.wireguard) {\n      // eslint-disable-next-line @typescript-eslint/no-require-imports\n      const nacl = require('tweetnacl') as typeof import('tweetnacl');\n      const keyPair = nacl.box.keyPair();\n      this.wgKeyPair = {\n        publicKey: Buffer.from(keyPair.publicKey).toString('base64'),\n        secretKey: Buffer.from(keyPair.secretKey).toString('base64'),\n      };\n    }\n  }\n\n  /**\n   * Set in-memory context data that will be auto-saved on disconnect\n   * (only effective when persistContext: true).\n   */\n  setContext(data: Record<string, unknown>): void {\n    this._contextData = data;\n  }\n\n  /**\n   * Get the WireGuard public key for this agent (null if WireGuard is disabled).\n   */\n  getWireguardPublicKey(): string | null {\n    return this.wgKeyPair?.publicKey || null;\n  }\n\n  /**\n   * Request a WireGuard tunnel to a target agent.\n   * Creates a tunnel record via the portal API and returns tunnel metadata.\n   * The actual WireGuard interface is brought up when the peer accepts (tunnel_accepted).\n   */\n  async requestTunnel(targetAgentId: string): Promise<{\n    tunnelId: string;\n    localIP: string;\n    peerIP: string;\n    active: boolean;\n    close: () => Promise<void>;\n  }> {\n    if (!this.wgKeyPair) {\n      throw new AnycastError('WireGuard not enabled. Set wireguard: true in agent options.', 'WG_NOT_ENABLED', false);\n    }\n    if (!isWgAvailable()) {\n      throw new AnycastError('WireGuard tools not installed. Install: apt install wireguard-tools', 'WG_NOT_INSTALLED', false);\n    }\n\n    const portalUrl = this.opts.portalUrl || 'https://agents.anycast.com';\n    const res = await fetch(`${portalUrl}/api/agents/tunnels`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'x-agent-token': this.opts.token },\n      body: JSON.stringify({\n        initiatorId: this.agentId,\n        responderId: targetAgentId,\n        initiatorPubKey: this.wgKeyPair.publicKey,\n      }),\n    });\n\n    if (!res.ok) {\n      const err = await res.text();\n      throw new AnycastError(`Failed to create tunnel: ${err}`, 'TUNNEL_CREATE_FAILED', false);\n    }\n\n    const data = (await res.json()) as { tunnel: { id: string } };\n    const tunnelId = data.tunnel?.id;\n    const ips = deriveTunnelIPs(this.agentId || '', targetAgentId);\n    const ifName = `wg-ac-${(tunnelId || '').slice(0, 8)}`;\n\n    // Note: actual WireGuard interface setup requires the peer's response\n    // (public key + endpoint). This is completed when tunnel_accepted arrives\n    // via the rendezvous WebSocket. For now, return the tunnel info.\n\n    const close = async () => {\n      try { execSync(`ip link del ${ifName}`, { stdio: 'pipe' }); } catch { /* interface may not exist */ }\n      await fetch(`${portalUrl}/api/agents/tunnels/${tunnelId}`, {\n        method: 'PATCH',\n        headers: { 'Content-Type': 'application/json', 'x-agent-token': this.opts.token },\n        body: JSON.stringify({ status: 'closed' }),\n      }).catch(() => {});\n    };\n\n    this.emit('tunnel', { tunnelId, localIP: ips.local, peerIP: ips.peer, peerAgentId: targetAgentId });\n\n    return {\n      tunnelId,\n      localIP: ips.local,\n      peerIP: ips.peer,\n      active: false, // becomes true after peer accepts\n      close,\n    };\n  }\n\n  /** Current connection state */\n  get connectionState(): ConnectionState {\n    return this.state;\n  }\n\n  /** Whether the agent is connected */\n  get connected(): boolean {\n    return this.state === ConnectionState.CONNECTED;\n  }\n\n  /**\n   * Connect to the rendezvous server.\n   * Resolves when registered, rejects on timeout or fatal error.\n   */\n  async connect(): Promise<void> {\n    if (this.state === ConnectionState.CONNECTED || this.state === ConnectionState.CONNECTING) {\n      return;\n    }\n\n    this.intentionalClose = false;\n    this.setState(ConnectionState.CONNECTING);\n\n    // Discovery mode resolution\n    const mode = this.opts.discoveryMode || 'rendezvous';\n    let effectiveMode: 'rendezvous' | 'dht' | 'auto' = mode;\n\n    if (mode === 'dht' || mode === 'auto') {\n      let holepunchAvailable = false;\n      try {\n        require('hyperswarm');\n        holepunchAvailable = true;\n      } catch {\n        // hyperswarm not installed\n      }\n\n      if (mode === 'dht' && !holepunchAvailable) {\n        throw new Error('DHT discovery requires hyperswarm: npm install hyperswarm');\n      }\n      if (mode === 'auto' && !holepunchAvailable) {\n        effectiveMode = 'rendezvous';\n      }\n    }\n\n    this.emit('discovery', { mode: effectiveMode, fallback: effectiveMode !== mode });\n\n    return new Promise<void>((resolve, reject) => {\n      const timeout = setTimeout(() => {\n        this.cleanup();\n        const err = new AnycastError('Connection timeout', 'TIMEOUT', false);\n        this.emit('error', err);\n        reject(err);\n      }, this.opts.timeout);\n\n      try {\n        this.ws = new WebSocket(this.opts.rendezvousUrl);\n      } catch (err) {\n        clearTimeout(timeout);\n        const error = new AnycastError(\n          `Failed to create WebSocket: ${err instanceof Error ? err.message : String(err)}`,\n          'CONNECTION_FAILED',\n          false\n        );\n        this.setState(ConnectionState.DISCONNECTED);\n        reject(error);\n        return;\n      }\n\n      this.ws.on('open', () => {\n        this.send({\n          type: 'register',\n          token: this.opts.token,\n          machineId: this.opts.machineId,\n          publicKey: this.opts.publicKey,\n          name: this.opts.name,\n          version: this.opts.version,\n          os: typeof process !== 'undefined' ? process.platform : undefined,\n          arch: typeof process !== 'undefined' ? process.arch : undefined,\n        });\n      });\n\n      this.ws.on('message', (data: WebSocket.Data) => {\n        let msg: ServerMessage;\n        try {\n          msg = JSON.parse(data.toString());\n        } catch {\n          return;\n        }\n\n        if (msg.type === 'registered') {\n          clearTimeout(timeout);\n          this.agentId = msg.agentId;\n          this.tenantId = msg.tenantId;\n          this.agentName = msg.name;\n          this.popIata = msg.popIata || null;\n          this.reconnectAttempt = 0;\n          this.setState(ConnectionState.CONNECTED);\n          this.startHeartbeat();\n          this.emit('connect', { agentId: msg.agentId, tenantId: msg.tenantId, name: msg.name, popIata: msg.popIata });\n\n          // Auto-restore context if persistContext is enabled\n          if (this._persistContext) {\n            this.context.restore().then((ctx) => {\n              this._contextData = ctx;\n              this.emit('context_restored', ctx);\n            }).catch(() => {});\n          }\n\n          resolve();\n          return;\n        }\n\n        if (msg.type === 'error' && msg.fatal) {\n          clearTimeout(timeout);\n          const err = new AnycastError(msg.message, msg.code, true);\n          this.emit('error', err);\n          this.cleanup();\n          reject(err);\n          return;\n        }\n\n        // Route other messages after registration\n        this.handleMessage(msg);\n      });\n\n      this.ws.on('close', (code, reason) => {\n        clearTimeout(timeout);\n        this.stopHeartbeat();\n        const wasConnected = this.state === ConnectionState.CONNECTED;\n        this.setState(ConnectionState.DISCONNECTED);\n\n        if (wasConnected) {\n          this.emit('disconnect', reason?.toString() || `Code ${code}`);\n        }\n\n        if (!this.intentionalClose && this.opts.reconnect) {\n          this.scheduleReconnect();\n        } else if (this.state !== ConnectionState.CONNECTED) {\n          reject(new AnycastError('Connection closed', 'CLOSED', false));\n        }\n      });\n\n      this.ws.on('error', (err) => {\n        const error = new AnycastError(err.message, 'WS_ERROR', false);\n        this.emit('error', error);\n      });\n    });\n  }\n\n  /**\n   * Disconnect from the rendezvous server.\n   */\n  async disconnect(): Promise<void> {\n    // Auto-save context before disconnecting\n    if (this._persistContext && this._contextData && this.agentId) {\n      await this.context.save(this._contextData).catch(() => {});\n    }\n    this.intentionalClose = true;\n    this.cleanup();\n    this.agentId = null;\n    this.tenantId = null;\n    this.agentName = null;\n  }\n\n  /**\n   * Request a connection to a peer agent.\n   * @returns The session ID for this connection\n   */\n  requestConnection(targetAgentId: string): string {\n    this.assertConnected();\n    const sessionId = randomBytes(16).toString('hex');\n    this.send({\n      type: 'connect_request',\n      targetAgentId,\n      sessionId,\n    });\n    return sessionId;\n  }\n\n  /**\n   * Send a WebRTC signal to a peer via the rendezvous server.\n   */\n  sendSignal(\n    sessionId: string,\n    targetAgentId: string,\n    signal: { type: 'offer' | 'answer' | 'ice'; data: string }\n  ): void {\n    this.assertConnected();\n    this.send({\n      type: 'signal',\n      sessionId,\n      targetAgentId,\n      signal,\n    });\n  }\n\n  /**\n   * Disconnect a session.\n   */\n  disconnectSession(sessionId: string): void {\n    this.assertConnected();\n    this.send({ type: 'disconnect', sessionId });\n  }\n\n  /**\n   * Reply to a portal_message received via the 'message' event.\n   * Must be called within the timeout window (default 30s).\n   */\n  replyToMessage(messageId: string, text: string): void {\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      console.warn('[AnycastAgent] Cannot reply — WebSocket not connected');\n      return;\n    }\n    this.send({ type: 'message_response', messageId, text });\n  }\n\n  /**\n   * Track LLM token usage for this agent. Reports to the portal for cost tracking.\n   */\n  async trackUsage(usage: {\n    model: string;\n    promptTokens: number;\n    completionTokens: number;\n    triggeredBy?: string;\n    triggeredByName?: string;\n    context?: string;\n  }): Promise<void> {\n    if (!this.agentId) return;\n    const portalUrl = this.opts.portalUrl || 'https://agents.anycast.com';\n    try {\n      await fetch(`${portalUrl}/api/agents/usage`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'x-agent-token': this.opts.token },\n        body: JSON.stringify({ agentId: this.agentId, ...usage }),\n      });\n    } catch {\n      // Non-blocking — don't fail if tracking fails\n    }\n  }\n\n  // ---------------------------------------------------------------------------\n  // Auto-instrumentation wrappers\n  // ---------------------------------------------------------------------------\n\n  /**\n   * Wrap an Anthropic SDK client to auto-report token usage after every call.\n   * Does NOT require @anthropic-ai/sdk as a dependency — works via Proxy.\n   */\n  wrapAnthropic<T>(client: T, options?: {\n    triggeredBy?: string;\n    triggeredByName?: string;\n    context?: string;\n  }): T {\n    const agent = this;\n    const opts = options || {};\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const c = client as any;\n\n    if (!c?.messages?.create) return client;\n\n    const originalCreate = c.messages.create.bind(c.messages);\n    c.messages.create = function (...args: unknown[]) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const params = args[0] as any;\n      const model = params?.model || 'unknown';\n      const isStream = params?.stream === true;\n      const result = originalCreate(...args);\n\n      if (isStream) {\n        // Streaming: Anthropic SDK returns an async iterable with finalMessage()\n        try {\n          if (result && typeof result.finalMessage === 'function') {\n            const origFinalMessage = result.finalMessage.bind(result);\n            result.finalMessage = async function () {\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              const msg: any = await origFinalMessage();\n              try {\n                if (msg?.usage) {\n                  agent.trackUsage({\n                    model,\n                    promptTokens: msg.usage.input_tokens || 0,\n                    completionTokens: msg.usage.output_tokens || 0,\n                    ...opts,\n                  }).catch(() => void 0);\n                }\n              } catch (e) {\n                console.warn('[AnycastAgent] Failed to extract streaming usage:', e);\n              }\n              return msg;\n            };\n          }\n        } catch (e) {\n          console.warn('[AnycastAgent] Failed to wrap Anthropic stream:', e);\n        }\n        return result;\n      }\n\n      // Non-streaming: result is a Promise\n      if (result && typeof result.then === 'function') {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return result.then((response: any) => {\n          try {\n            if (response?.usage) {\n              agent.trackUsage({\n                model,\n                promptTokens: response.usage.input_tokens || 0,\n                completionTokens: response.usage.output_tokens || 0,\n                ...opts,\n              }).catch(() => void 0);\n            }\n          } catch (e) {\n            console.warn('[AnycastAgent] Failed to extract Anthropic usage:', e);\n          }\n          return response;\n        });\n      }\n\n      return result;\n    };\n\n    return client;\n  }\n\n  /**\n   * Wrap an OpenAI SDK client to auto-report token usage after every call.\n   * Does NOT require openai as a dependency — works via Proxy.\n   */\n  wrapOpenAI<T>(client: T, options?: {\n    triggeredBy?: string;\n    triggeredByName?: string;\n    context?: string;\n  }): T {\n    const agent = this;\n    const opts = options || {};\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const c = client as any;\n\n    if (!c?.chat?.completions?.create) return client;\n\n    const originalCreate = c.chat.completions.create.bind(c.chat.completions);\n    c.chat.completions.create = function (...args: unknown[]) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const params = args[0] as any;\n      const model = params?.model || 'unknown';\n      const isStream = params?.stream === true;\n      const result = originalCreate(...args);\n\n      if (isStream) {\n        // OpenAI streaming: usage appears in the final chunk when\n        // stream_options: { include_usage: true } was passed.\n        // We wrap the async iterator to capture it.\n        try {\n          if (result && typeof result[Symbol.asyncIterator] === 'function') {\n            const origIterator = result[Symbol.asyncIterator].bind(result);\n            result[Symbol.asyncIterator] = function () {\n              const iter = origIterator();\n              return {\n                async next() {\n                  const { value, done } = await iter.next();\n                  if (done) return { value, done };\n                  try {\n                    if (value?.usage) {\n                      agent.trackUsage({\n                        model,\n                        promptTokens: value.usage.prompt_tokens || 0,\n                        completionTokens: value.usage.completion_tokens || 0,\n                        ...opts,\n                      }).catch(() => void 0);\n                    }\n                  } catch (e) {\n                    console.warn('[AnycastAgent] Failed to extract OpenAI stream usage:', e);\n                  }\n                  return { value, done };\n                },\n                return: iter.return?.bind(iter),\n                throw: iter.throw?.bind(iter),\n              };\n            };\n          }\n        } catch (e) {\n          console.warn('[AnycastAgent] Failed to wrap OpenAI stream:', e);\n        }\n        return result;\n      }\n\n      // Non-streaming\n      if (result && typeof result.then === 'function') {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return result.then((response: any) => {\n          try {\n            if (response?.usage) {\n              agent.trackUsage({\n                model,\n                promptTokens: response.usage.prompt_tokens || 0,\n                completionTokens: response.usage.completion_tokens || 0,\n                ...opts,\n              }).catch(() => void 0);\n            }\n          } catch (e) {\n            console.warn('[AnycastAgent] Failed to extract OpenAI usage:', e);\n          }\n          return response;\n        });\n      }\n\n      return result;\n    };\n\n    return client;\n  }\n\n  /**\n   * Generic wrapper for any async function — extracts usage via a callback.\n   */\n  async tracked<R>(\n    fn: () => Promise<R>,\n    options: {\n      model: string;\n      extractUsage: (result: R) => { promptTokens: number; completionTokens: number };\n      triggeredBy?: string;\n      triggeredByName?: string;\n      context?: string;\n    }\n  ): Promise<R> {\n    const result = await fn();\n    try {\n      const usage = options.extractUsage(result);\n      this.trackUsage({\n        model: options.model,\n        promptTokens: usage.promptTokens,\n        completionTokens: usage.completionTokens,\n        triggeredBy: options.triggeredBy,\n        triggeredByName: options.triggeredByName,\n        context: options.context,\n      }).catch(() => void 0);\n    } catch (e) {\n      console.warn('[AnycastAgent] extractUsage failed:', e);\n    }\n    return result;\n  }\n\n  // ---------------------------------------------------------------------------\n  // Private\n  // ---------------------------------------------------------------------------\n\n  private handleMessage(msg: ServerMessage): void {\n    switch (msg.type) {\n      case 'heartbeat_ack':\n        // No action needed\n        break;\n\n      case 'agent_status':\n        this.emit('peer', msg.agentId, msg.status);\n        break;\n\n      case 'connect_incoming':\n        this.emit('connect_incoming', msg.sessionId, msg.fromAgentId, msg.fromAgentName);\n        break;\n\n      case 'connect_accepted':\n        this.emit('connect_accepted', msg.sessionId, msg.agentId, msg.publicKey);\n        break;\n\n      case 'connect_rejected':\n        this.emit('connect_rejected', msg.sessionId, msg.reason);\n        break;\n\n      case 'signal_forward':\n        this.emit('signal', msg.sessionId, msg.fromAgentId, msg.signal);\n        break;\n\n      case 'relay_assigned':\n        this.emit('relay_assigned', msg.sessionId, msg.relayHost, msg.relayPort, msg.relayToken);\n        break;\n\n      case 'portal_message':\n        this.emit('message', {\n          messageId: msg.messageId,\n          text: msg.text,\n          context: msg.context,\n          reply: (text: string) => this.replyToMessage(msg.messageId, text),\n        });\n        break;\n\n      case 'interrupt':\n        this.emit('interrupted', { reason: msg.reason || 'Interrupted' });\n        break;\n\n      case 'error':\n        this.emit('error', new AnycastError(msg.message, msg.code, msg.fatal || false));\n        if (msg.fatal) {\n          this.cleanup();\n        }\n        break;\n    }\n  }\n\n  private send(msg: ClientMessage): void {\n    if (this.ws?.readyState === WebSocket.OPEN) {\n      this.ws.send(JSON.stringify(msg));\n    }\n  }\n\n  private startHeartbeat(): void {\n    this.stopHeartbeat();\n    this.heartbeatTimer = setInterval(() => {\n      this.send({ type: 'heartbeat' });\n    }, this.opts.heartbeatInterval);\n  }\n\n  private stopHeartbeat(): void {\n    if (this.heartbeatTimer) {\n      clearInterval(this.heartbeatTimer);\n      this.heartbeatTimer = null;\n    }\n  }\n\n  private scheduleReconnect(): void {\n    if (this.reconnectTimer) return;\n\n    this.reconnectAttempt++;\n    // Exponential backoff: base * 2^attempt, capped at 30s\n    const delay = Math.min(\n      this.opts.reconnectInterval * Math.pow(2, this.reconnectAttempt - 1),\n      30000\n    );\n\n    this.setState(ConnectionState.RECONNECTING);\n    this.emit('reconnecting', this.reconnectAttempt);\n\n    this.reconnectTimer = setTimeout(async () => {\n      this.reconnectTimer = null;\n      try {\n        await this.connect();\n      } catch {\n        // connect() will schedule another reconnect if needed\n      }\n    }, delay);\n  }\n\n  private cleanup(): void {\n    this.stopHeartbeat();\n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer);\n      this.reconnectTimer = null;\n    }\n    if (this.ws) {\n      this.ws.removeAllListeners();\n      if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n        this.ws.close(1000, 'Client disconnect');\n      }\n      this.ws = null;\n    }\n    this.setState(ConnectionState.DISCONNECTED);\n  }\n\n  private setState(state: ConnectionState): void {\n    if (this.state !== state) {\n      this.state = state;\n      this.emit('stateChange', state);\n    }\n  }\n\n  private assertConnected(): void {\n    if (this.state !== ConnectionState.CONNECTED || !this.ws) {\n      throw new AnycastError('Not connected', 'NOT_CONNECTED', false);\n    }\n  }\n}\n","/**\n * withAnycast() — transparent observability wrapper for @anthropic-ai/claude-agent-sdk sessions.\n *\n * Intercepts the session's stream() to forward usage, tool-call, and custom event data\n * to the Anycast portal without modifying any event data or blocking the stream.\n *\n * Features:\n *   - Telemetry: usage + tool calls forwarded automatically\n *   - Attributes: arbitrary KV attached to all telemetry (OTel-aligned)\n *   - emit(): custom event emission at any point\n *   - Plugins: lifecycle hooks (onSessionStart, onToolUse, onResult, onSessionEnd)\n *   - Memory: persistent KV via portal API\n *   - Session persistence: auto-save session_id for resume\n */\n\nimport { createHash } from 'crypto';\nimport type { AnycastPlugin, AnycastPluginContext } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Minimal interfaces matching the Agent SDK session shape\n// ---------------------------------------------------------------------------\n\ninterface AgentSDKContentBlock {\n  type: 'text' | 'tool_use' | string;\n  text?: string;\n  name?: string;\n  id?: string;\n  input?: unknown;\n}\n\ninterface AgentSDKEvent {\n  type: 'assistant' | 'tool_use_summary' | 'result' | string;\n  message?: { content: AgentSDKContentBlock[] };\n  summary?: string;\n  session_id?: string;\n  usage?: {\n    input_tokens?: number;\n    output_tokens?: number;\n    cache_read_input_tokens?: number;\n    cache_creation_input_tokens?: number;\n  };\n  total_cost_usd?: number;\n  num_turns?: number;\n  duration_ms?: number;\n  duration_api_ms?: number;\n}\n\ninterface AgentSDKSession {\n  stream(): AsyncIterable<AgentSDKEvent>;\n  send(prompt: string): Promise<void>;\n  close(): void;\n  sessionId?: string;\n}\n\nexport interface WithAnycastOptions {\n  agentToken: string;\n  portalUrl?: string;\n  agentName?: string;\n  debug?: boolean;\n  enableMemory?: boolean;\n  memoryScope?: 'agent' | 'tenant';\n  persistSession?: boolean;\n  agentId?: string;\n  /** Key index from resolveApiKey() — forwarded in usage reports for per-key tracking */\n  _resolvedKeyIndex?: number;\n  /** Arbitrary attributes attached to all telemetry. Use OTel semantic conventions. */\n  attributes?: Record<string, string | number | boolean>;\n  /** Lifecycle hook plugins */\n  plugins?: AnycastPlugin[];\n}\n\nconst SDK_VERSION = '0.1.19';\n\nfunction hashToken(token: string): string {\n  return createHash('sha256').update(token).digest('hex').slice(0, 16);\n}\n\n/** Fire-and-forget POST — never throws, never blocks */\nfunction post(url: string, token: string, body: Record<string, unknown>, debug: boolean): void {\n  fetch(url, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', 'x-agent-token': token },\n    body: JSON.stringify(body),\n    signal: AbortSignal.timeout(5000),\n  }).catch((err) => {\n    if (debug) console.warn('[withAnycast] POST failed:', err.message);\n  });\n}\n\n// ---------------------------------------------------------------------------\n// AnycastMemory\n// ---------------------------------------------------------------------------\n\nexport class AnycastMemory {\n  constructor(\n    private agentToken: string,\n    private portalUrl: string,\n    private scope: 'agent' | 'tenant',\n    private debug: boolean = false,\n  ) {}\n\n  async get(key: string): Promise<unknown | null> {\n    try {\n      const res = await fetch(`${this.portalUrl}/api/agents/memory`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'x-agent-token': this.agentToken },\n        body: JSON.stringify({ operation: 'get', key, scope: this.scope }),\n        signal: AbortSignal.timeout(5000),\n      });\n      if (!res.ok) return null;\n      const data = (await res.json()) as { value?: unknown };\n      return data.value ?? null;\n    } catch { return null; }\n  }\n\n  async set(key: string, value: unknown, options?: { ttl?: number }): Promise<void> {\n    try {\n      await fetch(`${this.portalUrl}/api/agents/memory`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'x-agent-token': this.agentToken },\n        body: JSON.stringify({ operation: 'set', key, value: typeof value === 'string' ? value : JSON.stringify(value), scope: this.scope, ttl: options?.ttl }),\n        signal: AbortSignal.timeout(5000),\n      });\n    } catch (err) { if (this.debug) console.warn('[withAnycast] memory.set failed:', err instanceof Error ? err.message : err); }\n  }\n\n  async list(prefix?: string): Promise<string[]> {\n    try {\n      const params = new URLSearchParams({ scope: this.scope });\n      if (prefix) params.set('prefix', prefix);\n      const res = await fetch(`${this.portalUrl}/api/agents/memory?${params}`, {\n        headers: { 'x-agent-token': this.agentToken },\n        signal: AbortSignal.timeout(5000),\n      });\n      if (!res.ok) return [];\n      const data = (await res.json()) as { keys?: Array<{ key: string }> };\n      return (data.keys || []).map((k) => k.key);\n    } catch { return []; }\n  }\n\n  async delete(key: string): Promise<void> {\n    try {\n      await fetch(`${this.portalUrl}/api/agents/memory`, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json', 'x-agent-token': this.agentToken },\n        body: JSON.stringify({ operation: 'delete', key, scope: this.scope }),\n        signal: AbortSignal.timeout(5000),\n      });\n    } catch { /* never throws */ }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// withAnycast()\n// ---------------------------------------------------------------------------\n\nexport function withAnycast<T extends AgentSDKSession>(\n  session: T,\n  options: WithAnycastOptions,\n): T & { memory: AnycastMemory; emit: (eventName: string, data?: Record<string, unknown>) => Promise<void> } {\n  const portalUrl = (options.portalUrl || 'https://agents.anycast.com').replace(/\\/$/, '');\n  const token = options.agentToken;\n  const debug = options.debug || false;\n  const persistSession = options.persistSession || false;\n  const agentId = options.agentId || hashToken(token);\n  const attrs = options.attributes || {};\n  const plugins = options.plugins || [];\n\n  const memory = new AnycastMemory(token, portalUrl, options.memoryScope || 'agent', debug);\n\n  let resolvedAgentId: string | null = null;\n  let resolvedSessionId: string | undefined;\n\n  // emit() — fire-and-forget event to portal\n  const emit = async (eventName: string, data?: Record<string, unknown>): Promise<void> => {\n    post(`${portalUrl}/api/agents/events`, token, {\n      eventName,\n      data,\n      sessionId: resolvedSessionId,\n      attributes: attrs,\n    }, debug);\n  };\n\n  // Plugin context (updated as session progresses)\n  const pluginCtx: AnycastPluginContext = {\n    agentId: undefined,\n    agentName: options.agentName,\n    agentToken: token,\n    sessionId: undefined,\n    attributes: attrs,\n    emit,\n  };\n\n  // Heartbeat — auto-creates Agent, returns agentId\n  fetch(`${portalUrl}/api/agents/sdk/heartbeat`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', 'x-agent-token': token },\n    body: JSON.stringify({\n      name: options.agentName || 'SDK Agent',\n      source: 'agent_sdk',\n      sdkVersion: SDK_VERSION,\n      os: typeof process !== 'undefined' ? process.platform : undefined,\n      arch: typeof process !== 'undefined' ? process.arch : undefined,\n      attributes: attrs,\n    }),\n    signal: AbortSignal.timeout(5000),\n  })\n    .then((res) => res.json())\n    .then((data) => {\n      const parsed = data as { agentId?: string };\n      if (parsed.agentId) {\n        resolvedAgentId = parsed.agentId;\n        pluginCtx.agentId = parsed.agentId;\n        if (debug) console.log('[withAnycast] agent registered:', resolvedAgentId);\n      }\n    })\n    .then(() => {\n      // Fire onSessionStart plugins after heartbeat completes\n      for (const plugin of plugins) {\n        Promise.resolve(plugin.onSessionStart?.(pluginCtx)).catch((err) => {\n          if (debug) console.warn(`[withAnycast] plugin ${plugin.name} onSessionStart error:`, err);\n        });\n      }\n    })\n    .catch((err) => {\n      if (debug) console.warn('[withAnycast] heartbeat failed:', err.message);\n    });\n\n  return new Proxy(session, {\n    get(target, prop, receiver) {\n      if (prop === 'memory') return memory;\n      if (prop === 'emit') return emit;\n\n      if (prop === 'stream') {\n        return function stream() {\n          const original = target.stream();\n          return {\n            [Symbol.asyncIterator]() {\n              const iter = (original as AsyncIterable<AgentSDKEvent>)[Symbol.asyncIterator]();\n              return {\n                async next(): Promise<IteratorResult<AgentSDKEvent>> {\n                  const result = await iter.next();\n\n                  if (result.done) {\n                    // Stream ended — fire onSessionEnd plugins\n                    for (const plugin of plugins) {\n                      Promise.resolve(plugin.onSessionEnd?.(pluginCtx)).catch(() => {});\n                    }\n                    return result;\n                  }\n\n                  const event = result.value;\n\n                  // Track session ID\n                  if (event.session_id) {\n                    resolvedSessionId = event.session_id;\n                    pluginCtx.sessionId = event.session_id;\n                  }\n\n                  try {\n                    // Tool call tracking\n                    if (event.type === 'assistant' && event.message?.content) {\n                      const toolUses = event.message.content.filter((b) => b.type === 'tool_use');\n                      for (const block of toolUses) {\n                        post(`${portalUrl}/api/internal/agents/tool-call`, token, {\n                          toolName: block.name || 'unknown',\n                          toolCategory: 'custom',\n                          source: 'agent_sdk',\n                          sessionId: target.sessionId || resolvedSessionId,\n                          success: true,\n                          attributes: attrs,\n                        }, debug);\n\n                        // Plugin onToolUse\n                        for (const plugin of plugins) {\n                          Promise.resolve(plugin.onToolUse?.(pluginCtx, block.name || 'unknown', block.input)).catch(() => {});\n                        }\n                      }\n                    }\n\n                    // Usage tracking\n                    if (event.type === 'result') {\n                      const usageBody = {\n                        agentId: resolvedAgentId || undefined,\n                        sessionId: event.session_id || target.sessionId || undefined,\n                        promptTokens: event.usage?.input_tokens || 0,\n                        completionTokens: event.usage?.output_tokens || 0,\n                        cacheReadTokens: event.usage?.cache_read_input_tokens || 0,\n                        cacheCreationTokens: event.usage?.cache_creation_input_tokens || 0,\n                        costUsd: event.total_cost_usd || 0,\n                        numTurns: event.num_turns || 0,\n                        durationMs: event.duration_ms || 0,\n                        durationApiMs: event.duration_api_ms || 0,\n                        model: 'claude-agent-sdk',\n                        provider: 'anthropic',\n                        source: 'agent_sdk',\n                        keyIndex: options._resolvedKeyIndex ?? 0,\n                        attributes: attrs,\n                      };\n                      post(`${portalUrl}/api/agents/usage`, token, usageBody, debug);\n\n                      if (debug) {\n                        console.log('[withAnycast] usage:', `${usageBody.promptTokens}in/${usageBody.completionTokens}out`, `$${usageBody.costUsd.toFixed(4)}`, `${usageBody.numTurns} turns`);\n                      }\n\n                      // Plugin onResult\n                      const usageData = {\n                        promptTokens: usageBody.promptTokens,\n                        completionTokens: usageBody.completionTokens,\n                        cacheReadTokens: usageBody.cacheReadTokens,\n                        cacheCreationTokens: usageBody.cacheCreationTokens,\n                        costUsd: usageBody.costUsd,\n                        numTurns: usageBody.numTurns,\n                        durationMs: usageBody.durationMs,\n                      };\n                      for (const plugin of plugins) {\n                        Promise.resolve(plugin.onResult?.(pluginCtx, usageData)).catch(() => {});\n                      }\n\n                      // Session persistence\n                      if (persistSession && event.session_id) {\n                        memory.set(`session:${agentId}:latest`, {\n                          sessionId: event.session_id,\n                          savedAt: new Date().toISOString(),\n                          agentName: options.agentName,\n                        }, { ttl: 30 * 24 * 60 * 60 }).catch(() => {});\n                      }\n                    }\n                  } catch (err) {\n                    if (debug) console.warn('[withAnycast] telemetry error:', err instanceof Error ? err.message : err);\n                  }\n\n                  return result;\n                },\n                return: iter.return?.bind(iter),\n                throw: iter.throw?.bind(iter),\n              };\n            },\n          };\n        };\n      }\n      return Reflect.get(target, prop, receiver);\n    },\n  }) as T & { memory: AnycastMemory; emit: (eventName: string, data?: Record<string, unknown>) => Promise<void> };\n}\n\n/**\n * Retrieve the last persisted session ID for an agent.\n */\nwithAnycast.getLastSessionId = async function (\n  agentToken: string,\n  options?: { portalUrl?: string; agentId?: string },\n): Promise<string | null> {\n  const portalUrl = (options?.portalUrl || 'https://agents.anycast.com').replace(/\\/$/, '');\n  const id = options?.agentId || hashToken(agentToken);\n  try {\n    const res = await fetch(`${portalUrl}/api/agents/memory`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json', 'x-agent-token': agentToken },\n      body: JSON.stringify({ operation: 'get', key: `session:${id}:latest`, scope: 'agent' }),\n      signal: AbortSignal.timeout(5000),\n    });\n    if (!res.ok) return null;\n    const data = (await res.json()) as { value?: string };\n    if (!data.value) return null;\n    const parsed = typeof data.value === 'string' ? JSON.parse(data.value) : data.value;\n    return (parsed as { sessionId?: string })?.sessionId || null;\n  } catch { return null; }\n};\n\n/**\n * Resolve an API key from the platform's key pool.\n * Uses provider rotation strategy and budget enforcement.\n *\n * @example\n * ```js\n * const resolved = await withAnycast.resolveApiKey({\n *   agentToken: process.env.ANYCAST_TOKEN,\n *   provider: 'anthropic',\n *   model: 'claude-sonnet-4-6',\n * })\n * const session = sdk.unstable_v2_createSession({\n *   apiKey: resolved.apiKey,\n *   model: resolved.model,\n * })\n * ```\n */\nwithAnycast.resolveApiKey = async function (options: {\n  agentToken: string;\n  portalUrl?: string;\n  model?: string;\n  provider?: string;\n}): Promise<{\n  apiKey: string;\n  provider: string;\n  providerName: string;\n  model: string | null;\n  keyIndex: number;\n  providerId: string;\n}> {\n  const base = (options.portalUrl || 'https://agents.anycast.com').replace(/\\/$/, '');\n  const url = new URL('/api/agents/sdk/resolve-key', base);\n  if (options.model) url.searchParams.set('model', options.model);\n  if (options.provider) url.searchParams.set('provider', options.provider);\n\n  const response = await fetch(url.toString(), {\n    headers: { 'x-agent-token': options.agentToken },\n    signal: AbortSignal.timeout(10000),\n  });\n\n  if (!response.ok) {\n    const body = await response.json().catch(() => ({ error: `HTTP ${response.status}` })) as { error?: string; hint?: string };\n    throw new Error(`[withAnycast] resolveApiKey failed: ${body.error}${body.hint ? `\\nHint: ${body.hint}` : ''}`);\n  }\n\n  return response.json() as Promise<{\n    apiKey: string; provider: string; providerName: string;\n    model: string | null; keyIndex: number; providerId: string;\n  }>;\n};\n","/**\n * withAnycastOpenAI() — transparent telemetry wrapper for @openai/agents streams.\n *\n * Tested against @openai/agents 0.x\n * OpenAI Agents SDK is evolving rapidly. If this wrapper breaks after an SDK update,\n * check: https://github.com/openai/openai-agents-js\n * and update the event type interface below.\n */\n\nimport { AnycastMemory } from './with-anycast.js';\n\n// Minimal interfaces matching the OpenAI Agents SDK stream shape.\n\ninterface OpenAIAgentStreamEvent {\n  type: 'raw_model_stream_event' | 'run_item_stream_event' | 'agent_updated_stream_event' | 'run_stream_done' | string;\n  item?: {\n    type: 'message_output_item' | 'tool_call_item' | 'tool_call_output_item' | string;\n    rawItem?: { name?: string; type?: string };\n  };\n  finalOutput?: {\n    rawResponses?: Array<{\n      usage?: { input_tokens?: number; output_tokens?: number; total_tokens?: number };\n    }>;\n  };\n}\n\ninterface OpenAIAgentStream {\n  [Symbol.asyncIterator](): AsyncIterator<OpenAIAgentStreamEvent>;\n}\n\nexport interface WithAnycastOpenAIOptions {\n  /** Agent token from the Anycast portal */\n  agentToken: string;\n  /** Portal URL (default: https://agents.anycast.com) */\n  portalUrl?: string;\n  /** Display name in portal */\n  agentName?: string;\n  /** Log forwarded events to console */\n  debug?: boolean;\n  /** Attach .memory API to the stream (default: false) */\n  enableMemory?: boolean;\n  /** Auto-persist session state (default: false) */\n  persistSession?: boolean;\n}\n\nconst SDK_VERSION = '0.1.18';\n\n/** Fire-and-forget POST */\nfunction post(url: string, token: string, body: Record<string, unknown>, debug: boolean): void {\n  fetch(url, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', 'x-agent-token': token },\n    body: JSON.stringify(body),\n    signal: AbortSignal.timeout(5000),\n  }).catch((err) => {\n    if (debug) console.warn('[withAnycastOpenAI] POST failed:', err.message);\n  });\n}\n\n/**\n * Wrap an OpenAI Agents SDK stream with Anycast telemetry.\n *\n * @example\n * ```js\n * const { run } = require('@openai/agents')\n * const { withAnycastOpenAI } = require('@anycast/agent')\n *\n * const stream = withAnycastOpenAI(\n *   await run(agent, prompt, { stream: true }),\n *   { agentToken: process.env.ANYCAST_TOKEN }\n * )\n * for await (const event of stream) { ... }\n * ```\n */\nexport function withAnycastOpenAI<T extends OpenAIAgentStream>(\n  stream: T,\n  options: WithAnycastOpenAIOptions,\n): T & { memory: AnycastMemory } {\n  const portalUrl = (options.portalUrl || 'https://agents.anycast.com').replace(/\\/$/, '');\n  const token = options.agentToken;\n  const debug = options.debug || false;\n\n  const memory = new AnycastMemory(token, portalUrl, 'agent', debug);\n\n  // Resolved agentId from heartbeat\n  let resolvedAgentId: string | null = null;\n\n  // Heartbeat — auto-creates Agent, returns agentId\n  fetch(`${portalUrl}/api/agents/sdk/heartbeat`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json', 'x-agent-token': token },\n    body: JSON.stringify({ name: options.agentName || 'SDK Agent', source: 'sdk_openai', sdkVersion: SDK_VERSION }),\n    signal: AbortSignal.timeout(5000),\n  })\n    .then((res) => res.json())\n    .then((data) => { const p = data as { agentId?: string }; if (p.agentId) resolvedAgentId = p.agentId; })\n    .catch(() => {});\n\n  return new Proxy(stream, {\n    get(target, prop, receiver) {\n      if (prop === 'memory') return memory;\n\n      if (prop === Symbol.asyncIterator) {\n        return function () {\n          const iter = target[Symbol.asyncIterator]();\n          return {\n            async next(): Promise<IteratorResult<OpenAIAgentStreamEvent>> {\n              const result = await iter.next();\n              if (result.done) return result;\n\n              const event = result.value;\n\n              try {\n                // Tool call tracking\n                if (\n                  event.type === 'run_item_stream_event' &&\n                  event.item?.type === 'tool_call_item'\n                ) {\n                  post(\n                    `${portalUrl}/api/internal/agents/tool-call`,\n                    token,\n                    {\n                      toolName: event.item.rawItem?.name || 'unknown',\n                      toolCategory: 'custom',\n                      source: 'openai_agents_sdk',\n                      success: true,\n                    },\n                    debug,\n                  );\n                }\n\n                // Usage tracking on stream completion\n                if (event.type === 'run_stream_done') {\n                  const responses = event.finalOutput?.rawResponses || [];\n                  let promptTokens = 0;\n                  let completionTokens = 0;\n                  for (const r of responses) {\n                    promptTokens += r.usage?.input_tokens || 0;\n                    completionTokens += r.usage?.output_tokens || 0;\n                  }\n                  post(\n                    `${portalUrl}/api/agents/usage`,\n                    token,\n                    {\n                      promptTokens,\n                      completionTokens,\n                      model: 'openai-agents-sdk',\n                      provider: 'openai',\n                      source: 'openai_agents_sdk',\n                    },\n                    debug,\n                  );\n                  if (debug) {\n                    console.log(\n                      '[withAnycastOpenAI] usage:',\n                      `${promptTokens}in/${completionTokens}out`,\n                      `from ${responses.length} responses`,\n                    );\n                  }\n                }\n              } catch (err) {\n                if (debug)\n                  console.warn('[withAnycastOpenAI] telemetry error:', err instanceof Error ? err.message : err);\n              }\n\n              return result;\n            },\n            return: iter.return?.bind(iter),\n            throw: iter.throw?.bind(iter),\n          };\n        };\n      }\n\n      return Reflect.get(target, prop, receiver);\n    },\n  }) as T & { memory: AnycastMemory };\n}\n","import type { AnycastPlugin } from '../types.js';\n\nexport interface SlackPluginOptions {\n  userId: string;\n  userName: string;\n  channelId: string;\n  channelName: string;\n  threadTs: string;\n  teamId?: string;\n}\n\n/**\n * Slack plugin for withAnycast() — emits structured Slack context events.\n *\n * @example\n * ```js\n * const session = withAnycast(rawSession, {\n *   agentToken: process.env.ANYCAST_TOKEN,\n *   attributes: {\n *     'user.id': event.user,\n *     'messaging.system': 'slack',\n *     'messaging.destination': channelName,\n *     'messaging.destination_id': channelId,\n *     'messaging.conversation_id': threadTs,\n *   },\n *   plugins: [slackPlugin({ userId, userName, channelId, channelName, threadTs })]\n * })\n * ```\n */\nexport function slackPlugin(opts: SlackPluginOptions): AnycastPlugin {\n  return {\n    name: 'slack',\n    onSessionStart: async (ctx) => {\n      await ctx.emit('slack.session.start', {\n        userId: opts.userId,\n        userName: opts.userName,\n        channelId: opts.channelId,\n        channelName: opts.channelName,\n        threadTs: opts.threadTs,\n        teamId: opts.teamId,\n      });\n    },\n    onResult: async (ctx, usage) => {\n      await ctx.emit('slack.session.cost', {\n        userId: opts.userId,\n        userName: opts.userName,\n        channelName: opts.channelName,\n        costUsd: usage.costUsd,\n        turns: usage.numTurns,\n        tokens: usage.promptTokens + usage.completionTokens,\n      });\n    },\n  };\n}\n"]}