{"version":3,"sources":["../../src/core/crypto.ts","../../src/agent-loop/tool-builder.ts","../../src/agent-loop/executor.ts","../../src/agent-loop/context-compactor.ts","../../src/agent-loop/fact-extractor.ts","../../src/agent-loop/trace-emitter.ts","../../src/agent-loop/loop.ts","../../src/agent-loop/platform-tools/definitions.ts","../../src/agent-loop/platform-tools/executor.ts","../../src/agent-loop/a2a-daemon.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// @agentx/sdk — Crypto Engine\n// ---------------------------------------------------------------------------\n// AES-256-GCM for content encryption (NIST standard wire format).\n// ECIES (secp256k1) for key wrapping.\n//\n// Wire format (AES-256-GCM):\n//   base64( IV[12] || ciphertext || authTag[16] )\n//\n// ECIES wire format (compatible with eciesjs):\n//   hex( ephemeralPub[33] || IV[16] || ciphertext || MAC[32] )\n//\n// Pure JS — works in browser, Node, edge. No native deps except @noble/*.\n// ---------------------------------------------------------------------------\n\nimport { gcm } from '@noble/ciphers/aes.js'\nimport { secp256k1 } from '@noble/curves/secp256k1.js'\nimport { sha256 } from '@noble/hashes/sha2.js'\nimport { hkdf } from '@noble/hashes/hkdf.js'\nimport { hmac } from '@noble/hashes/hmac.js'\nimport { bytesToHex, hexToBytes } from '@noble/ciphers/utils.js'\n\n// ── randomBytes implementation (cross-runtime: browser / Node) ────────────\n\nexport function randomBytes(length: number): Uint8Array {\n  // browser: crypto.getRandomValues\n  if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n    const buf = new Uint8Array(length)\n    crypto.getRandomValues(buf)\n    return buf\n  }\n  // Node: crypto.randomBytes\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const nodeCrypto = require('crypto')\n  return new Uint8Array(nodeCrypto.randomBytes(length))\n}\n\nimport type { EncryptedPayload, AgentPrivatePayload } from './types'\nimport type { PackResult } from './types'\n\n// ── Re-exports for convenience ─────────────────────────────────────────────\n\nexport { bytesToHex, hexToBytes }\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\nconst AES_KEY_SIZE = 32\nconst IV_SIZE = 12 // GCM recommended\nconst TAG_SIZE = 16 // GCM auth tag\n\n// ── Base64 helpers (cross-runtime) ─────────────────────────────────────────\n\nfunction toBase64(bytes: Uint8Array): string {\n  // Works in browser (btoa + binary) and Node (Buffer)\n  if (typeof Buffer !== 'undefined') return Buffer.from(bytes).toString('base64')\n  let binary = ''\n  for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]!)\n  return btoa(binary)\n}\n\nfunction fromBase64(b64: string): Uint8Array {\n  if (typeof Buffer !== 'undefined') return new Uint8Array(Buffer.from(b64, 'base64'))\n  const binary = atob(b64)\n  const bytes = new Uint8Array(binary.length)\n  for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n  return bytes\n}\n\n// ── AES-256-GCM ────────────────────────────────────────────────────────────\n\n/**\n * Encrypt with AES-256-GCM.\n * Wire format: base64( IV[12] || ciphertext || authTag[16] )\n */\nexport function aesEncrypt(plaintext: string, keyHex: string): string {\n  const key = hexToBytes(keyHex)\n  const iv = randomBytes(IV_SIZE)\n  const plainBytes = new TextEncoder().encode(plaintext)\n\n  const cipher = gcm(key, iv)\n  const encrypted = cipher.encrypt(plainBytes)\n  // noble gcm.encrypt returns: ciphertext || authTag(16)\n  const ciphertext = encrypted.subarray(0, -TAG_SIZE)\n  const authTag = encrypted.subarray(-TAG_SIZE)\n\n  // Pack: IV || ciphertext || authTag\n  const combined = new Uint8Array(IV_SIZE + ciphertext.length + TAG_SIZE)\n  combined.set(iv, 0)\n  combined.set(ciphertext, IV_SIZE)\n  combined.set(authTag, IV_SIZE + ciphertext.length)\n\n  return toBase64(combined)\n}\n\n/**\n * Decrypt AES-256-GCM.\n */\nexport function aesDecrypt(encryptedBase64: string, keyHex: string): string {\n  const key = hexToBytes(keyHex)\n  const combined = fromBase64(encryptedBase64)\n\n  const iv = combined.subarray(0, IV_SIZE)\n  const ciphertext = combined.subarray(IV_SIZE, -TAG_SIZE)\n  const authTag = combined.subarray(-TAG_SIZE)\n\n  const cipher = gcm(key, iv)\n  // noble decrypt expects: ciphertext || authTag\n  const ciphertextWithTag = new Uint8Array(ciphertext.length + TAG_SIZE)\n  ciphertextWithTag.set(ciphertext, 0)\n  ciphertextWithTag.set(authTag, ciphertext.length)\n\n  const decrypted = cipher.decrypt(ciphertextWithTag)\n  return new TextDecoder().decode(decrypted)\n}\n\n/**\n * Encrypt with AES-256-GCM — master-key wire format.\n * Layout: base64( IV[12] || authTag[16] || ciphertext ).\n * Kept byte-for-byte compatible with the Gateway's legacy at-rest key\n * encryption (`gateway/src/lib/crypto.ts`) so existing stored rows decrypt\n * unchanged. New code should prefer `aesEncrypt`/`aesDecrypt` unless data\n * written in this layout must be read.\n */\nexport function encryptWithKey(plaintext: string, keyHex: string): string {\n  const key = hexToBytes(keyHex)\n  const iv = randomBytes(IV_SIZE)\n  const plainBytes = new TextEncoder().encode(plaintext)\n\n  const cipher = gcm(key, iv)\n  const encrypted = cipher.encrypt(plainBytes)\n  const ciphertext = encrypted.subarray(0, -TAG_SIZE)\n  const authTag = encrypted.subarray(-TAG_SIZE)\n\n  const combined = new Uint8Array(IV_SIZE + TAG_SIZE + ciphertext.length)\n  combined.set(iv, 0)\n  combined.set(authTag, IV_SIZE)\n  combined.set(ciphertext, IV_SIZE + TAG_SIZE)\n\n  return toBase64(combined)\n}\n\n/**\n * Decrypt AES-256-GCM — master-key wire format\n * (base64( IV[12] || authTag[16] || ciphertext )).\n */\nexport function decryptWithKey(encryptedBase64: string, keyHex: string): string {\n  const key = hexToBytes(keyHex)\n  const combined = fromBase64(encryptedBase64)\n\n  const iv = combined.subarray(0, IV_SIZE)\n  const authTag = combined.subarray(IV_SIZE, IV_SIZE + TAG_SIZE)\n  const ciphertext = combined.subarray(IV_SIZE + TAG_SIZE)\n\n  const cipher = gcm(key, iv)\n  const ciphertextWithTag = new Uint8Array(ciphertext.length + TAG_SIZE)\n  ciphertextWithTag.set(ciphertext, 0)\n  ciphertextWithTag.set(authTag, ciphertext.length)\n\n  const decrypted = cipher.decrypt(ciphertextWithTag)\n  return new TextDecoder().decode(decrypted)\n}\n\n/**\n * Generate a cryptographically random AES-256 key (hex, 64 chars).\n */\nexport function generateAesKey(): string {\n  return bytesToHex(randomBytes(AES_KEY_SIZE))\n}\n\n// ── ECIES (secp256k1) ──────────────────────────────────────────────────────\n//\n// eciesjs-compatible wire format:\n//   ephemeralPub(33B compressed) || IV(16B) || ciphertext || MAC(32B)\n//   Encoding: hex\n//\n// HKDF(SHA-256) derives AES key + HMAC key from ECDH shared secret.\n// ---------------------------------------------------------------------------\n\nfunction eciesEncode(\n  ephemeralPub: Uint8Array,\n  iv: Uint8Array,\n  ciphertext: Uint8Array,\n  mac: Uint8Array\n): string {\n  const out = new Uint8Array(33 + 16 + ciphertext.length + 32)\n  out.set(ephemeralPub, 0)\n  out.set(iv, 33)\n  out.set(ciphertext, 33 + 16)\n  out.set(mac, 33 + 16 + ciphertext.length)\n  return bytesToHex(out)\n}\n\nfunction eciesDecode(dataHex: string): {\n  ephemeralPub: Uint8Array\n  iv: Uint8Array\n  ciphertext: Uint8Array\n  mac: Uint8Array\n} {\n  const d = hexToBytes(dataHex)\n  return {\n    ephemeralPub: d.subarray(0, 33),\n    iv: d.subarray(33, 49),\n    ciphertext: d.subarray(49, -32),\n    mac: d.subarray(-32),\n  }\n}\n\n// Simple AES-256-CTR implementation on top of @noble/ciphers AES core\nfunction aesCtrEncrypt(key: Uint8Array, ctrBytes: Uint8Array, data: Uint8Array): Uint8Array {\n  const blockSize = 16\n  const cipher = gcm(key, ctrBytes) // GCM internally handles CTR\n  // Use noble's CTR approach: encrypt the plaintext directly with the derived stream\n  // noble uses AES-CTR internally for GCM; simpler: implement CTR with AES-ECB\n  const result = new Uint8Array(data.length)\n  const counter = new Uint8Array(blockSize)\n  counter.set(ctrBytes)\n  for (let i = 0; i < data.length; i += blockSize) {\n    const keystream = gcm(key, counter).encrypt(new Uint8Array(blockSize))\n    for (let j = 0; j < blockSize && i + j < data.length; j++) {\n      result[i + j] = keystream[j]! ^ data[i + j]!\n    }\n    // Increment counter (big-endian)\n    for (let j = blockSize - 1; j >= 0; j--) {\n      const val = counter[j]\n      if (val !== undefined) {\n        counter[j] = (val + 1) & 0xff\n        if (counter[j] !== 0) break\n      }\n    }\n  }\n  return result\n}\n\n/**\n * Encrypt data with recipient's secp256k1 public key (ECIES).\n *\n * @param dataHex    The data to encrypt (hex, e.g. AES key)\n * @param publicKey  Recipient's public key (hex, 04-prefixed uncompressed or 02/03 compressed)\n */\nexport function eciesEncrypt(dataHex: string, publicKey: string): string {\n  // 1. Ephemeral keypair\n  const ephPriv = randomBytes(32)\n  const ephPub = secp256k1.getPublicKey(ephPriv, true) // 33B compressed\n\n  // 2. Parse recipient public key\n  let recipientPub: Uint8Array\n  if (publicKey.startsWith('04') && publicKey.length === 130) {\n    recipientPub = hexToBytes(publicKey)\n  } else if (publicKey.startsWith('02') || publicKey.startsWith('03')) {\n    recipientPub = hexToBytes(publicKey)\n  } else {\n    throw new Error('Invalid public key format: expected hex with 02/03/04 prefix')\n  }\n\n  // 3. ECDH\n  const shared = secp256k1.getSharedSecret(ephPriv, recipientPub)\n  const sharedX = shared.subarray(1, 33) // x-coordinate only\n  const sharedKey = sha256(sharedX)\n\n  // 4. HKDF: encKey(32) || macKey(32)\n  const hkdfOut = hkdf(sha256, sharedKey, undefined, undefined, 64)\n  const encKey = hkdfOut.subarray(0, 32)\n  const macKey = hkdfOut.subarray(32, 64)\n\n  // 5. AES-256-CTR encrypt\n  const iv = randomBytes(16)\n  const plaintext = hexToBytes(dataHex)\n  const ciphertext = aesCtrEncrypt(encKey, iv, plaintext)\n\n  // 6. HMAC: MAC(ephemeralPub || IV || ciphertext)\n  const macInput = new Uint8Array(33 + 16 + ciphertext.length)\n  macInput.set(ephPub, 0)\n  macInput.set(iv, 33)\n  macInput.set(ciphertext, 33 + 16)\n  const mac = hmac(sha256, macKey, macInput)\n\n  return eciesEncode(ephPub, iv, ciphertext, mac)\n}\n\n/**\n * Decrypt ECIES ciphertext with recipient's secp256k1 private key.\n */\nexport function eciesDecrypt(dataHex: string, privateKey: string): string {\n  const { ephemeralPub, iv, ciphertext, mac } = eciesDecode(dataHex)\n\n  // 1. ECDH\n  const privBytes = hexToBytes(privateKey)\n  const shared = secp256k1.getSharedSecret(privBytes, ephemeralPub)\n  const sharedX = shared.subarray(1, 33)\n  const sharedKey = sha256(sharedX)\n\n  // 2. HKDF\n  const hkdfOut = hkdf(sha256, sharedKey, undefined, undefined, 64)\n  const encKey = hkdfOut.subarray(0, 32)\n  const macKey = hkdfOut.subarray(32, 64)\n\n  // 3. Verify MAC\n  const macInput = new Uint8Array(33 + 16 + ciphertext.length)\n  macInput.set(ephemeralPub, 0)\n  macInput.set(iv, 33)\n  macInput.set(ciphertext, 33 + 16)\n  const expectedMac = hmac(sha256, macKey, macInput)\n  if (!constantTimeEqual(mac, expectedMac)) {\n    throw new Error('ECIES decryption failed: MAC mismatch')\n  }\n\n  // 4. Decrypt\n  const plaintext = aesCtrEncrypt(encKey, iv, ciphertext) // CTR encrypt = decrypt\n  return bytesToHex(plaintext)\n}\n\nfunction constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n  if (a.length !== b.length) return false\n  let diff = 0\n  for (let i = 0; i < a.length; i++) diff |= a[i]! ^ b[i]!\n  return diff === 0\n}\n\n// ── High-Level: Agent Pack / Unpack ────────────────────────────────────────\n\n/**\n * Encrypt an Agent's private payload with AES-256-GCM.\n */\nexport function encryptPayload(\n  payload: AgentPrivatePayload,\n  keyHex?: string\n): EncryptedPayload {\n  const key = keyHex ?? generateAesKey()\n  return {\n    encrypted: true,\n    algorithm: 'AES-256-GCM',\n    data: aesEncrypt(JSON.stringify(payload), key),\n  }\n}\n\n/**\n * Decrypt an EncryptedPayload.\n */\nexport function decryptPayload(\n  encrypted: EncryptedPayload,\n  keyHex: string\n): AgentPrivatePayload {\n  if (encrypted.algorithm !== 'AES-256-GCM') {\n    throw new Error(`Unsupported algorithm: ${encrypted.algorithm}`)\n  }\n  return JSON.parse(aesDecrypt(encrypted.data, keyHex)) as AgentPrivatePayload\n}\n\n/**\n * Pack an AgentPayload for publishing.\n *   1. Split public/private\n *   2. AES-256-GCM encrypt private part\n *   3. ECIES wrap AES key with creator's public key\n */\nexport function packAgentForPublish(\n  agent: import('./types').AgentPayload,\n  publicKey: string,\n  aesKeyHex?: string\n): PackResult {\n  const key = aesKeyHex ?? generateAesKey()\n\n  const eciesEncryptedKeyHex = eciesEncrypt(key, publicKey)\n\n  return {\n    encryptedCid: '', // filled after IPFS upload\n    publicCid: '',    // filled after IPFS upload\n    aesKeyHex: key,\n    eciesEncryptedKeyHex,\n  }\n}\n\n// ── Integrated Publish Pipeline ────────────────────────────────────────────\n\nimport type { IPFSUploader, IPFSUploadResult } from '../ipfs/ipfs-uploader'\n\nexport interface PublishAgentConfig {\n  /** Agent payload to publish */\n  agent: import('./types').AgentPayload\n  /** Creator's secp256k1 public key (hex) */\n  publicKey: string\n  /** IPFS uploader instance with Pinata JWT configured */\n  uploader: IPFSUploader\n  /** Optional AES key (auto-generated if not provided) */\n  aesKeyHex?: string\n  /** Agent name for IPFS metadata */\n  agentName?: string\n}\n\nexport interface PublishAgentResult {\n  /** AES encryption key (hex) */\n  aesKeyHex: string\n  /** ECIES-encrypted AES key for on-chain storage */\n  eciesEncryptedKeyHex: string\n  /** CID of the encrypted private payload on IPFS */\n  encryptedCid: string\n  /** Public IPFS gateway URL to the encrypted payload */\n  encryptedUrl: string\n  /** CID of the public metadata on IPFS */\n  publicCid: string\n  /** Public IPFS gateway URL to the public metadata */\n  publicUrl: string\n  /** Full PackResult (compatible with existing code) */\n  pack: PackResult\n  /** Raw IPFS upload results */\n  uploads: { encrypted: IPFSUploadResult; public: IPFSUploadResult }\n}\n\n/**\n * Full publish pipeline: encrypt + upload to IPFS.\n *\n * Usage:\n *   const uploader = new IPFSUploader({ pinataJwt: '...' })\n *   const result = await publishAgent({ agent, publicKey, uploader })\n *   // result.encryptedCid → IPFS CID to mint as on-chain tokenURI\n */\nexport async function publishAgent(config: PublishAgentConfig): Promise<PublishAgentResult> {\n  const { agent, publicKey, uploader, aesKeyHex, agentName } = config\n\n  if (!uploader.isConfigured()) {\n    throw new Error('IPFSUploader is not configured — set pinataJwt or customEndpoint')\n  }\n\n  const key = aesKeyHex ?? generateAesKey()\n  const eciesEncryptedKeyHex = eciesEncrypt(key, publicKey)\n\n  // Split into private (encrypted) and public payloads\n  const privatePayload: import('./types').AgentPrivatePayload = {\n    prompt: agent.prompt,\n    skills: agent.skills,\n    mcp: agent.mcp,\n  }\n  const encryptedPayload = encryptPayload(privatePayload, key)\n\n  // Upload both parts to IPFS in parallel\n  const [encrypted, publicMeta] = await Promise.all([\n    uploader.uploadEncryptedPayload(encryptedPayload, agentName),\n    uploader.uploadJSON({\n      name: agent.name,\n      description: agent.description,\n      version: agent.version,\n      tags: agent.tags,\n      capabilities: agent.capabilities,\n      category: agent.category,\n      eciesKey: eciesEncryptedKeyHex,\n    }),\n  ])\n\n  const pack: PackResult = {\n    encryptedCid: encrypted.cid,\n    publicCid: publicMeta.cid,\n    aesKeyHex: key,\n    eciesEncryptedKeyHex,\n  }\n\n  return {\n    aesKeyHex: key,\n    eciesEncryptedKeyHex,\n    encryptedCid: encrypted.cid,\n    encryptedUrl: encrypted.url,\n    publicCid: publicMeta.cid,\n    publicUrl: publicMeta.url,\n    pack,\n    uploads: { encrypted, public: publicMeta },\n  }\n}\n\n/**\n * Unpack an Agent:\n *   1. ECIES decrypt the AES key (private key)\n *   2. AES-256-GCM decrypt the payload\n */\nexport function unpackAgent(\n  encryptedPayload: EncryptedPayload,\n  eciesEncryptedKey: string,\n  privateKey: string\n): AgentPrivatePayload {\n  const aesKeyHex = eciesDecrypt(eciesEncryptedKey, privateKey)\n  return decryptPayload(encryptedPayload, aesKeyHex)\n}\n\n// ── Key Pair Utilities ─────────────────────────────────────────────────────\n\n/**\n * Generate a secp256k1 keypair compatible with Ethereum wallets.\n */\nexport function generateKeyPair(): { privateKey: string; publicKey: string } {\n  const priv = randomBytes(32)\n  const pub = secp256k1.getPublicKey(priv, false) // uncompressed 04-prefixed\n  return { privateKey: bytesToHex(priv), publicKey: bytesToHex(pub) }\n}\n\n/**\n * Derive public key from private key (hex).\n */\nexport function getPublicKey(privateKey: string): string {\n  return bytesToHex(secp256k1.getPublicKey(hexToBytes(privateKey), false))\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — Tool Builder\n// ---------------------------------------------------------------------------\n// Converts AgentX RunnableSkill[] into OpenAI function-calling Tool JSON.\n//\n//   const tools = buildTools(ctx.skills)\n//   // → [{ type: \"function\", function: { name, description, parameters } }]\n// ---------------------------------------------------------------------------\n\nimport type { RunnableSkill } from '../agent/agent-runner'\nimport type { OpenAIToolDef } from './types'\n\nfunction toOpenAIParameters(schema: Record<string, unknown>): Record<string, unknown> {\n  const result: Record<string, unknown> = { type: (schema.type as string) ?? 'object' }\n\n  if (schema.properties) {\n    result.properties = convertProperties(schema.properties as Record<string, Record<string, unknown>>)\n  }\n  if (schema.required && Array.isArray(schema.required)) {\n    result.required = schema.required\n  }\n  if (schema.description) {\n    result.description = schema.description\n  }\n\n  return result\n}\n\nfunction convertProperties(properties: Record<string, Record<string, unknown>>): Record<string, Record<string, unknown>> {\n  const out: Record<string, Record<string, unknown>> = {}\n  for (const [key, prop] of Object.entries(properties)) {\n    const converted: Record<string, unknown> = {}\n\n    if (prop.type) converted.type = prop.type\n    if (prop.description) converted.description = prop.description\n    if (prop.items) converted.items = prop.items\n    if (prop.enum) converted.enum = prop.enum\n    if (prop.properties) {\n      converted.properties = convertProperties(prop.properties as Record<string, Record<string, unknown>>)\n    }\n    if (prop.required) converted.required = prop.required\n\n    out[key] = converted\n  }\n  return out\n}\n\nexport function buildTools(skills: RunnableSkill[]): OpenAIToolDef[] {\n  if (!skills || skills.length === 0) return []\n\n  return skills.map(skill => ({\n    type: 'function' as const,\n    function: {\n      name: skill.name,\n      description: skill.description || `Execute the \"${skill.name}\" skill`,\n      parameters: toOpenAIParameters(skill.inputSchema),\n    },\n  }))\n}\n\nexport function buildSystemPrompt(prompt: string, skills: RunnableSkill[]): string {\n  if (!skills || skills.length === 0) return prompt\n\n  const skillList = skills\n    .map(s => `- **${s.name}**: ${s.description}`)\n    .join('\\n')\n\n  return `${prompt}\\n\\n## Available Tools\\nYou have access to the following tools. Use them when appropriate:\\n${skillList}`\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — Tool Executor\n// ---------------------------------------------------------------------------\n// Dispatches LLM tool calls to the correct RunnableSkill and executes.\n// Supports parallel execution of multiple tools in a single iteration.\n// ---------------------------------------------------------------------------\n\nimport type { RunnableSkill } from '../agent/agent-runner'\nimport type { ToolCallRecord } from './types'\n\nexport interface ExecuteOptions {\n  skills: RunnableSkill[]\n  timeoutMs?: number\n}\n\nexport class ToolExecutor {\n  private skills: Map<string, RunnableSkill>\n  private timeoutMs: number\n\n  constructor(opts: ExecuteOptions) {\n    this.skills = new Map()\n    for (const s of opts.skills) {\n      this.skills.set(s.name, s)\n    }\n    this.timeoutMs = opts.timeoutMs ?? 30_000\n  }\n\n  executeSingle(\n    name: string,\n    args: Record<string, unknown>,\n  ): Promise<ToolCallRecord> {\n    const startTime = Date.now()\n    const skill = this.skills.get(name)\n\n    if (!skill) {\n      return Promise.resolve({\n        callId: '',\n        name,\n        arguments: args,\n        result: null,\n        error: `Unknown tool: ${name}`,\n        durationMs: Date.now() - startTime,\n      })\n    }\n\n    const executePromise = skill.execute(args)\n\n    const timeoutPromise = new Promise<never>((_, reject) =>\n      setTimeout(() => reject(new Error(`Tool \"${name}\" timed out after ${this.timeoutMs}ms`)), this.timeoutMs),\n    )\n\n    return Promise.race([executePromise, timeoutPromise])\n      .then(result => ({\n        callId: '',\n        name,\n        arguments: args,\n        result: this.normalizeResult(result),\n        durationMs: Date.now() - startTime,\n      }))\n      .catch(err => ({\n        callId: '',\n        name,\n        arguments: args,\n        result: null,\n        error: err instanceof Error ? err.message : String(err),\n        durationMs: Date.now() - startTime,\n      }))\n  }\n\n  async executeBatch(\n    calls: { callId: string; name: string; arguments: Record<string, unknown> }[],\n  ): Promise<ToolCallRecord[]> {\n    const results = await Promise.all(\n      calls.map(async c => {\n        const record = await this.executeSingle(c.name, c.arguments)\n        record.callId = c.callId\n        return record\n      }),\n    )\n    return results\n  }\n\n  hasTool(name: string): boolean {\n    return this.skills.has(name)\n  }\n\n  getToolNames(): string[] {\n    return Array.from(this.skills.keys())\n  }\n\n  private normalizeResult(result: unknown): unknown {\n    if (result === undefined || result === null) return null\n    if (typeof result === 'string' || typeof result === 'number' || typeof result === 'boolean') {\n      return result\n    }\n    if (result instanceof Error) return { error: result.message }\n    return result\n  }\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — Context Compactor\n// ---------------------------------------------------------------------------\n// Token estimation + LLM-based message summarization.\n// Extracted from AgentLoop for decoupling.\n// ---------------------------------------------------------------------------\n\nimport type { LLMMessage, LLMProvider } from './types'\n\nexport class ContextCompactor {\n  constructor(\n    private readonly llmProvider: LLMProvider,\n    private readonly compactModel: string = 'gpt-4o-mini',\n  ) {}\n\n  /** Rough token estimation: 1 token ≈ 4 characters */\n  estimateTokens(messages: LLMMessage[]): number {\n    let total = 0\n    for (const msg of messages) {\n      total += JSON.stringify(msg).length\n    }\n    return Math.ceil(total / 4)\n  }\n\n  /**\n   * Compact messages: keep system prompt + last 2 turns, summarize the rest.\n   * Returns original array if not enough messages or compaction fails.\n   */\n  async compact(messages: LLMMessage[]): Promise<LLMMessage[]> {\n    if (messages.length <= 5) return messages\n\n    const system = messages.filter(m => m.role === 'system')\n    const nonSystem = messages.filter(m => m.role !== 'system')\n    const keepCount = Math.min(4, nonSystem.length)\n    const keepMessages = nonSystem.slice(-keepCount)\n    const compactTarget = nonSystem.slice(0, nonSystem.length - keepCount)\n\n    if (compactTarget.length === 0) return messages\n\n    try {\n      const stream = this.llmProvider.chatStream({\n        model: this.compactModel,\n        messages: [{\n          role: 'user',\n          content: `Summarize concisely (keep all facts/decisions):\\n${compactTarget.map(m => `${m.role}: ${m.content}`).join('\\n')}`,\n        }],\n        maxTokens: 500,\n        temperature: 0.3,\n      })\n\n      let summary = ''\n      for await (const event of stream) {\n        if (event.type === 'text_delta') summary += event.content\n      }\n\n      return [...system, { role: 'system', content: `[Summary]: ${summary}` }, ...keepMessages]\n    } catch {\n      return messages\n    }\n  }\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — Fact Extractor\n// ---------------------------------------------------------------------------\n// Extracts key facts from conversation for memory storage.\n// Uses a single cheap LLM call for summarization.\n// ---------------------------------------------------------------------------\n\nimport type { LLMProvider } from './types'\n\nexport class FactExtractor {\n  constructor(\n    private readonly llmProvider: LLMProvider,\n    private readonly factModel: string = 'gpt-4o-mini',\n  ) {}\n\n  /** Extract simple facts from the conversation for memory storage */\n  async extract(userMessage: string, assistantResponse: string): Promise<string[]> {\n    try {\n      const stream = this.llmProvider.chatStream({\n        model: this.factModel,\n        messages: [{\n          role: 'user',\n          content: `Extract 1-3 key facts/preferences. One per line, <100 chars each. No other text.\\nUser: ${userMessage}\\nAssistant: ${assistantResponse.slice(0, 500)}\\nFacts:`,\n        }],\n        maxTokens: 200,\n        temperature: 0.3,\n      })\n\n      let text = ''\n      for await (const event of stream) {\n        if (event.type === 'text_delta') text += event.content\n      }\n\n      return text.split('\\n').map(s => s.replace(/^[\\d\\-•. ]+/, '').trim()).filter(Boolean)\n    } catch {\n      return []\n    }\n  }\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — Loop Trace Emitter\n// ---------------------------------------------------------------------------\n// Fire-and-forget structured observability for AgentLoop.\n// Extracted from AgentLoop for decoupling.\n// ---------------------------------------------------------------------------\n\nimport type { TraceEvent, TraceConfig } from '../traces/types'\n\nexport class LoopTraceEmitter {\n  private readonly config: TraceConfig | undefined\n\n  constructor(config?: TraceConfig) {\n    this.config = config\n  }\n\n  emit(event: Omit<TraceEvent, 'timestamp'>): void {\n    if (!this.config?.enabled) return\n    try {\n      this.config.emitter.emit({ ...event, timestamp: Date.now() })\n    } catch {\n      // Trace emit should never throw — silently ignore\n    }\n  }\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — AgentLoop\n// ---------------------------------------------------------------------------\n// ReAct-style agent loop engine.\n//\n//   const loop = new AgentLoop({ ctx, llmProvider, maxIterations: 5 })\n//   const result = await loop.run(userMessage, history)\n//\n// Flow:\n//   [Memory Recall] → User Input → LLM Thinks → [Context Check] → Tool Call → Execute → Result → LLM Thinks → ...\n//   Until: LLM stops calling tools, max iterations reached, or timeout.\n//   [Memory Store]\n// ---------------------------------------------------------------------------\n\nimport type {\n  AgentLoopConfig,\n  AgentLoopResult,\n  LLMMessage,\n  LLMToolCall,\n  ToolCallRecord,\n} from './types'\nimport { buildTools, buildSystemPrompt } from './tool-builder'\nimport { ToolExecutor } from './executor'\nimport { ContextCompactor } from './context-compactor'\nimport { FactExtractor } from './fact-extractor'\nimport { LoopTraceEmitter } from './trace-emitter'\n\nconst DEFAULT_MAX_ITERATIONS = 5\nconst DEFAULT_TIMEOUT_MS = 120_000\nconst DEFAULT_MODEL = 'gpt-4o'\n\nexport class AgentLoop {\n  private config: AgentLoopConfig\n  private executor: ToolExecutor\n  private tools: ReturnType<typeof buildTools>\n  private systemPrompt: string\n  private aborted = false\n  private abortController: AbortController | null = null\n  private sessionId = ''\n\n  private readonly compactor: ContextCompactor\n  private readonly factExtractor: FactExtractor\n  private readonly tracer: LoopTraceEmitter\n\n  constructor(config: AgentLoopConfig) {\n    this.config = {\n      ...config,\n      maxIterations: config.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n      timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n    }\n\n    this.executor = new ToolExecutor({ skills: config.ctx.skills })\n    this.tools = buildTools(config.ctx.skills)\n    this.systemPrompt = buildSystemPrompt(config.ctx.prompt, config.ctx.skills)\n\n    // Extracted sub-engines — accept model overrides from config\n    this.compactor = new ContextCompactor(\n      config.llmProvider,\n      config.compactModel,\n    )\n    this.factExtractor = new FactExtractor(\n      config.llmProvider,\n      config.factExtractionModel,\n    )\n    this.tracer = new LoopTraceEmitter(config.trace)\n  }\n\n  abort(): void {\n    this.aborted = true\n    this.abortController?.abort()\n  }\n\n  async run(\n    userMessage: string,\n    history: { role: 'user' | 'assistant'; content: string }[] = [],\n  ): Promise<AgentLoopResult> {\n    const startTime = Date.now()\n    const toolCalls: ToolCallRecord[] = []\n    const totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 }\n    let finalText = ''\n    let iterations = 0\n\n    let messages: LLMMessage[] = [\n      { role: 'system', content: this.systemPrompt },\n      ...history.map(m => ({\n        role: m.role as 'user' | 'assistant',\n        content: m.content,\n      })),\n      { role: 'user', content: userMessage },\n    ]\n\n    const sessionId = `sess_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`\n    this.sessionId = sessionId\n\n    // Memory recall\n    await this.recallMemory(messages, userMessage)\n\n    this.aborted = false\n    this.abortController = new AbortController()\n\n    try {\n      while (iterations < this.config.maxIterations!) {\n        if (this.aborted) {\n          if (this.config.onThinking) {\n            this.config.onThinking('Aborted by user')\n          }\n          break\n        }\n\n        iterations++\n\n        if (this.config.onThinking && iterations > 1) {\n          this.config.onThinking(`Thinking... (round ${iterations}/${this.config.maxIterations!})`)\n        }\n\n        // Context compaction\n        if (this.config.contextBudget && this.compactor.estimateTokens(messages) > this.config.contextBudget) {\n          messages = await this.compactor.compact(messages)\n        }\n\n        const iterationResult = await this.runIteration(messages)\n\n        finalText += iterationResult.text\n        toolCalls.push(...iterationResult.toolCallRecords)\n        totalUsage.promptTokens += iterationResult.usage.promptTokens\n        totalUsage.completionTokens += iterationResult.usage.completionTokens\n        totalUsage.totalTokens += iterationResult.usage.totalTokens\n\n        if (iterationResult.toolCalls.length === 0) {\n          break\n        }\n\n        const assistantMsg: LLMMessage = {\n          role: 'assistant',\n          content: iterationResult.text || null,\n          tool_calls: iterationResult.toolCalls,\n        }\n        messages.push(assistantMsg)\n\n        for (let i = 0; i < iterationResult.toolCalls.length; i++) {\n          const tc = iterationResult.toolCalls[i]!\n          const record = iterationResult.toolCallRecords[i]!\n          let toolContent: string\n\n          if (record.error) {\n            toolContent = `Error: ${record.error}`\n          } else {\n            toolContent = typeof record.result === 'string'\n              ? record.result\n              : JSON.stringify(record.result)\n          }\n\n          messages.push({\n            role: 'tool',\n            content: toolContent,\n            tool_call_id: tc.id,\n          })\n        }\n      }\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err))\n      if (this.config.onError) {\n        this.config.onError(error)\n      }\n      if (finalText === '' && toolCalls.length === 0) {\n        finalText = `Agent loop error: ${error.message}`\n      }\n    } finally {\n      this.abortController = null\n    }\n\n    const result: AgentLoopResult = {\n      finalText: finalText || 'No response generated.',\n      toolCalls,\n      totalIterations: iterations,\n      totalDuration: Date.now() - startTime,\n      usage: totalUsage,\n    }\n\n    // Memory store on session end\n    await this.storeMemory(userMessage, result.finalText)\n\n    // Trace emit — session complete\n    this.tracer.emit({\n      tenantId: this.config.ctx.subscriberAddress || 'unknown',\n      agentId: this.config.ctx.agentId,\n      sessionId: this.sessionId,\n      type: 'session_complete',\n      data: {\n        totalIterations: iterations,\n        totalDuration: Date.now() - startTime,\n        totalTokens: totalUsage.totalTokens,\n        toolCallCount: toolCalls.length,\n      },\n    })\n\n    if (this.config.onComplete) {\n      this.config.onComplete(result)\n    }\n\n    return result\n  }\n\n  // ── Private: Memory ─────────────────────────────────────────────────────\n\n  private async recallMemory(messages: LLMMessage[], userMessage: string): Promise<void> {\n    if (!this.config.memory?.enabled || !this.config.ctx.subscriberAddress || !this.config.ctx.agentId) return\n\n    try {\n      const facts = await this.config.memory.provider.recall({\n        subscriberAddress: this.config.ctx.subscriberAddress,\n        agentId: this.config.ctx.agentId,\n        query: userMessage,\n        limit: this.config.memory.recallLimit ?? 5,\n      })\n      if (facts.length > 0 && messages[0]) {\n        const memoryContext = '\\n\\n## Relevant Memory\\n' + facts.map(f => `- ${f.fact}`).join('\\n')\n        messages[0].content = (messages[0].content || '') + memoryContext\n      }\n    } catch (err) {\n      console.warn('[AgentLoop] Memory recall failed:', (err as Error).message)\n    }\n  }\n\n  private async storeMemory(userMessage: string, assistantResponse: string): Promise<void> {\n    if (!this.config.memory?.enabled || this.config.memory.storeOnSessionEnd === false\n        || !this.config.ctx.subscriberAddress || !this.config.ctx.agentId) return\n\n    try {\n      const facts = await this.factExtractor.extract(userMessage, assistantResponse)\n      for (const fact of facts) {\n        await this.config.memory.provider.store({\n          subscriberAddress: this.config.ctx.subscriberAddress,\n          agentId: this.config.ctx.agentId,\n          fact,\n        })\n      }\n    } catch (err) {\n      console.warn('[AgentLoop] Memory store failed:', (err as Error).message)\n    }\n  }\n\n  // ── Private: Iteration ──────────────────────────────────────────────────\n\n  private async runIteration(\n    messages: LLMMessage[],\n  ): Promise<{\n    text: string\n    toolCalls: LLMToolCall[]\n    toolCallRecords: ToolCallRecord[]\n    usage: { promptTokens: number; completionTokens: number; totalTokens: number }\n  }> {\n    const model = this.config.ctx.model ?? this.config.llmProvider.model ?? DEFAULT_MODEL\n    const temperature = this.config.ctx.temperature ?? 0.7\n    const maxTokens = this.config.ctx.maxTokens ?? 4096\n\n    const stream = this.config.llmProvider.chatStream(\n      {\n        model,\n        messages,\n        tools: this.tools.length > 0 ? this.tools : undefined,\n        temperature,\n        maxTokens,\n      },\n      this.abortController?.signal,\n    )\n\n    let text = ''\n    const toolCallsAccum: Map<string, { name: string; arguments: string }> = new Map()\n    const usage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 }\n\n    for await (const event of stream) {\n      if (this.aborted) break\n\n      switch (event.type) {\n        case 'text_delta':\n          text += event.content\n          if (this.config.onTextDelta) {\n            this.config.onTextDelta(event.content)\n          }\n          break\n\n        case 'tool_call_start':\n          toolCallsAccum.set(event.callId, { name: event.name, arguments: '' })\n          break\n\n        case 'tool_call_delta': {\n          const existing = toolCallsAccum.get(event.callId)\n          if (existing) {\n            existing.arguments += event.arguments\n          }\n          break\n        }\n\n        case 'done':\n          usage.promptTokens = event.usage.promptTokens\n          usage.completionTokens = event.usage.completionTokens\n          usage.totalTokens = event.usage.totalTokens\n          break\n\n        case 'error':\n          throw event.error\n      }\n    }\n\n    const llmToolCalls: LLMToolCall[] = []\n    const parsedToolCalls: { callId: string; name: string; arguments: Record<string, unknown> }[] = []\n\n    for (const [callId, tc] of toolCallsAccum) {\n      let parsedArgs: Record<string, unknown> = {}\n      try {\n        parsedArgs = tc.arguments ? JSON.parse(tc.arguments) : {}\n      } catch {\n        parsedArgs = { raw: tc.arguments }\n      }\n\n      llmToolCalls.push({\n        id: callId,\n        type: 'function',\n        function: { name: tc.name, arguments: tc.arguments },\n      })\n\n      parsedToolCalls.push({ callId, name: tc.name, arguments: parsedArgs })\n    }\n\n    if (parsedToolCalls.length > 0) {\n      for (const ptc of parsedToolCalls) {\n        if (this.config.onToolCall) {\n          this.config.onToolCall({ callId: ptc.callId, name: ptc.name, arguments: ptc.arguments })\n        }\n        this.tracer.emit({\n          tenantId: this.config.ctx.subscriberAddress || 'unknown',\n          agentId: this.config.ctx.agentId,\n          sessionId: this.sessionId,\n          type: 'tool_call',\n          data: { callId: ptc.callId, name: ptc.name, arguments: ptc.arguments },\n        })\n      }\n    }\n\n    const toolCallRecords = await this.executor.executeBatch(parsedToolCalls)\n\n    for (const record of toolCallRecords) {\n      if (this.config.onToolResult) {\n        this.config.onToolResult({\n          callId: record.callId,\n          name: record.name,\n          result: record.result,\n          error: record.error,\n          durationMs: record.durationMs,\n        })\n      }\n      this.tracer.emit({\n        tenantId: this.config.ctx.subscriberAddress || 'unknown',\n        agentId: this.config.ctx.agentId,\n        sessionId: this.sessionId,\n        type: 'tool_result',\n        data: { callId: record.callId, name: record.name, error: record.error, durationMs: record.durationMs },\n      })\n    }\n\n    return { text, toolCalls: llmToolCalls, toolCallRecords, usage }\n  }\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — Platform Tools\n// ---------------------------------------------------------------------------\n// Exposes ALL AgentX platform capabilities as LLM-callable OpenAI function tools.\n//\n//   const tools = buildPlatformTools({ agentRunner, a2a, subscriptionManager, ... })\n//   // → [{ type: \"function\", function: { name, description, parameters } }]\n//\n// When AgentLoop calls a tool:\n//   platformExecutor(toolName, args, ctx) → result JSON\n//\n// Modules wrapped:\n//   1. IdentityRegistry  — register / get / list / exists / metadata\n//   2. SubscriptionManager — plans / subscribe / check / cancel / detail\n//   3. A2AProtocol        — createTask / getTask / completeTask / getUserTasks / card\n//   4. ReputationRegistry — rate / getRating / getReviews\n//   5. ConfigurationRegistry — getConfig / getAgentConfigs / setConfig\n//   6. MultiEndpointRegistry — getEndpoints / getBestEndpoint\n//   7. Gateway API         — chat / tenant / history\n// ---------------------------------------------------------------------------\n\nimport type { RunnableSkill } from '../../agent/agent-runner'\nimport type { AgentRunner } from '../../agent/agent-runner'\nimport type { A2AProtocol } from '../../a2a/a2a'\nimport type { SubscriptionManager } from '../../subscription/subscription'\nimport type { AgentRegistry } from '../../registry/agent-registry'\nimport type { IPFSUploader } from '../../ipfs/ipfs-uploader'\n\n// ── Tool Definition Types ──────────────────────────────────────────────────\n\nexport interface PlatformToolDef {\n  type: 'function'\n  function: {\n    name: string\n    description: string\n    parameters: Record<string, unknown>\n  }\n}\n\nexport interface PlatformToolContext {\n  agentRunner: AgentRunner\n  a2a: A2AProtocol\n  subscriptionManager: SubscriptionManager\n  agentRegistry: AgentRegistry\n  reputationRegistry?: {\n    rateAgent(agentId: number, rating: number, comment: string): Promise<unknown>\n    getRating(agentId: number): Promise<{ averageRating: number; totalRatings: number }>\n    getReviews(agentId: number): Promise<unknown[]>\n  }\n  configurationRegistry?: {\n    getConfig(agentId: number, key: string): Promise<{ value: string; dataType: string }>\n    getAgentConfigs(agentId: number): Promise<unknown[]>\n    setConfig(agentId: number, key: string, value: string, dataType: string): Promise<unknown>\n  }\n  multiEndpointRegistry?: {\n    getAgentEndpoints(agentId: number): Promise<unknown[]>\n    getActiveAgentEndpoints(agentId: number): Promise<unknown[]>\n    getBestMCPUrl(agentId: number): Promise<string>\n  }\n  gatewayUrl?: string\n  gatewayToken?: string\n  userAddress: string\n  ipfsUploader?: IPFSUploader\n}\n\n// ── Schema Helpers ─────────────────────────────────────────────────────────\n\nfunction required(keys: string[]): string[] { return keys }\n\nfunction object(props: Record<string, Record<string, unknown>>, req?: string[]): Record<string, unknown> {\n  const s: Record<string, unknown> = { type: 'object', properties: props }\n  if (req) s.required = req\n  return s\n}\n\nfunction str(desc: string, en?: string[]): Record<string, unknown> {\n  const s: Record<string, unknown> = { type: 'string', description: desc }\n  if (en) s.enum = en\n  return s\n}\n\nfunction num(desc: string): Record<string, unknown> {\n  return { type: 'number', description: desc }\n}\n\nfunction integer(desc: string): Record<string, unknown> {\n  return { type: 'integer', description: desc }\n}\n\nfunction boolean(desc: string): Record<string, unknown> {\n  return { type: 'boolean', description: desc }\n}\n\nfunction array(items: Record<string, unknown>, desc: string): Record<string, unknown> {\n  return { type: 'array', items, description: desc }\n}\n\n// ── 1. IdentityRegistry Tools ──────────────────────────────────────────────\n\nconst identityRegistryTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_identity_register',\n      description: 'Register a new AI Agent on the AgentX blockchain. Required before any agent can be published, subscribed to, or used.',\n      parameters: object({\n        tokenURI: str('IPFS URI of the agent public metadata (ipfs://...)'),\n        encryptedPayloadCid: str('IPFS CID of the encrypted agent payload'),\n        eciesEncryptedKey: str('Hex-encoded ECIES-encrypted AES key for the payload'),\n        aesKeyHex: str('Hex-encoded AES key (stored as metadata)'),\n      }, required(['tokenURI', 'encryptedPayloadCid', 'eciesEncryptedKey'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_identity_get',\n      description: 'Get detailed information about a registered Agent by its ID. Returns owner, metadata URI, active status, and on-chain metadata attributes.',\n      parameters: object({\n        agentId: integer('The numeric agent ID to query'),\n      }, required(['agentId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_identity_list',\n      description: 'List all Agent IDs owned by a specific wallet address.',\n      parameters: object({\n        ownerAddress: str('Ethereum wallet address to query'),\n      }),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_identity_exists',\n      description: 'Check if a specific Agent ID exists on the blockchain.',\n      parameters: object({\n        agentId: integer('The agent ID to check'),\n      }, required(['agentId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_identity_total_count',\n      description: 'Get the total number of agents registered in the IdentityRegistry.',\n      parameters: object({}),\n    },\n  },\n]\n\n// ── 2. SubscriptionManager Tools ───────────────────────────────────────────\n\nconst subscriptionTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_plans',\n      description: 'Get plan details for a specific subscription plan by its ID. Returns price, period, creator, pay token, trial days, and active status.',\n      parameters: object({\n        planId: integer('The plan ID to fetch'),\n      }, required(['planId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_check',\n      description: 'Check if a wallet address has an active subscription for a specific agent.',\n      parameters: object({\n        subscriberAddress: str('Wallet address to check'),\n        agentId: integer('The agent ID'),\n      }, required(['subscriberAddress', 'agentId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_detail',\n      description: 'Get full subscription details including trial info, payment token, amount paid, escrow status.',\n      parameters: object({\n        subscriptionId: integer('The subscription ID'),\n      }, required(['subscriptionId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_my_list',\n      description: 'List all subscription IDs belonging to the current user.',\n      parameters: object({}),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_subscribe',\n      description: 'Subscribe to a plan. For ETH plans this will send ETH. For ERC20 plans, the token must already be approved. This is a blockchain transaction — the user must approve it in their wallet.',\n      parameters: object({\n        planId: integer('The plan ID to subscribe to'),\n        valueWei: str('Amount of ETH in wei to send (for ETH plans). Example: \"1000000000000000000\" for 1 ETH'),\n      }, required(['planId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_cancel',\n      description: 'Cancel an existing subscription. If within trial period, funds may be refunded.',\n      parameters: object({\n        subscriptionId: integer('The subscription ID to cancel'),\n      }, required(['subscriptionId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_release',\n      description: 'Release escrowed subscription funds to the agent creator (after trial window). Only callable by the subscriber.',\n      parameters: object({\n        subscriptionId: integer('The subscription ID'),\n      }, required(['subscriptionId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_subscription_fee',\n      description: 'Get the current platform fee in basis points (e.g. 250 = 2.5%).',\n      parameters: object({}),\n    },\n  },\n]\n\n// ── 3. A2AProtocol Tools ───────────────────────────────────────────────────\n\nconst a2aTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_a2a_create_task',\n      description: 'Create an on-chain Agent-to-Agent task. This delegates work to another AgentX agent. The target agent will see this as a pending task they can complete.',\n      parameters: object({\n        targetAgentId: integer('The Agent ID to delegate work to'),\n        taskType: str('Type of task, e.g. \"audit\", \"analyze\", \"generate\", \"review\"'),\n        inputData: str('JSON string of the task input. Include all details the target agent needs.'),\n      }, required(['targetAgentId', 'taskType', 'inputData'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_a2a_get_task',\n      description: 'Get full details of an A2A task by its ID — status, input, output, creator, timestamps.',\n      parameters: object({\n        taskId: integer('The A2A task ID'),\n      }, required(['taskId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_a2a_complete_task',\n      description: 'Mark an A2A task as completed and submit the output data on-chain.',\n      parameters: object({\n        taskId: integer('The task ID to complete'),\n        outputData: str('JSON string of the task output/result'),\n      }, required(['taskId', 'outputData'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_a2a_my_tasks',\n      description: 'Get all A2A task IDs assigned to or created by the current user.',\n      parameters: object({}),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_a2a_agent_card',\n      description: 'Get an agent\\'s A2A card — name, capabilities, supported task types, protocol info.',\n      parameters: object({\n        agentId: integer('The agent ID'),\n      }, required(['agentId'])),\n    },\n  },\n]\n\n// ── 4. ReputationRegistry Tools ────────────────────────────────────────────\n\nconst reputationTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_reputation_rate',\n      description: 'Rate an agent (1-5) and leave a comment on-chain.',\n      parameters: object({\n        agentId: integer('The agent ID to rate'),\n        rating: integer('Rating from 1 (worst) to 5 (best)'),\n        comment: str('Optional review comment'),\n      }, required(['agentId', 'rating'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_reputation_get',\n      description: 'Get the average rating and total number of ratings for an agent.',\n      parameters: object({\n        agentId: integer('The agent ID'),\n      }, required(['agentId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_reputation_reviews',\n      description: 'Get all reviews for an agent (reviewer address, rating, comment, timestamp).',\n      parameters: object({\n        agentId: integer('The agent ID'),\n      }, required(['agentId'])),\n    },\n  },\n]\n\n// ── 5. ConfigurationRegistry Tools ─────────────────────────────────────────\n\nconst configurationTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_config_get',\n      description: 'Read a single configuration value for an agent by key.',\n      parameters: object({\n        agentId: integer('The agent ID'),\n        configKey: str('The configuration key name'),\n      }, required(['agentId', 'configKey'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_config_list',\n      description: 'List all configuration entries for an agent.',\n      parameters: object({\n        agentId: integer('The agent ID'),\n      }, required(['agentId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_config_set',\n      description: 'Set or update a configuration value for an agent on-chain. Only the agent owner can write.',\n      parameters: object({\n        agentId: integer('The agent ID'),\n        key: str('Configuration key name'),\n        value: str('Configuration value'),\n        dataType: str('Data type: \"string\", \"number\", \"boolean\", \"json\"', ['string', 'number', 'boolean', 'json']),\n      }, required(['agentId', 'key', 'value'])),\n    },\n  },\n]\n\n// ── 6. MultiEndpointRegistry Tools ─────────────────────────────────────────\n\nconst endpointTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_endpoint_list',\n      description: 'Get all registered endpoints for an agent (MCP URLs, API endpoints, etc.).',\n      parameters: object({\n        agentId: integer('The agent ID'),\n      }, required(['agentId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_endpoint_active',\n      description: 'Get only active endpoints for an agent. Useful for finding available MCP or API servers.',\n      parameters: object({\n        agentId: integer('The agent ID'),\n      }, required(['agentId'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_endpoint_best_mcp',\n      description: 'Find the best available MCP endpoint URL for an agent. Automatically picks the healthiest active endpoint.',\n      parameters: object({\n        agentId: integer('The agent ID'),\n      }, required(['agentId'])),\n    },\n  },\n]\n\n// ── 7. Gateway API Tools ───────────────────────────────────────────────────\n\nconst gatewayTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_gateway_chat',\n      description: 'Call an LLM through the AgentX Gateway using platform quota or BYOK key. Supports OpenAI models via SSE streaming.',\n      parameters: object({\n        model: str('LLM model name, e.g. \"gpt-4o\", \"gpt-4o-mini\"'),\n        messages: array(\n          object({\n            role: str('Message role', ['system', 'user', 'assistant', 'tool']),\n            content: str('Message content text'),\n          }),\n          'Array of conversation messages'\n        ),\n        keySource: str('API key source', ['platform', 'tenant_owned']),\n        tenantKeyId: str('BYOK key UUID (required when key_source is \"tenant_owned\")'),\n        temperature: num('Sampling temperature 0-2'),\n        max_tokens: integer('Maximum tokens in the response'),\n      }, required(['model', 'messages'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_gateway_tenant_me',\n      description: 'Get the current tenant (user) profile: plan info, API keys, today\\'s usage quota.',\n      parameters: object({}),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_gateway_tenant_usage',\n      description: 'Get usage history for the current tenant: token consumption, tool calls by day.',\n      parameters: object({\n        days: integer('Number of days of history (default 30)'),\n      }),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_gateway_tenant_keys',\n      description: 'List all BYOK API keys registered for the current tenant.',\n      parameters: object({}),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_gateway_models',\n      description: 'List available LLM models: both platform-provided and tenant-owned models.',\n      parameters: object({}),\n    },\n  },\n]\n\n// ── 8. IPFS Tools ───────────────────────────────────────────────────────────\n\nconst ipfsTools: PlatformToolDef[] = [\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_ipfs_upload',\n      description: 'Upload JSON data to IPFS via Pinata (requires Pinata JWT configured). Returns the IPFS CID and gateway URL.',\n      parameters: object({\n        data: str('The JSON data to upload, as a JSON string'),\n        name: str('Optional name for the uploaded file'),\n      }, required(['data'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_ipfs_upload_encrypted',\n      description: 'Encrypt and upload an Agent payload to IPFS. Used in the Agent publish flow. Generates AES key, encrypts the payload, and uploads to IPFS in one step.',\n      parameters: object({\n        prompt: str('The private system prompt to encrypt and upload'),\n        skillsJson: str('JSON string of skills configuration'),\n        mcpJson: str('JSON string of MCP configuration'),\n        agentName: str('Name for the agent payload metadata'),\n      }, required(['prompt'])),\n    },\n  },\n  {\n    type: 'function',\n    function: {\n      name: 'agentx_ipfs_get_url',\n      description: 'Build a public IPFS gateway URL from a CID.',\n      parameters: object({\n        cid: str('The IPFS CID (Content Identifier)'),\n        gateway: str('Optional gateway URL (default: ipfs.io)'),\n      }, required(['cid'])),\n    },\n  },\n]\n\n// ── Build All Tools ─────────────────────────────────────────────────────────\n\nexport function buildPlatformTools(\n  available?: ('identity' | 'subscription' | 'a2a' | 'reputation' | 'configuration' | 'endpoint' | 'gateway' | 'ipfs')[]\n): PlatformToolDef[] {\n  const modules = available ?? ['identity', 'subscription', 'a2a', 'reputation', 'configuration', 'endpoint', 'gateway', 'ipfs']\n  const tools: PlatformToolDef[] = []\n\n  for (const mod of modules) {\n    switch (mod) {\n      case 'identity': tools.push(...identityRegistryTools); break\n      case 'subscription': tools.push(...subscriptionTools); break\n      case 'a2a': tools.push(...a2aTools); break\n      case 'reputation': tools.push(...reputationTools); break\n      case 'configuration': tools.push(...configurationTools); break\n      case 'endpoint': tools.push(...endpointTools); break\n      case 'gateway': tools.push(...gatewayTools); break\n      case 'ipfs': tools.push(...ipfsTools); break\n    }\n  }\n\n  return tools\n}\n\nexport function getAllPlatformToolNames(): string[] {\n  return buildPlatformTools().map(t => t.function.name)\n}\n\n","import type { PlatformToolDef, PlatformToolContext } from \"./definitions\"\nimport { buildPlatformTools } from \"./definitions\"\nimport type { RunnableSkill } from \"../../agent/agent-runner\"\n\n// ── Tool Executor ───────────────────────────────────────────────────────────\n\nexport async function executePlatformTool(\n  toolName: string,\n  args: Record<string, unknown>,\n  ctx: PlatformToolContext\n): Promise<unknown> {\n  try {\n    switch (toolName) {\n      // ── Identity ──────────────────────────────────\n      case 'agentx_identity_register': {\n        const { tokenURI, encryptedPayloadCid, eciesEncryptedKey, aesKeyHex } = args as any\n        const metadata = [\n          { key: 'encryptedPayloadCid', value: encryptedPayloadCid },\n          { key: 'eciesEncryptedKey', value: eciesEncryptedKey },\n        ]\n        if (aesKeyHex) metadata.push({ key: 'aesKeyHex', value: aesKeyHex })\n        return ctx.agentRegistry.register(tokenURI, metadata)\n      }\n      case 'agentx_identity_get':\n        return {\n          tokenURI: await ctx.agentRegistry.tokenURI(args.agentId as number),\n          attributes: await ctx.agentRegistry.getAttributes(args.agentId as number),\n          exists: await ctx.agentRegistry.agentExists(args.agentId as number),\n        }\n      case 'agentx_identity_list':\n        return ctx.agentRegistry.getAgentsByOwner((args.ownerAddress ?? ctx.userAddress) as `0x${string}`)\n      case 'agentx_identity_exists':\n        return ctx.agentRegistry.agentExists(args.agentId as number)\n      case 'agentx_identity_total_count':\n        return { totalAgents: await ctx.agentRegistry.getCurrentAgentId() }\n\n      // ── Subscription ──────────────────────────────\n      case 'agentx_subscription_plans':\n        return ctx.subscriptionManager.getPlan(args.planId as number)\n      case 'agentx_subscription_check':\n        return ctx.subscriptionManager.hasActiveSubscription(\n          (args.subscriberAddress ?? ctx.userAddress) as `0x${string}`,\n          args.agentId as number\n        )\n      case 'agentx_subscription_detail':\n        return ctx.subscriptionManager.getSubscriptionDetail(args.subscriptionId as number)\n      case 'agentx_subscription_my_list':\n        return ctx.subscriptionManager.getUserSubscriptions(ctx.userAddress as `0x${string}`)\n      case 'agentx_subscription_subscribe': {\n        const valueWei = args.valueWei ? BigInt(args.valueWei as string) : undefined\n        return ctx.subscriptionManager.subscribe(args.planId as number, { valueWei })\n      }\n      case 'agentx_subscription_cancel':\n        return ctx.subscriptionManager.cancel(args.subscriptionId as number)\n      case 'agentx_subscription_release':\n        return ctx.subscriptionManager.releaseFunds(args.subscriptionId as number)\n      case 'agentx_subscription_fee':\n        return { platformFeeBps: await ctx.subscriptionManager.getPlatformFeeBps() }\n\n      // ── A2A ───────────────────────────────────────\n      case 'agentx_a2a_create_task':\n        return ctx.a2a.createTask(\n          args.targetAgentId as number,\n          args.taskType as string,\n          typeof args.inputData === 'string' ? JSON.parse(args.inputData as string) : args.inputData as Record<string, unknown>\n        )\n      case 'agentx_a2a_get_task':\n        return ctx.a2a.getTask(args.taskId as number)\n      case 'agentx_a2a_complete_task':\n        return ctx.a2a.completeTask(args.taskId as number, args.outputData as string)\n      case 'agentx_a2a_my_tasks':\n        return ctx.a2a.getUserTasks(ctx.userAddress as `0x${string}`)\n      case 'agentx_a2a_agent_card':\n        return ctx.a2a.getAgentCard(args.agentId as number)\n\n      // ── Reputation ─────────────────────────────────\n      case 'agentx_reputation_rate':\n        if (!ctx.reputationRegistry) throw new Error('ReputationRegistry not configured')\n        return ctx.reputationRegistry.rateAgent(args.agentId as number, args.rating as number, (args.comment as string) ?? '')\n      case 'agentx_reputation_get':\n        if (!ctx.reputationRegistry) throw new Error('ReputationRegistry not configured')\n        return ctx.reputationRegistry.getRating(args.agentId as number)\n      case 'agentx_reputation_reviews':\n        if (!ctx.reputationRegistry) throw new Error('ReputationRegistry not configured')\n        return ctx.reputationRegistry.getReviews(args.agentId as number)\n\n      // ── Configuration ──────────────────────────────\n      case 'agentx_config_get':\n        if (!ctx.configurationRegistry) throw new Error('ConfigurationRegistry not configured')\n        return ctx.configurationRegistry.getConfig(args.agentId as number, args.configKey as string)\n      case 'agentx_config_list':\n        if (!ctx.configurationRegistry) throw new Error('ConfigurationRegistry not configured')\n        return ctx.configurationRegistry.getAgentConfigs(args.agentId as number)\n      case 'agentx_config_set':\n        if (!ctx.configurationRegistry) throw new Error('ConfigurationRegistry not configured')\n        return ctx.configurationRegistry.setConfig(\n          args.agentId as number, args.key as string,\n          args.value as string, (args.dataType as string) ?? 'string'\n        )\n\n      // ── MultiEndpoint ──────────────────────────────\n      case 'agentx_endpoint_list':\n        if (!ctx.multiEndpointRegistry) throw new Error('MultiEndpointRegistry not configured')\n        return ctx.multiEndpointRegistry.getAgentEndpoints(args.agentId as number)\n      case 'agentx_endpoint_active':\n        if (!ctx.multiEndpointRegistry) throw new Error('MultiEndpointRegistry not configured')\n        return ctx.multiEndpointRegistry.getActiveAgentEndpoints(args.agentId as number)\n      case 'agentx_endpoint_best_mcp':\n        if (!ctx.multiEndpointRegistry) throw new Error('MultiEndpointRegistry not configured')\n        return { mcpUrl: await ctx.multiEndpointRegistry.getBestMCPUrl(args.agentId as number) }\n\n      // ── Gateway ────────────────────────────────────\n      case 'agentx_gateway_chat': {\n        if (!ctx.gatewayUrl || !ctx.gatewayToken) throw new Error('Gateway not configured')\n        const body: Record<string, unknown> = {\n          model: args.model ?? 'gpt-4o',\n          messages: args.messages,\n          stream: false,\n          key_source: args.keySource ?? 'platform',\n        }\n        if (args.temperature !== undefined) body.temperature = args.temperature\n        if (args.max_tokens) body.max_tokens = args.max_tokens\n        if (args.tenantKeyId) body.tenant_key_id = args.tenantKeyId\n\n        const res = await fetch(`${ctx.gatewayUrl}/api/v1/chat/completions`, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'Authorization': `Bearer ${ctx.gatewayToken}`,\n          },\n          body: JSON.stringify(body),\n        })\n        return res.json()\n      }\n      case 'agentx_gateway_tenant_me': {\n        if (!ctx.gatewayUrl || !ctx.gatewayToken) throw new Error('Gateway not configured')\n        const res = await fetch(`${ctx.gatewayUrl}/api/v1/tenant/me`, {\n          headers: { 'Authorization': `Bearer ${ctx.gatewayToken}` },\n        })\n        return res.json()\n      }\n      case 'agentx_gateway_tenant_usage': {\n        if (!ctx.gatewayUrl || !ctx.gatewayToken) throw new Error('Gateway not configured')\n        const res = await fetch(`${ctx.gatewayUrl}/api/v1/tenant/usage?days=${args.days ?? 30}`, {\n          headers: { 'Authorization': `Bearer ${ctx.gatewayToken}` },\n        })\n        return res.json()\n      }\n      case 'agentx_gateway_tenant_keys': {\n        if (!ctx.gatewayUrl || !ctx.gatewayToken) throw new Error('Gateway not configured')\n        const res = await fetch(`${ctx.gatewayUrl}/api/v1/tenant/keys`, {\n          headers: { 'Authorization': `Bearer ${ctx.gatewayToken}` },\n        })\n        return res.json()\n      }\n      case 'agentx_gateway_models': {\n        if (!ctx.gatewayUrl || !ctx.gatewayToken) throw new Error('Gateway not configured')\n        const res = await fetch(`${ctx.gatewayUrl}/api/v1/models`, {\n          headers: { 'Authorization': `Bearer ${ctx.gatewayToken}` },\n        })\n        return res.json()\n      }\n\n      // ── IPFS ───────────────────────────────────────\n      case 'agentx_ipfs_upload': {\n        if (!ctx.ipfsUploader) throw new Error('IPFSUploader not configured')\n        const data = typeof args.data === 'string' ? JSON.parse(args.data as string) : args.data\n        const result = await ctx.ipfsUploader.uploadJSON(data, { name: args.name as string })\n        return { cid: result.cid, url: result.url }\n      }\n      case 'agentx_ipfs_upload_encrypted': {\n        if (!ctx.ipfsUploader) throw new Error('IPFSUploader not configured')\n        const { generateAesKey, encryptPayload } = await import('../../core/crypto')\n        const privatePayload = {\n          prompt: args.prompt as string,\n          skills: args.skillsJson ? JSON.parse(args.skillsJson as string) : [],\n          mcp: args.mcpJson ? JSON.parse(args.mcpJson as string) : {},\n        }\n        const key = generateAesKey()\n        const encrypted = encryptPayload(privatePayload, key)\n        const result = await ctx.ipfsUploader.uploadEncryptedPayload(encrypted, args.agentName as string)\n        return { cid: result.cid, url: result.url, aesKeyHex: key }\n      }\n      case 'agentx_ipfs_get_url': {\n        const gateway = (args.gateway as string) ?? 'https://ipfs.io'\n        return { url: `${gateway}/ipfs/${args.cid}` }\n      }\n\n      default:\n        throw new Error(`Unknown platform tool: ${toolName}`)\n    }\n  } catch (err: unknown) {\n    const message = err instanceof Error ? err.message : String(err)\n    return { error: message, tool: toolName }\n  }\n}\n\n// ── Agent Loop Integration ──────────────────────────────────────────────────\n\n/**\n * Merge platform tools into an AgentLoop's skill list.\n * When AgentLoop calls execute(toolName, args), the platform executor handles it.\n */\nexport function wrapPlatformToolsAsSkills(\n  ctx: PlatformToolContext,\n  modules?: ('identity' | 'subscription' | 'a2a' | 'reputation' | 'configuration' | 'endpoint' | 'gateway' | 'ipfs')[]\n): RunnableSkill[] {\n  const toolDefs = buildPlatformTools(modules)\n\n  return toolDefs.map(def => ({\n    name: def.function.name,\n    description: def.function.description,\n    inputSchema: def.function.parameters as Record<string, unknown>,\n    mode: 'open' as const,\n    execute: async (input: Record<string, unknown>) => {\n      return executePlatformTool(def.function.name, input, ctx)\n    },\n  }))\n}\n","// ---------------------------------------------------------------------------\n// @agentx/sdk — A2A Task Daemon\n// ---------------------------------------------------------------------------\n// Runs alongside AgentLoop to automatically process incoming A2A tasks.\n//\n// How it works:\n//   1. Poll Gateway API for LLM-processed task results assigned to this agent\n//   2. (or) directly check contract for pending tasks via getAgentTasks()\n//   3. Call completeTask() on-chain with the agent owner's wallet\n//\n// This enables TRUE multi-agent interop:\n//   Agent A → createTask(Agent B) on-chain\n//   Gateway Worker → detects task → LLM processes → stores result in DB\n//   Agent B's A2A Daemon → polls Gateway → gets result → completeTask() on-chain\n//\n// Usage:\n//   const daemon = new A2ADaemon({\n//     agentId: 53,\n//     a2a: a2aProtocol,\n//     gatewayUrl: 'https://agentx.0xainet.top',\n//     pollIntervalMs: 15000,\n//   })\n//   daemon.start()\n//   daemon.on('taskCompleted', (task) => console.log('Done:', task.taskId))\n// ---------------------------------------------------------------------------\n\nimport type { A2AProtocol } from '../a2a/a2a'\nimport type { A2ATask } from '../core/types'\nimport { EventEmitter } from 'events'\n\n// ── Config ──────────────────────────────────────────────────────────────────\n\nexport interface A2ADaemonConfig {\n  /** Your agent's numeric ID */\n  agentId: number\n  /** Initialized A2AProtocol instance */\n  a2a: A2AProtocol\n  /** Gateway URL for fetching pre-computed LLM results */\n  gatewayUrl?: string\n  /** Poll interval in milliseconds (default: 15000) */\n  pollIntervalMs?: number\n  /** If true, daemon will auto-complete tasks (call completeTask on-chain) */\n  autoComplete?: boolean\n  /** Max tasks to process per poll (default: 3) */\n  maxPerPoll?: number\n}\n\nexport interface A2ATaskResult {\n  task: A2ATask\n  /** LLM-generated output from Gateway (if available) */\n  gatewayOutput?: string\n  /** If task was auto-completed on-chain */\n  completed: boolean\n  /** Transaction hash if completed */\n  txHash?: string\n  /** Error message if failed */\n  error?: string\n}\n\n// ── Daemon ──────────────────────────────────────────────────────────────────\n\nexport class A2ADaemon extends EventEmitter {\n  private config: Required<Omit<A2ADaemonConfig, 'gatewayUrl'>> & { gatewayUrl?: string }\n  private timer: ReturnType<typeof setInterval> | null = null\n  private isRunning = false\n  private processedTasks = new Set<number>()\n\n  constructor(config: A2ADaemonConfig) {\n    super()\n    this.config = {\n      agentId: config.agentId,\n      a2a: config.a2a,\n      gatewayUrl: config.gatewayUrl,\n      pollIntervalMs: config.pollIntervalMs ?? 15_000,\n      autoComplete: config.autoComplete ?? true,\n      maxPerPoll: config.maxPerPoll ?? 3,\n    }\n  }\n\n  // ── Lifecycle ────────────────────────────────────────────────────────────\n\n  start(): void {\n    if (this.timer) return\n    console.log(`[A2A Daemon] Starting for agent #${this.config.agentId}, poll: ${this.config.pollIntervalMs}ms`)\n    this.timer = setInterval(() => this.poll(), this.config.pollIntervalMs)\n    this.poll()\n  }\n\n  stop(): void {\n    if (this.timer) {\n      clearInterval(this.timer)\n      this.timer = null\n      console.log(`[A2A Daemon] Stopped for agent #${this.config.agentId}`)\n    }\n  }\n\n  get status(): { running: boolean; agentId: number; processedCount: number } {\n    return {\n      running: this.timer !== null,\n      agentId: this.config.agentId,\n      processedCount: this.processedTasks.size,\n    }\n  }\n\n  // ── Core Logic ───────────────────────────────────────────────────────────\n\n  private async poll(): Promise<void> {\n    if (this.isRunning) return\n    this.isRunning = true\n\n    try {\n      const pendingTasks = await this.getPendingTasks()\n      if (pendingTasks.length === 0) {\n        this.isRunning = false\n        return\n      }\n\n      console.log(`[A2A Daemon] Found ${pendingTasks.length} pending task(s) for agent #${this.config.agentId}`)\n\n      let processed = 0\n      for (const task of pendingTasks) {\n        if (processed >= this.config.maxPerPoll) break\n\n        try {\n          const result = await this.processPendingTask(task)\n          processed++\n\n          if (result.completed) {\n            this.processedTasks.add(task.taskId)\n            this.emit('taskCompleted', result)\n            console.log(`[A2A Daemon] Task #${task.taskId} completed, tx: ${result.txHash?.slice(0, 10)}...`)\n          } else if (result.error) {\n            this.emit('taskFailed', result)\n            console.warn(`[A2A Daemon] Task #${task.taskId} failed: ${result.error}`)\n          }\n        } catch (err: any) {\n          console.error(`[A2A Daemon] Error processing task #${task.taskId}:`, err.message)\n        }\n      }\n    } catch (err: any) {\n      console.error('[A2A Daemon] Poll error:', err.message)\n    } finally {\n      this.isRunning = false\n    }\n  }\n\n  /**\n   * Get pending tasks assigned to this agent using getAgentTasks() from the contract.\n   */\n  private async getPendingTasks(): Promise<A2ATask[]> {\n    try {\n      const allTasks = await this.config.a2a.getAgentTasks(this.config.agentId)\n      return allTasks.filter(\n        t => (t.status === 'created' || t.status === 'accepted') &&\n             !this.processedTasks.has(t.taskId)\n      )\n    } catch (err: any) {\n      console.warn('[A2A Daemon] Failed to fetch pending tasks:', err.message)\n      return []\n    }\n  }\n\n  /**\n   * Process a pending A2A task:\n   *   1. Try Gateway API for pre-computed LLM result\n   *   2. Call completeTask() on-chain with the owner's wallet\n   */\n  private async processPendingTask(task: A2ATask): Promise<A2ATaskResult> {\n    let gatewayOutput: string | undefined\n\n    // 1. Try Gateway API for pre-computed result\n    if (this.config.gatewayUrl) {\n      try {\n        const res = await fetch(\n          `${this.config.gatewayUrl}/api/v1/a2a/task-result/${task.taskId}`\n        )\n        if (res.ok) {\n          const data = await res.json() as any\n          if (data.status === 2 && data.output_data) {\n            gatewayOutput = data.output_data\n            console.log(`[A2A Daemon] Got result for task #${task.taskId} from Gateway`)\n          }\n        }\n      } catch (err: any) {\n        console.warn(`[A2A Daemon] Gateway unavailable for task #${task.taskId}:`, err.message)\n      }\n    }\n\n    // 2. Determine output content\n    const outputContent = gatewayOutput ||\n      `Task processed. Type: ${task.taskType}. Input: ${task.input}`\n\n    // 3. Auto-complete on-chain using owner's wallet\n    if (this.config.autoComplete) {\n      try {\n        // completeTask(taskId, output, status)\n        // status: 3=completed, 4=failed\n        const txHash = await this.config.a2a.completeTask(\n          task.taskId,\n          outputContent,\n          3  // completed\n        )\n\n        return { task, gatewayOutput, completed: true, txHash }\n      } catch (err: any) {\n        return { task, gatewayOutput, completed: false, error: err.message }\n      }\n    }\n\n    return { task, gatewayOutput, completed: false }\n  }\n}\n"],"mappings":"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","names":["generateAesKey","encryptPayload"]}