{"version":3,"file":"hooks.mjs","names":[],"sources":["../../../../src/v2/runtime/core/hooks.ts"],"sourcesContent":["/**\n * Lifecycle hooks for CopilotKit runtime request processing.\n *\n * Hooks let you intercept requests at various stages of the pipeline:\n * - `onRequest`: Before routing — auth, correlation IDs, header injection\n * - `onBeforeHandler`: After routing — route-specific authorization\n * - `onResponse`: After handler — add headers, log, set cookies\n * - `onError`: On error — custom error responses\n *\n * @example\n * ```typescript\n * const handler = createCopilotRuntimeHandler({\n *   runtime,\n *   hooks: {\n *     onRequest: async ({ request }) => {\n *       const token = request.headers.get(\"authorization\");\n *       if (!token) throw new Response(\"Unauthorized\", { status: 401 });\n *     },\n *     onResponse: async ({ response }) => {\n *       const headers = new Headers(response.headers);\n *       headers.set(\"x-copilot-version\", \"2.0\");\n *       return new Response(response.body, { ...response, headers });\n *     },\n *   },\n * });\n * ```\n */\n\nimport type { MaybePromise } from \"@copilotkit/shared\";\nimport type { CopilotRuntimeLike } from \"./runtime\";\n\n/* ------------------------------------------------------------------------------------------------\n * Route info\n * --------------------------------------------------------------------------------------------- */\n\nexport type RouteInfo =\n  | { method: \"agent/run\"; agentId: string }\n  | { method: \"agent/connect\"; agentId: string }\n  | { method: \"agent/stop\"; agentId: string; threadId: string }\n  | { method: \"info\" }\n  | { method: \"transcribe\" }\n  | { method: \"threads/list\" }\n  | { method: \"threads/subscribe\" }\n  | { method: \"threads/update\"; threadId: string }\n  | { method: \"threads/archive\"; threadId: string }\n  | { method: \"threads/messages\"; threadId: string };\n\n/* ------------------------------------------------------------------------------------------------\n * Hook contexts\n * --------------------------------------------------------------------------------------------- */\n\nexport interface HookContext {\n  /** The incoming Fetch Request (possibly modified by prior hooks). */\n  request: Request;\n  /** The resolved URL pathname. */\n  path: string;\n  /** The CopilotRuntimeLike instance. */\n  runtime: CopilotRuntimeLike;\n}\n\nexport interface HandlerHookContext extends HookContext {\n  /** The resolved route information. */\n  route: RouteInfo;\n}\n\nexport interface ResponseHookContext extends HookContext {\n  /** The Response produced by the handler. */\n  response: Response;\n  /** The resolved route information. */\n  route: RouteInfo;\n}\n\nexport interface ErrorHookContext extends HookContext {\n  /** The error that occurred. */\n  error: unknown;\n  /** The route info, if routing had already succeeded. */\n  route?: RouteInfo;\n}\n\n/* ------------------------------------------------------------------------------------------------\n * Hooks interface\n * --------------------------------------------------------------------------------------------- */\n\nexport interface CopilotRuntimeHooks {\n  /**\n   * Called at the start of every request, before routing.\n   * Use to validate auth, attach headers, initialize correlation IDs, etc.\n   *\n   * Return a modified Request to replace the original, or void to continue.\n   * Throw a Response to short-circuit with an early response.\n   */\n  onRequest?: (ctx: HookContext) => MaybePromise<Request | void>;\n\n  /**\n   * Called after routing is resolved but before the handler executes.\n   * Receives the resolved route info (method, agentId, threadId).\n   *\n   * Use to do route-specific authorization, attach headers for agent calls, etc.\n   * Return a modified Request or void.\n   * Throw a Response to short-circuit.\n   */\n  onBeforeHandler?: (ctx: HandlerHookContext) => MaybePromise<Request | void>;\n\n  /**\n   * Called after the handler produces a Response, before it's sent to the client.\n   * Use to set cookies, add debugging headers, log, etc.\n   *\n   * Return a modified Response to replace the original, or void.\n   */\n  onResponse?: (ctx: ResponseHookContext) => MaybePromise<Response | void>;\n\n  /**\n   * Called when an error occurs during request processing.\n   * Return a Response to override the default error response, or void to use the default.\n   */\n  onError?: (ctx: ErrorHookContext) => MaybePromise<Response | void>;\n}\n\n/* ------------------------------------------------------------------------------------------------\n * Internal hook runners\n * --------------------------------------------------------------------------------------------- */\n\nexport async function runOnRequest(\n  hooks: CopilotRuntimeHooks | undefined,\n  ctx: HookContext,\n): Promise<Request> {\n  if (!hooks?.onRequest) return ctx.request;\n  const result = await hooks.onRequest(ctx);\n  return result instanceof Request ? result : ctx.request;\n}\n\nexport async function runOnBeforeHandler(\n  hooks: CopilotRuntimeHooks | undefined,\n  ctx: HandlerHookContext,\n): Promise<Request> {\n  if (!hooks?.onBeforeHandler) return ctx.request;\n  const result = await hooks.onBeforeHandler(ctx);\n  return result instanceof Request ? result : ctx.request;\n}\n\nexport async function runOnResponse(\n  hooks: CopilotRuntimeHooks | undefined,\n  ctx: ResponseHookContext,\n): Promise<Response> {\n  if (!hooks?.onResponse) return ctx.response;\n  const result = await hooks.onResponse(ctx);\n  return result instanceof Response ? result : ctx.response;\n}\n\nexport async function runOnError(\n  hooks: CopilotRuntimeHooks | undefined,\n  ctx: ErrorHookContext,\n): Promise<Response | void> {\n  if (!hooks?.onError) return;\n  return hooks.onError(ctx);\n}\n"],"mappings":";;AA0HA,eAAsB,aACpB,OACA,KACkB;AAClB,KAAI,CAAC,OAAO,UAAW,QAAO,IAAI;CAClC,MAAM,SAAS,MAAM,MAAM,UAAU,IAAI;AACzC,QAAO,kBAAkB,UAAU,SAAS,IAAI;;AAGlD,eAAsB,mBACpB,OACA,KACkB;AAClB,KAAI,CAAC,OAAO,gBAAiB,QAAO,IAAI;CACxC,MAAM,SAAS,MAAM,MAAM,gBAAgB,IAAI;AAC/C,QAAO,kBAAkB,UAAU,SAAS,IAAI;;AAGlD,eAAsB,cACpB,OACA,KACmB;AACnB,KAAI,CAAC,OAAO,WAAY,QAAO,IAAI;CACnC,MAAM,SAAS,MAAM,MAAM,WAAW,IAAI;AAC1C,QAAO,kBAAkB,WAAW,SAAS,IAAI;;AAGnD,eAAsB,WACpB,OACA,KAC0B;AAC1B,KAAI,CAAC,OAAO,QAAS;AACrB,QAAO,MAAM,QAAQ,IAAI"}