{"version":3,"file":"run.cjs","names":["resolveIntelligenceUser","isHandlerResponse","generateThreadNameForNewThread","EventType"],"sources":["../../../../../src/v2/runtime/handlers/intelligence/run.ts"],"sourcesContent":["import type {\n  AbstractAgent,\n  BaseEvent,\n  Message,\n  RunAgentInput,\n} from \"@ag-ui/client\";\nimport { EventType } from \"@ag-ui/client\";\nimport type { CopilotIntelligenceRuntimeLike } from \"../../core/runtime\";\nimport { generateThreadNameForNewThread } from \"./thread-names\";\nimport { logger } from \"@copilotkit/shared\";\nimport { telemetry } from \"../../telemetry\";\nimport { resolveIntelligenceUser } from \"../shared/resolve-intelligence-user\";\nimport { isHandlerResponse } from \"../shared/json-response\";\nimport type { AgentRunnerRunRequest } from \"../../runner/agent-runner\";\nimport type { Observable } from \"rxjs\";\n\n/**\n * Builds browser-facing realtime connection metadata owned by the runtime.\n */\nfunction buildRealtimeConnectionInfo(params: {\n  clientUrl: string;\n  threadId: string;\n}): { clientUrl: string; topic: string } {\n  return {\n    clientUrl: params.clientUrl,\n    topic: `thread:${params.threadId}`,\n  };\n}\n\ninterface RunnerStartupBoundary {\n  events: Observable<BaseEvent>;\n  startup: Promise<void>;\n}\n\ninterface RunnerWithStartupBoundary {\n  runWithStartupBoundary(request: AgentRunnerRunRequest): RunnerStartupBoundary;\n}\n\nfunction hasRunnerStartupBoundary(\n  runner: CopilotIntelligenceRuntimeLike[\"runner\"],\n): runner is CopilotIntelligenceRuntimeLike[\"runner\"] &\n  RunnerWithStartupBoundary {\n  const candidate = runner as { runWithStartupBoundary?: unknown };\n\n  return (\n    typeof candidate.runWithStartupBoundary === \"function\" &&\n    (Object.prototype.hasOwnProperty.call(runner, \"runWithStartupBoundary\") ||\n      Object.prototype.hasOwnProperty.call(runner, \"threads\"))\n  );\n}\n\ninterface HandleIntelligenceRunParams {\n  runtime: CopilotIntelligenceRuntimeLike;\n  request: Request;\n  agentId: string;\n  agent: AbstractAgent;\n  input: RunAgentInput;\n}\n\nexport async function handleIntelligenceRun({\n  runtime,\n  request,\n  agentId,\n  agent,\n  input,\n}: HandleIntelligenceRunParams): Promise<Response> {\n  if (!runtime.intelligence) {\n    return Response.json(\n      {\n        error: \"Intelligence not configured\",\n        message: \"Intelligence mode requires a CopilotKitIntelligence\",\n      },\n      { status: 500 },\n    );\n  }\n\n  const user = await resolveIntelligenceUser({ runtime, request });\n  if (isHandlerResponse(user)) {\n    return user;\n  }\n  const userId = user.id;\n\n  try {\n    const { thread, created } = await runtime.intelligence.getOrCreateThread({\n      threadId: input.threadId,\n      userId,\n      agentId,\n    });\n\n    if (created && runtime.generateThreadNames && !thread.name?.trim()) {\n      void generateThreadNameForNewThread({\n        runtime,\n        request,\n        agentId,\n        sourceInput: input,\n        thread,\n        userId,\n      }).catch((nameError) => {\n        logger.error(\"Failed to generate thread name:\", nameError);\n      });\n    }\n  } catch (error) {\n    logger.error(\"Failed to get or create thread:\", error);\n    return Response.json(\n      {\n        error: \"Failed to initialize thread\",\n      },\n      { status: 502 },\n    );\n  }\n\n  let canonicalThreadId = input.threadId;\n  let canonicalRunId = input.runId;\n  let joinToken: string | undefined;\n  try {\n    const lockResult = await runtime.intelligence.ɵacquireThreadLock({\n      threadId: input.threadId,\n      runId: input.runId,\n      userId,\n      agentId,\n      ...(runtime.lockKeyPrefix !== undefined\n        ? { lockKeyPrefix: runtime.lockKeyPrefix }\n        : {}),\n      ttlSeconds: runtime.lockTtlSeconds,\n    });\n    canonicalThreadId = lockResult.threadId;\n    canonicalRunId = lockResult.runId;\n    joinToken = lockResult.joinToken;\n  } catch (error) {\n    logger.error(\"Thread lock denied:\", error);\n    return Response.json(\n      {\n        error: \"Thread lock denied\",\n      },\n      { status: 409 },\n    );\n  }\n\n  const cleanupLock = (reason: string): Promise<void> =>\n    runtime.intelligence\n      .ɵcleanupThreadLock({\n        threadId: canonicalThreadId || input.threadId,\n        runId: canonicalRunId || input.runId,\n      })\n      .catch((cleanupError) => {\n        logger.error(\n          { err: cleanupError, reason },\n          \"Failed to cleanup thread lock\",\n        );\n      });\n\n  if (!canonicalThreadId || !canonicalRunId || !joinToken) {\n    await cleanupLock(\"malformed-lock-response\");\n    return Response.json(\n      {\n        error: \"Run connection credentials not available\",\n        message:\n          \"Intelligence platform did not return canonical threadId, runId, and joinToken\",\n      },\n      { status: 502 },\n    );\n  }\n\n  // When Intelligence has `mcpServer: true`, hand the agent the per-request\n  // bits it needs to attach the platform's MCP server: the resolved user-id,\n  // the project Bearer (`apiKey`), and the MCP URL. These ride through\n  // `forwardedProps.auth.copilotkitIntelligence` so the agent doesn't need a\n  // typed reference to the Intelligence client. `BuiltInAgent` reads the\n  // bag and builds a per-request MCP config with a closure-baked fetch;\n  // non-BuiltInAgent agents naturally ignore the key. The `auth` namespace\n  // is the convention for credentials that downstream redaction policies\n  // strip before durable storage and FE replay.\n  const upstreamAuth =\n    (input.forwardedProps as { auth?: Record<string, unknown> } | undefined)\n      ?.auth ?? {};\n  const copilotkitIntelligenceAuth =\n    runtime.intelligence.ɵisMcpServerEnabled?.()\n      ? {\n          copilotkitIntelligence: {\n            userId,\n            apiKey: runtime.intelligence.ɵgetApiKey(),\n            mcpUrl: `${runtime.intelligence.ɵgetApiUrl()}/mcp`,\n          },\n        }\n      : {};\n  const mergedAuth = { ...upstreamAuth, ...copilotkitIntelligenceAuth };\n\n  const canonicalInput: RunAgentInput = {\n    ...input,\n    threadId: canonicalThreadId,\n    runId: canonicalRunId,\n    forwardedProps: {\n      ...input.forwardedProps,\n      ...(Object.keys(mergedAuth).length > 0 ? { auth: mergedAuth } : {}),\n    },\n  };\n\n  let persistedInputMessages: Message[] | undefined;\n  if (Array.isArray(input.messages)) {\n    try {\n      const history = await runtime.intelligence.getThreadMessages({\n        threadId: canonicalThreadId,\n      });\n      const historicMessageIds = new Set(\n        history.messages.map((message) => message.id),\n      );\n      persistedInputMessages = input.messages.filter(\n        (message) => !historicMessageIds.has(message.id),\n      );\n    } catch (error) {\n      logger.error(\"Thread history lookup failed:\", error);\n      await cleanupLock(\"thread-history-lookup-failed\");\n      return Response.json(\n        {\n          error: \"Thread history lookup failed\",\n        },\n        { status: 502 },\n      );\n    }\n  }\n\n  telemetry.capture(\"oss.runtime.agent_execution_stream_started\", {});\n\n  // Start heartbeat timer to renew the thread lock.\n  let heartbeatTimer: ReturnType<typeof setInterval> | undefined;\n  heartbeatTimer = setInterval(() => {\n    runtime.intelligence\n      .ɵrenewThreadLock({\n        threadId: canonicalThreadId,\n        runId: canonicalRunId,\n        ttlSeconds: runtime.lockTtlSeconds,\n        ...(runtime.lockKeyPrefix !== undefined\n          ? { lockKeyPrefix: runtime.lockKeyPrefix }\n          : {}),\n      })\n      .catch((err) => {\n        logger.error(\"Failed to renew thread lock:\", err);\n        clearHeartbeat();\n        try {\n          agent.abortRun();\n        } catch (abortError) {\n          logger.error(\n            \"Failed to abort agent after lock renewal failure:\",\n            abortError,\n          );\n        }\n      });\n  }, runtime.lockHeartbeatIntervalSeconds * 1_000);\n\n  const clearHeartbeat = () => {\n    if (heartbeatTimer !== undefined) {\n      clearInterval(heartbeatTimer);\n      heartbeatTimer = undefined;\n    }\n  };\n\n  const runStarted = { current: false };\n  let immediateStartupErrorMessage: string | undefined;\n  let immediateStartupCleanup: Promise<void> | undefined;\n\n  const runRequest: AgentRunnerRunRequest = {\n    threadId: canonicalThreadId,\n    agent,\n    input: canonicalInput,\n    ...(persistedInputMessages !== undefined ? { persistedInputMessages } : {}),\n  };\n\n  try {\n    const runStart = hasRunnerStartupBoundary(runtime.runner)\n      ? runtime.runner.runWithStartupBoundary(runRequest)\n      : {\n          events: runtime.runner.run(runRequest),\n          startup: Promise.resolve(),\n        };\n\n    runStart.events.subscribe({\n      next: (event: BaseEvent) => {\n        if (event.type === EventType.RUN_STARTED) {\n          runStarted.current = true;\n        }\n        if (event.type === EventType.RUN_ERROR && !runStarted.current) {\n          clearHeartbeat();\n          immediateStartupErrorMessage =\n            \"message\" in event && typeof event.message === \"string\"\n              ? event.message\n              : \"Runner failed before the run started\";\n          immediateStartupCleanup = cleanupLock(\"runner-start-failed\");\n        }\n      },\n      error: (error) => {\n        clearHeartbeat();\n        if (!runStarted.current) {\n          immediateStartupErrorMessage =\n            error instanceof Error ? error.message : String(error);\n          immediateStartupCleanup = cleanupLock(\"runner-start-error\");\n        } else {\n          cleanupLock(\"runner-error\");\n        }\n        telemetry.capture(\"oss.runtime.agent_execution_stream_errored\", {\n          error: error instanceof Error ? error.message : String(error),\n        });\n        logger.error(\"Error running agent:\", error);\n      },\n      complete: () => {\n        clearHeartbeat();\n        telemetry.capture(\"oss.runtime.agent_execution_stream_ended\", {});\n      },\n    });\n\n    await runStart.startup;\n  } catch (error) {\n    clearHeartbeat();\n    await (immediateStartupCleanup ?? cleanupLock(\"runner-start-threw\"));\n    logger.error(\"Error starting agent runner:\", error);\n    return Response.json(\n      {\n        error: \"Failed to start runner\",\n        message: error instanceof Error ? error.message : String(error),\n      },\n      { status: 502 },\n    );\n  }\n\n  if (immediateStartupErrorMessage) {\n    await immediateStartupCleanup;\n    return Response.json(\n      {\n        error: \"Failed to start runner\",\n        message: immediateStartupErrorMessage,\n      },\n      { status: 502 },\n    );\n  }\n\n  // IntelligenceAgentRunner resolves this boundary after Phoenix channel join.\n  // Other runner implementations fall back to construction/subscription errors.\n  return Response.json(\n    {\n      threadId: canonicalThreadId,\n      runId: canonicalRunId,\n      joinToken,\n      realtime: buildRealtimeConnectionInfo({\n        clientUrl: runtime.intelligence.ɵgetClientWsUrl(),\n        threadId: canonicalThreadId,\n      }),\n    },\n    {\n      headers: { \"Cache-Control\": \"no-cache\" },\n    },\n  );\n}\n"],"mappings":"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"}