{"version":3,"file":"sse-response.mjs","names":[],"sources":["../../../../../src/v2/runtime/handlers/shared/sse-response.ts"],"sourcesContent":["import { BaseEvent } from \"@ag-ui/client\";\nimport { EventEncoder } from \"@ag-ui/encoder\";\nimport { Observable, Subscription } from \"rxjs\";\nimport { telemetry } from \"../../telemetry\";\n\ninterface CreateSseEventResponseParams {\n  request: Request;\n  observableFactory: () =>\n    | Promise<Observable<BaseEvent>>\n    | Observable<BaseEvent>;\n}\n\nexport function createSseEventResponse({\n  request,\n  observableFactory,\n}: CreateSseEventResponseParams): Response {\n  const stream = new TransformStream();\n  const writer = stream.writable.getWriter();\n  const encoder = new EventEncoder();\n  let streamClosed = false;\n\n  const closeStream = async () => {\n    if (!streamClosed) {\n      try {\n        await writer.close();\n        streamClosed = true;\n      } catch {\n        // Stream already closed.\n      }\n    }\n  };\n\n  const logError = (error: unknown) => {\n    console.error(\"Error running agent:\", error);\n    console.error(\n      \"Error stack:\",\n      error instanceof Error ? error.stack : \"No stack trace\",\n    );\n    console.error(\"Error details:\", {\n      name: error instanceof Error ? error.name : \"Unknown\",\n      message: error instanceof Error ? error.message : String(error),\n      cause: error instanceof Error ? error.cause : undefined,\n    });\n  };\n\n  let subscription: Subscription | undefined;\n\n  (async () => {\n    const observable = await observableFactory();\n\n    telemetry.capture(\"oss.runtime.agent_execution_stream_started\", {});\n\n    subscription = observable.subscribe({\n      next: async (event) => {\n        if (!request.signal.aborted && !streamClosed) {\n          try {\n            await writer.write(encoder.encode(event));\n          } catch (error) {\n            if (error instanceof Error && error.name === \"AbortError\") {\n              streamClosed = true;\n            }\n          }\n        }\n      },\n      error: async (error) => {\n        telemetry.capture(\"oss.runtime.agent_execution_stream_errored\", {\n          error: error instanceof Error ? error.message : String(error),\n        });\n        logError(error);\n        await closeStream();\n      },\n      complete: async () => {\n        telemetry.capture(\"oss.runtime.agent_execution_stream_ended\", {});\n        await closeStream();\n      },\n    });\n\n    // If the client disconnected before the subscription was created,\n    // unsubscribe immediately to avoid leaking the observable.\n    if (request.signal.aborted) {\n      subscription.unsubscribe();\n    }\n  })().catch(async (error) => {\n    logError(error);\n    await closeStream();\n  });\n\n  request.signal.addEventListener(\"abort\", () => {\n    subscription?.unsubscribe();\n  });\n\n  return new Response(stream.readable, {\n    status: 200,\n    headers: {\n      \"Content-Type\": \"text/event-stream\",\n      \"Cache-Control\": \"no-cache\",\n      Connection: \"keep-alive\",\n    },\n  });\n}\n"],"mappings":";;;;;AAYA,SAAgB,uBAAuB,EACrC,SACA,qBACyC;CACzC,MAAM,SAAS,IAAI,iBAAiB;CACpC,MAAM,SAAS,OAAO,SAAS,WAAW;CAC1C,MAAM,UAAU,IAAI,cAAc;CAClC,IAAI,eAAe;CAEnB,MAAM,cAAc,YAAY;AAC9B,MAAI,CAAC,aACH,KAAI;AACF,SAAM,OAAO,OAAO;AACpB,kBAAe;UACT;;CAMZ,MAAM,YAAY,UAAmB;AACnC,UAAQ,MAAM,wBAAwB,MAAM;AAC5C,UAAQ,MACN,gBACA,iBAAiB,QAAQ,MAAM,QAAQ,iBACxC;AACD,UAAQ,MAAM,kBAAkB;GAC9B,MAAM,iBAAiB,QAAQ,MAAM,OAAO;GAC5C,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC/D,OAAO,iBAAiB,QAAQ,MAAM,QAAQ;GAC/C,CAAC;;CAGJ,IAAI;AAEJ,EAAC,YAAY;EACX,MAAM,aAAa,MAAM,mBAAmB;AAE5C,YAAU,QAAQ,8CAA8C,EAAE,CAAC;AAEnE,iBAAe,WAAW,UAAU;GAClC,MAAM,OAAO,UAAU;AACrB,QAAI,CAAC,QAAQ,OAAO,WAAW,CAAC,aAC9B,KAAI;AACF,WAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,CAAC;aAClC,OAAO;AACd,SAAI,iBAAiB,SAAS,MAAM,SAAS,aAC3C,gBAAe;;;GAKvB,OAAO,OAAO,UAAU;AACtB,cAAU,QAAQ,8CAA8C,EAC9D,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAC9D,CAAC;AACF,aAAS,MAAM;AACf,UAAM,aAAa;;GAErB,UAAU,YAAY;AACpB,cAAU,QAAQ,4CAA4C,EAAE,CAAC;AACjE,UAAM,aAAa;;GAEtB,CAAC;AAIF,MAAI,QAAQ,OAAO,QACjB,cAAa,aAAa;KAE1B,CAAC,MAAM,OAAO,UAAU;AAC1B,WAAS,MAAM;AACf,QAAM,aAAa;GACnB;AAEF,SAAQ,OAAO,iBAAiB,eAAe;AAC7C,gBAAc,aAAa;GAC3B;AAEF,QAAO,IAAI,SAAS,OAAO,UAAU;EACnC,QAAQ;EACR,SAAS;GACP,gBAAgB;GAChB,iBAAiB;GACjB,YAAY;GACb;EACF,CAAC"}