{"version":3,"file":"threads.cjs","names":["errorResponse","isIntelligenceRuntime","isHandlerResponse","resolveIntelligenceUser","isValidIdentifier"],"sources":["../../../../../src/v2/runtime/handlers/intelligence/threads.ts"],"sourcesContent":["import {\n  CopilotIntelligenceRuntimeLike,\n  CopilotRuntimeLike,\n  isIntelligenceRuntime,\n} from \"../../core/runtime\";\nimport { logger } from \"@copilotkit/shared\";\nimport { errorResponse, isHandlerResponse } from \"../shared/json-response\";\nimport { isValidIdentifier } from \"../shared/intelligence-utils\";\nimport { resolveIntelligenceUser } from \"../shared/resolve-intelligence-user\";\n\ninterface ThreadsHandlerParams {\n  runtime: CopilotRuntimeLike;\n  request: Request;\n}\n\ninterface ThreadMutationParams extends ThreadsHandlerParams {\n  threadId: string;\n}\n\ninterface ThreadMutationContext {\n  userId: string;\n  agentId: string;\n  body: Record<string, unknown>;\n}\n\nasync function parseJsonBody(\n  request: Request,\n): Promise<Record<string, unknown> | Response> {\n  try {\n    return (await request.json()) as Record<string, unknown>;\n  } catch (error) {\n    logger.error({ err: error }, \"Malformed JSON in request body\");\n    return errorResponse(\"Invalid request body\", 400);\n  }\n}\n\nfunction requireIntelligenceRuntime(\n  runtime: CopilotRuntimeLike,\n): CopilotIntelligenceRuntimeLike | Response {\n  if (!isIntelligenceRuntime(runtime)) {\n    return errorResponse(\n      \"Missing CopilotKitIntelligence configuration. Thread operations require a CopilotKitIntelligence instance to be provided in CopilotRuntime options.\",\n      422,\n    );\n  }\n\n  return runtime;\n}\n\nasync function resolveThreadMutationContext(\n  runtime: CopilotIntelligenceRuntimeLike,\n  request: Request,\n): Promise<ThreadMutationContext | Response> {\n  const body = await parseJsonBody(request);\n  if (isHandlerResponse(body)) return body;\n\n  const user = await resolveIntelligenceUser({ runtime, request });\n  if (isHandlerResponse(user)) return user;\n\n  const agentId = body.agentId;\n  if (!isValidIdentifier(agentId)) {\n    return errorResponse(\"Valid agentId is required\", 400);\n  }\n\n  return {\n    body,\n    userId: user.id,\n    agentId,\n  };\n}\n\nexport async function handleListThreads({\n  runtime,\n  request,\n}: ThreadsHandlerParams): Promise<Response> {\n  const intelligenceRuntime = requireIntelligenceRuntime(runtime);\n  if (isHandlerResponse(intelligenceRuntime)) {\n    return intelligenceRuntime;\n  }\n\n  try {\n    const url = new URL(request.url);\n    const agentId = url.searchParams.get(\"agentId\");\n    const includeArchived = url.searchParams.get(\"includeArchived\") === \"true\";\n    const limitParam = url.searchParams.get(\"limit\");\n    const cursor = url.searchParams.get(\"cursor\");\n    const user = await resolveIntelligenceUser({\n      runtime: intelligenceRuntime,\n      request,\n    });\n    if (isHandlerResponse(user)) return user;\n\n    if (!isValidIdentifier(agentId)) {\n      return errorResponse(\"Valid agentId query param is required\", 400);\n    }\n\n    const data = await intelligenceRuntime.intelligence.listThreads({\n      userId: user.id,\n      agentId,\n      ...(includeArchived ? { includeArchived: true } : {}),\n      ...(limitParam ? { limit: Number(limitParam) } : {}),\n      ...(cursor ? { cursor } : {}),\n    });\n\n    return Response.json(data);\n  } catch (error) {\n    logger.error({ err: error }, \"Error listing threads\");\n    return errorResponse(\"Failed to list threads\", 500);\n  }\n}\n\nexport async function handleUpdateThread({\n  runtime,\n  request,\n  threadId,\n}: ThreadMutationParams): Promise<Response> {\n  const intelligenceRuntime = requireIntelligenceRuntime(runtime);\n  if (isHandlerResponse(intelligenceRuntime)) {\n    return intelligenceRuntime;\n  }\n\n  try {\n    const mutation = await resolveThreadMutationContext(\n      intelligenceRuntime,\n      request,\n    );\n    if (isHandlerResponse(mutation)) return mutation;\n\n    const updates = { ...mutation.body };\n    delete updates.agentId;\n    delete updates.userId;\n\n    const thread = await intelligenceRuntime.intelligence.updateThread({\n      threadId,\n      userId: mutation.userId,\n      agentId: mutation.agentId,\n      updates,\n    });\n\n    return Response.json(thread);\n  } catch (error) {\n    logger.error({ err: error, threadId }, \"Error updating thread\");\n    return errorResponse(\"Failed to update thread\", 500);\n  }\n}\n\nexport async function handleSubscribeToThreads({\n  runtime,\n  request,\n}: ThreadsHandlerParams): Promise<Response> {\n  const intelligenceRuntime = requireIntelligenceRuntime(runtime);\n  if (isHandlerResponse(intelligenceRuntime)) {\n    return intelligenceRuntime;\n  }\n\n  try {\n    const user = await resolveIntelligenceUser({\n      runtime: intelligenceRuntime,\n      request,\n    });\n    if (isHandlerResponse(user)) return user;\n\n    const credentials =\n      await intelligenceRuntime.intelligence.ɵsubscribeToThreads({\n        userId: user.id,\n      });\n\n    return Response.json({ joinToken: credentials.joinToken });\n  } catch (error) {\n    logger.error({ err: error }, \"Error subscribing to threads\");\n    return errorResponse(\"Failed to subscribe to threads\", 500);\n  }\n}\n\nexport async function handleArchiveThread({\n  runtime,\n  request,\n  threadId,\n}: ThreadMutationParams): Promise<Response> {\n  const intelligenceRuntime = requireIntelligenceRuntime(runtime);\n  if (isHandlerResponse(intelligenceRuntime)) {\n    return intelligenceRuntime;\n  }\n\n  try {\n    const mutation = await resolveThreadMutationContext(\n      intelligenceRuntime,\n      request,\n    );\n    if (isHandlerResponse(mutation)) return mutation;\n\n    await intelligenceRuntime.intelligence.archiveThread({\n      threadId,\n      userId: mutation.userId,\n      agentId: mutation.agentId,\n    });\n\n    return Response.json({ threadId, archived: true });\n  } catch (error) {\n    logger.error({ err: error, threadId }, \"Error archiving thread\");\n    return errorResponse(\"Failed to archive thread\", 500);\n  }\n}\n\nexport async function handleDeleteThread({\n  runtime,\n  request,\n  threadId,\n}: ThreadMutationParams): Promise<Response> {\n  const intelligenceRuntime = requireIntelligenceRuntime(runtime);\n  if (isHandlerResponse(intelligenceRuntime)) {\n    return intelligenceRuntime;\n  }\n\n  try {\n    const mutation = await resolveThreadMutationContext(\n      intelligenceRuntime,\n      request,\n    );\n    if (isHandlerResponse(mutation)) return mutation;\n\n    await intelligenceRuntime.intelligence.deleteThread({\n      threadId,\n      userId: mutation.userId,\n      agentId: mutation.agentId,\n    });\n\n    return Response.json({ threadId, deleted: true });\n  } catch (error) {\n    logger.error({ err: error, threadId }, \"Error deleting thread\");\n    return errorResponse(\"Failed to delete thread\", 500);\n  }\n}\n\nexport async function handleGetThreadMessages({\n  runtime,\n  request,\n  threadId,\n}: ThreadMutationParams): Promise<Response> {\n  const intelligenceRuntime = requireIntelligenceRuntime(runtime);\n  if (isHandlerResponse(intelligenceRuntime)) {\n    return intelligenceRuntime;\n  }\n\n  try {\n    const user = await resolveIntelligenceUser({\n      runtime: intelligenceRuntime,\n      request,\n    });\n    if (isHandlerResponse(user)) return user;\n\n    const data = await intelligenceRuntime.intelligence.getThreadMessages({\n      threadId,\n    });\n\n    return Response.json(data);\n  } catch (error) {\n    logger.error({ err: error, threadId }, \"Error getting thread messages\");\n    return errorResponse(\"Failed to get thread messages\", 500);\n  }\n}\n"],"mappings":"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"}