{"version":3,"sources":["../../src/conversation/client.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// AgentX SDK — ConversationClient (remote conversation service client)\n// ---------------------------------------------------------------------------\n// Wraps the hosted Conversation Service via the Gateway:\n//   POST /api/v1/agent/runs  (SSE stream)\n//\n// Auth (either one is required):\n//   - Tenant API Key:  X-Api-Key: agentx_xxx  (issued after registration)\n//   - Gateway JWT:     Authorization: Bearer <accessToken>  (wallet-signed login)\n// Isolation: X-End-User-Id (per end-user memory isolation within a tenant)\n// ---------------------------------------------------------------------------\n\nexport interface ConversationClientConfig {\n  /** Gateway base URL, e.g. https://agentx.0xainet.top */\n  gatewayUrl: string\n  /** Tenant API Key (agentx_...) issued after registration (alternative to accessToken) */\n  apiKey?: string\n  /** Gateway JWT access token from wallet-signed login (alternative to apiKey) */\n  accessToken?: string\n  /** End-user ID for memory isolation within the tenant (optional) */\n  endUserId?: string\n  /** LLM API Key override — uses the caller's key instead of the tenant's (optional) */\n  llmApiKey?: string\n  /** LLM endpoint override for the caller's key, e.g. DeepSeek https://api.deepseek.com/v1 (optional) */\n  llmEndpoint?: string\n  /** LLM model override for the caller's key, e.g. deepseek-chat (optional; default gpt-4o) */\n  llmModel?: string\n  /** Abort timeout in ms for a single stream (default 120s) */\n  timeoutMs?: number\n}\n\nexport interface ConversationSkillDef {\n  name: string\n  description: string\n  inputSchema: Record<string, unknown>\n  execution?: {\n    type: 'mcp' | 'http' | 'a2a'\n    endpoint?: string\n    toolName?: string\n    targetAgentId?: number\n    skillFilter?: string[]\n    promptOverride?: string\n  }\n}\n\nexport interface ConversationChatParams {\n  /** AgentX agent id (omit when using inline prompt/skills mode) */\n  agentId?: number\n  message: string\n  /** Full conversation history — caller is responsible for per-end-user isolation */\n  history?: { role: 'user' | 'assistant'; content: string }[]\n  enableMemory?: boolean\n  contextBudget?: number\n  /**\n   * Per-request end-user id. For B-end (partner) callers, a `0x<wallet>` value\n   * triggers subscription proxying on the Gateway (access is authorized by that\n   * wallet's ownership/subscription). Any other value is used for memory\n   * isolation only. Overrides the constructor-level `endUserId`.\n   */\n  endUserId?: string\n  /** Inline mode: caller-supplied system prompt, bypasses Gateway agent lookup */\n  prompt?: string\n  /** Inline mode: caller-supplied tools (MCP/HTTP), injected into the run */\n  skills?: ConversationSkillDef[]\n  /** BYOK: id of a stored tenant-owned API key (resolved server-side by the Gateway) */\n  tenantKeyId?: string\n}\n\n/**\n * On-chain rail (2026-08-08): the user's own wallet must create the A2A task —\n * they pay the gas and become the on-chain client. Emitted by the Conversation\n * Service when a run requests an auditable / settled delegation.\n */\nexport interface OnChainApprovalRequest {\n  targetAgentId: number\n  taskType: string\n  inputData: string\n}\n\nexport interface ConversationSSEEvent {\n  type: 'text' | 'tool_call' | 'tool_result' | 'thinking' | 'done' | 'error' | 'clarification' | 'onchain_approval_required'\n  content?: string\n  /** Clarification question when the service decides the request needs disambiguation */\n  question?: string\n  toolName?: string\n  toolArgs?: Record<string, unknown>\n  toolResult?: unknown\n  /** Attached to tool_result when tool execution failed */\n  error?: string\n  /** On-chain rail: the agent requested an A2A delegation the user must approve in their wallet */\n  approval?: OnChainApprovalRequest\n  usage?: { promptTokens: number; completionTokens: number; totalTokens: number }\n  iterations?: number\n  /** Billing source of the LLM that produced this run (emitted on `done`).\n   *  'byok' → caller's own key (not metered); 'platform' → AgentX key (metered\n   *  against the tenant's plan quota). Observability only — metering is server-side. */\n  llmSource?: 'byok' | 'platform'\n}\n\nexport interface ConversationChatResult {\n  text: string\n  toolCalls: { name: string; arguments: Record<string, unknown>; result?: unknown }[]\n  /** When set, the service asked the user to clarify instead of running the run */\n  clarification?: string\n  usage?: { promptTokens: number; completionTokens: number; totalTokens: number }\n  iterations?: number\n}\n\n// ── Tasks (parallel runs, P8) ─────────────────────────────────────────────\n\nexport type ConversationTaskStatus = 'queued' | 'running' | 'done' | 'error' | 'cancelled'\n\nexport interface ConversationTask {\n  id: string\n  sessionId: string\n  tenant: string\n  agentId?: number | null\n  endUserId?: string | null\n  message: string\n  status: ConversationTaskStatus\n  enableMemory: boolean\n  history?: unknown\n  prompt?: string | null\n  skills?: unknown\n  result?: string | null\n  error?: string | null\n  usage?: unknown\n  iterations?: number | null\n  createdAt: string\n  startedAt?: string | null\n  finishedAt?: string | null\n}\n\nexport interface ConversationCreateTaskParams {\n  sessionId: string\n  /** AgentX agent id (omit when using inline prompt/skills mode) */\n  agentId?: number\n  message: string\n  enableMemory?: boolean\n  /** Full conversation history (optional) */\n  history?: { role: 'user' | 'assistant'; content: string }[]\n  /** Inline mode: caller-supplied system prompt */\n  prompt?: string\n  /** Inline mode: caller-supplied tools */\n  skills?: ConversationSkillDef[]\n  /** BYOK: id of a stored tenant-owned API key */\n  tenantKeyId?: string\n  /**\n   * Per-request end-user id. For B-end (partner) callers, a `0x<wallet>` value\n   * triggers subscription proxying on the Gateway (access is authorized by that\n   * wallet's ownership/subscription). Any other value is used for memory\n   * isolation only.\n   */\n  endUserId?: string\n}\n\nexport interface ConversationCreateSessionParams {\n  sessionId?: string\n  agentId?: number\n  endUserId?: string\n  title?: string\n}\n\n/**\n * Thrown by task APIs when the platform rejects the request.\n * `code === 'PARALLEL_TASKS_DISABLED'` (HTTP 403) means the integrator/tenant\n * is configured to disallow multi-task / sub-agent (P9).\n */\nexport class ConversationTaskError extends Error {\n  readonly status: number\n  readonly code?: string\n  constructor(status: number, message: string, code?: string) {\n    super(message)\n    this.name = 'ConversationTaskError'\n    this.status = status\n    this.code = code\n  }\n}\n\n// ── A2A delegated tasks & Session Key auto-pay (AItrader REQ-1/2/3) ────────\n\n/** `a2a_task_results.status` values (Gateway worker). */\nexport const A2A_STATUS = {\n  PROCESSING: 1,\n  DONE: 2,\n  ERROR: 3,\n  AWAITING_PAYMENT: 4,\n} as const\n\n/** A2A delegated-task row as stored in `a2a_task_results` (GET /api/v1/a2a/task-result/:id). */\nexport interface A2ADelegatedTaskResult {\n  task_id: number\n  status: number\n  agent_id?: number | null\n  output_data?: string | null\n  error_message?: string | null\n  payment_payer?: string | null\n  payment_pay_to?: string | null\n  payment_amount_wei?: string | null\n  payment_target_agent_id?: number | null\n  payment_ref?: string | null\n  payment_pending_since?: string | null\n  /** Payment options offered while `status === A2A_STATUS.AWAITING_PAYMENT` (REQ-2). */\n  payment_pay_options?: { prepay: boolean; sessionKey: boolean } | null\n  created_at?: string\n  updated_at?: string\n}\n\n/** Session Key engine capability info (GET /api/v1/a2a/session-key/info). */\nexport interface SessionKeyInfo {\n  enabled: boolean\n  chain: string\n  chainId: number\n  baseUrl: string\n}\n\n/** Session Key authorization status for an end-user wallet (REQ-3, from billing/balance). */\nexport interface SessionKeyAuthStatus {\n  enabled: boolean\n  authorized: boolean\n  sessionAddress?: string\n  maxPerTx?: string\n  maxTotal?: string\n  totalSpent?: string\n  validUntil?: string\n}\n\n/** x402 ledger balance (GET /api/v1/billing/balance). */\nexport interface BillingBalance {\n  balance: string\n  balanceWei: string\n  currency: string\n  updatedAt?: string | null\n  subject: string\n  payTo?: string\n  priceWei?: string\n  sessionKey?: SessionKeyAuthStatus\n}\n\nexport class ConversationClient {\n  private readonly baseUrl: string\n\n  constructor(private readonly config: ConversationClientConfig) {\n    this.baseUrl = config.gatewayUrl.replace(/\\/$/, '')\n  }\n\n  /** Common auth/tenant headers for all Gateway API calls. */\n  private _headers(): Record<string, string> {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n    }\n    if (this.config.apiKey) headers['X-Api-Key'] = this.config.apiKey\n    if (this.config.accessToken) headers['Authorization'] = `Bearer ${this.config.accessToken}`\n    if (!this.config.apiKey && !this.config.accessToken) {\n      throw new Error('ConversationClient requires either apiKey or accessToken')\n    }\n    if (this.config.endUserId) headers['X-End-User-Id'] = this.config.endUserId\n    if (this.config.llmApiKey) headers['X-Llm-Api-Key'] = this.config.llmApiKey\n    if (this.config.llmEndpoint) headers['X-Llm-Endpoint'] = this.config.llmEndpoint\n    if (this.config.llmModel) headers['X-Llm-Model'] = this.config.llmModel\n    return headers\n  }\n\n  /**\n   * Stream an agent conversation (SSE). Yields parsed events.\n   * @param opts.signal external AbortSignal — aborts the stream (e.g. user \"stop\")\n   */\n  async *stream(params: ConversationChatParams, opts?: { signal?: AbortSignal }): AsyncGenerator<ConversationSSEEvent> {\n    const headers = this._headers()\n    if (params.endUserId) headers['X-End-User-Id'] = params.endUserId\n\n    const controller = new AbortController()\n    const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs ?? 120_000)\n    const onExternalAbort = () => controller.abort()\n    opts?.signal?.addEventListener('abort', onExternalAbort, { once: true })\n\n    try {\n      const res = await fetch(`${this.baseUrl}/api/v1/agent/runs`, {\n        method: 'POST',\n        headers,\n        body: JSON.stringify(params),\n        signal: controller.signal,\n      })\n\n      if (!res.ok) {\n        let detail = ''\n        try {\n          const body = await res.json()\n          detail = body?.error ?? ''\n        } catch {}\n        throw new Error(`Conversation request failed (HTTP ${res.status}) ${detail}`.trim())\n      }\n\n      if (!res.body) {\n        throw new Error('Conversation stream unavailable')\n      }\n\n      const reader = res.body.getReader()\n      const decoder = new TextDecoder()\n      let buffer = ''\n\n      while (true) {\n        const { done, value } = await reader.read()\n        if (done) break\n\n        buffer += decoder.decode(value, { stream: true })\n        const chunks = buffer.split('\\n\\n')\n        buffer = chunks.pop() ?? ''\n\n        for (const chunk of chunks) {\n          for (const line of chunk.split('\\n')) {\n            if (!line.startsWith('data: ')) continue\n            try {\n              const event = JSON.parse(line.slice(6)) as ConversationSSEEvent\n              yield event\n              if (event.type === 'error') {\n                throw new Error(event.error || 'Conversation error')\n              }\n            } catch (err) {\n              if (err instanceof SyntaxError) continue\n              throw err\n            }\n          }\n        }\n      }\n    } finally {\n      clearTimeout(timeout)\n      opts?.signal?.removeEventListener('abort', onExternalAbort)\n    }\n  }\n\n  /**\n   * Run a conversation and collect the full result.\n   */\n  async chat(params: ConversationChatParams): Promise<ConversationChatResult> {\n    const result: ConversationChatResult = { text: '', toolCalls: [] }\n\n    for await (const event of this.stream(params)) {\n      switch (event.type) {\n        case 'text':\n          result.text += event.content ?? ''\n          break\n        case 'tool_call':\n          result.toolCalls.push({ name: event.toolName ?? '', arguments: event.toolArgs ?? {} })\n          break\n        case 'tool_result': {\n          const last = result.toolCalls[result.toolCalls.length - 1]\n          if (last) {\n            last.result = event.toolResult\n          }\n          break\n        }\n        case 'clarification':\n          result.clarification = event.question ?? ''\n          break\n        case 'done':\n          result.usage = event.usage\n          result.iterations = event.iterations\n          break\n      }\n    }\n\n    return result\n  }\n\n  // ── Sessions & Tasks (parallel runs) ────────────────────────────────────\n\n  /**\n   * Query the integrator's capability flags (P9). When `parallelTasks` is false,\n   * `createTask` will be rejected with HTTP 403 `PARALLEL_TASKS_DISABLED` —\n   * callers should degrade to single-turn `chat()` in that case.\n   */\n  async getCapabilities(): Promise<{ parallelTasks: boolean; parallelTasksOverride: boolean | null }> {\n    const res = await fetch(`${this.baseUrl}/api/v1/tenant/me`, { headers: this._headers() })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(res.status, body?.error || `Capability lookup failed (HTTP ${res.status})`)\n    }\n    return {\n      parallelTasks: body?.capabilities?.parallel_tasks ?? true,\n      parallelTasksOverride: body?.capabilities?.parallel_tasks_override ?? null,\n    }\n  }\n\n  /**\n   * Create a session (dialog container that owns many tasks). Idempotent.\n   */\n  async createSession(params: ConversationCreateSessionParams): Promise<{ id: string; tenant: string; agentId?: number | null; endUserId?: string | null; title?: string | null }> {\n    const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n      method: 'POST',\n      headers: this._headers(),\n      body: JSON.stringify(params),\n    })\n    if (!res.ok) {\n      throw new ConversationTaskError(res.status, `Session creation failed (HTTP ${res.status})`)\n    }\n    return res.json()\n  }\n\n  /**\n   * Create a task — returns immediately with the task row (`status: queued`);\n   * execution happens in the background. Throws `ConversationTaskError` with\n   * `code === 'PARALLEL_TASKS_DISABLED'` (HTTP 403) when the tenant/plan is\n   * configured to disallow multi-task / sub-agent.\n   */\n  async createTask(params: ConversationCreateTaskParams): Promise<ConversationTask> {\n    const headers = this._headers()\n    if (params.endUserId) headers['X-End-User-Id'] = params.endUserId\n    const res = await fetch(`${this.baseUrl}/api/v1/sessions/${params.sessionId}/tasks`, {\n      method: 'POST',\n      headers,\n      body: JSON.stringify(params),\n    })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(\n        res.status,\n        body?.error || `Task creation failed (HTTP ${res.status})`,\n        body?.code,\n      )\n    }\n    return body as ConversationTask\n  }\n\n  /** Fetch a single task by id. */\n  async getTask(taskId: string): Promise<ConversationTask> {\n    const res = await fetch(`${this.baseUrl}/api/v1/tasks/${taskId}`, { headers: this._headers() })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(res.status, body?.error || `Task lookup failed (HTTP ${res.status})`, body?.code)\n    }\n    return body as ConversationTask\n  }\n\n  /** List tasks of a session. */\n  async listTasks(sessionId: string): Promise<ConversationTask[]> {\n    const res = await fetch(`${this.baseUrl}/api/v1/sessions/${sessionId}/tasks`, { headers: this._headers() })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(res.status, body?.error || `Task list failed (HTTP ${res.status})`, body?.code)\n    }\n    return (body.tasks ?? []) as ConversationTask[]\n  }\n\n  /** Cancel a task (queued → cancelled directly, running → aborted). */\n  async cancelTask(taskId: string): Promise<ConversationTask> {\n    const res = await fetch(`${this.baseUrl}/api/v1/tasks/${taskId}`, {\n      method: 'DELETE',\n      headers: this._headers(),\n    })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(res.status, body?.error || `Task cancel failed (HTTP ${res.status})`, body?.code)\n    }\n    return body as ConversationTask\n  }\n\n  // ── A2A delegated tasks & Session Key auto-pay (AItrader REQ-1/2/3) ─────\n\n  /** Fetch an A2A delegated-task result row (`a2a_task_results`). */\n  async getA2ATaskResult(taskId: string | number): Promise<A2ADelegatedTaskResult> {\n    const res = await fetch(`${this.baseUrl}/api/v1/a2a/task-result/${taskId}`, { headers: this._headers() })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(\n        res.status,\n        body?.error || `A2A task result lookup failed (HTTP ${res.status})`,\n        body?.code,\n      )\n    }\n    return body as A2ADelegatedTaskResult\n  }\n\n  /**\n   * Re-activate an `awaiting_payment` A2A task after the end user has\n   * authorized (and funded) a Session Key. Does NOT deduct from the ledger —\n   * the worker re-runs and auto-pays via the session-key branch. The client\n   * must be configured with `endUserId` = the task's `payment_payer` (or the\n   * caller holds an admin key).\n   */\n  async retryA2ATask(taskId: string | number): Promise<{ retried: boolean; taskId: number }> {\n    const res = await fetch(`${this.baseUrl}/api/v1/a2a/tasks/${taskId}/retry`, {\n      method: 'POST',\n      headers: this._headers(),\n    })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(\n        res.status,\n        body?.error || `A2A task retry failed (HTTP ${res.status})`,\n        body?.code,\n      )\n    }\n    return body as { retried: boolean; taskId: number }\n  }\n\n  /**\n   * Session Key engine capability info — used by an end-user frontend to reach\n   * the engine's public `nonce` / `createSession` endpoints directly\n   * (EIP-712-verified; the session private key never transits the Gateway).\n   */\n  async getSessionKeyInfo(): Promise<SessionKeyInfo> {\n    const res = await fetch(`${this.baseUrl}/api/v1/a2a/session-key/info`, { headers: this._headers() })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(\n        res.status,\n        body?.error || `Session-key info lookup failed (HTTP ${res.status})`,\n        body?.code,\n      )\n    }\n    return body as SessionKeyInfo\n  }\n\n  /** x402 ledger balance + Session Key authorization status (REQ-3). */\n  async getBalance(): Promise<BillingBalance> {\n    const res = await fetch(`${this.baseUrl}/api/v1/billing/balance`, { headers: this._headers() })\n    const body = await res.json().catch(() => ({}))\n    if (!res.ok) {\n      throw new ConversationTaskError(\n        res.status,\n        body?.error || `Balance lookup failed (HTTP ${res.status})`,\n        body?.code,\n      )\n    }\n    return body as BillingBalance\n  }\n}\n"],"mappings":"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","names":[]}