{"version":3,"sources":["../../src/endpoint/multi-endpoint.ts"],"sourcesContent":["/**\n * MultiEndpointRegistry SDK\n * OxaChain L1 + Sepolia — multi-endpoint management for AI Agents\n */\nimport { type PublicClient, type WalletClient, type Address, type Hash, type Chain } from 'viem'\n\nexport interface EndpointRecord {\n  endpointId: bigint\n  agentId: bigint\n  name: string\n  endpointType: string\n  protocol: string\n  url: string\n  description: string\n  isActive: boolean\n  createdAt: bigint\n  updatedAt: bigint\n  createdBy: Address\n}\n\nexport interface MultiEndpointConfig {\n  address: Address\n}\n\nconst ABI = [\n  {\n    name: 'getActiveAgentEndpoints',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ name: 'agentId', type: 'uint256' }],\n    outputs: [{\n      type: 'tuple[]',\n      components: [\n        { name: 'endpointId', type: 'uint256' },\n        { name: 'agentId', type: 'uint256' },\n        { name: 'name', type: 'string' },\n        { name: 'endpointType', type: 'string' },\n        { name: 'protocol', type: 'string' },\n        { name: 'url', type: 'string' },\n        { name: 'description', type: 'string' },\n        { name: 'isActive', type: 'bool' },\n        { name: 'createdAt', type: 'uint256' },\n        { name: 'updatedAt', type: 'uint256' },\n        { name: 'createdBy', type: 'address' },\n      ]\n    }],\n  },\n  {\n    name: 'getAgentEndpoints',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ name: 'agentId', type: 'uint256' }],\n    outputs: [{\n      type: 'tuple[]',\n      components: [\n        { name: 'endpointId', type: 'uint256' },\n        { name: 'agentId', type: 'uint256' },\n        { name: 'name', type: 'string' },\n        { name: 'endpointType', type: 'string' },\n        { name: 'protocol', type: 'string' },\n        { name: 'url', type: 'string' },\n        { name: 'description', type: 'string' },\n        { name: 'isActive', type: 'bool' },\n        { name: 'createdAt', type: 'uint256' },\n        { name: 'updatedAt', type: 'uint256' },\n        { name: 'createdBy', type: 'address' },\n      ]\n    }],\n  },\n  {\n    name: 'createEndpoint',\n    type: 'function',\n    stateMutability: 'nonpayable',\n    inputs: [\n      { name: 'agentId', type: 'uint256' },\n      { name: 'name', type: 'string' },\n      { name: 'endpointType', type: 'string' },\n      { name: 'protocol', type: 'string' },\n      { name: 'url', type: 'string' },\n      { name: 'description', type: 'string' },\n    ],\n    outputs: [{ name: 'endpointId', type: 'uint256' }],\n  },\n  {\n    name: 'getEndpoint',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ name: 'endpointId', type: 'uint256' }],\n    outputs: [{\n      type: 'tuple',\n      components: [\n        { name: 'endpointId', type: 'uint256' },\n        { name: 'agentId', type: 'uint256' },\n        { name: 'name', type: 'string' },\n        { name: 'endpointType', type: 'string' },\n        { name: 'protocol', type: 'string' },\n        { name: 'url', type: 'string' },\n        { name: 'description', type: 'string' },\n        { name: 'isActive', type: 'bool' },\n        { name: 'createdAt', type: 'uint256' },\n        { name: 'updatedAt', type: 'uint256' },\n        { name: 'createdBy', type: 'address' },\n      ]\n    }],\n  },\n  {\n    name: 'getSupportedProtocols',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [],\n    outputs: [{ type: 'string[]' }],\n  },\n  {\n    name: 'getAgentEndpointStats',\n    type: 'function',\n    stateMutability: 'view',\n    inputs: [{ name: 'agentId', type: 'uint256' }],\n    outputs: [\n      { name: 'totalEndpoints', type: 'uint256' },\n      { name: 'activeEndpoints', type: 'uint256' },\n      { name: 'httpEndpoints', type: 'uint256' },\n      { name: 'websocketEndpoints', type: 'uint256' },\n      { name: 'grpcEndpoints', type: 'uint256' },\n    ],\n  },\n] as const\n\nexport class MultiEndpointClient {\n  private address: Address\n  private publicClient: PublicClient | null\n\n  constructor(config: MultiEndpointConfig, publicClient?: PublicClient) {\n    this.address = config.address\n    this.publicClient = publicClient ?? null\n  }\n\n  setPublicClient(client: PublicClient) {\n    this.publicClient = client\n  }\n\n  async getActiveEndpoints(agentId: bigint): Promise<EndpointRecord[]> {\n    if (!this.publicClient) throw new Error('publicClient not set')\n    return (await this.publicClient.readContract({\n      address: this.address,\n      abi: ABI,\n      functionName: 'getActiveAgentEndpoints',\n      args: [agentId],\n    })) as EndpointRecord[]\n  }\n\n  async getAllEndpoints(agentId: bigint): Promise<EndpointRecord[]> {\n    if (!this.publicClient) throw new Error('publicClient not set')\n    return (await this.publicClient.readContract({\n      address: this.address,\n      abi: ABI,\n      functionName: 'getAgentEndpoints',\n      args: [agentId],\n    })) as EndpointRecord[]\n  }\n\n  async getEndpoint(endpointId: bigint): Promise<EndpointRecord> {\n    if (!this.publicClient) throw new Error('publicClient not set')\n    return (await this.publicClient.readContract({\n      address: this.address,\n      abi: ABI,\n      functionName: 'getEndpoint',\n      args: [endpointId],\n    })) as EndpointRecord\n  }\n\n  async getStats(agentId: bigint) {\n    if (!this.publicClient) throw new Error('publicClient not set')\n    return (await this.publicClient.readContract({\n      address: this.address,\n      abi: ABI,\n      functionName: 'getAgentEndpointStats',\n      args: [agentId],\n    })) as [bigint, bigint, bigint, bigint, bigint]\n  }\n\n  /** Pick best active endpoint for the agent — prefer HTTP, take first active */\n  async pickBestEndpoint(agentId: bigint): Promise<EndpointRecord | null> {\n    const endpoints = await this.getActiveEndpoints(agentId)\n    if (endpoints.length === 0) return null\n    // prefer HTTP endpoints\n    const http = endpoints.find(e => e.protocol === 'HTTP')\n    return http ?? endpoints[0] ?? null\n  }\n\n  /** Pick any active endpoint URL — for MCP connector */\n  async getBestMCPUrl(agentId: bigint): Promise<string | null> {\n    const best = await this.pickBestEndpoint(agentId)\n    return best?.url ?? null\n  }\n}\n"],"mappings":"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","names":[]}