@copilotkit/runtime 1.80.0 → 1.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +15 -1
  2. package/dist/agent/index.cjs +10 -7
  3. package/dist/agent/index.cjs.map +1 -1
  4. package/dist/agent/index.d.cts +1 -1
  5. package/dist/agent/index.d.cts.map +1 -1
  6. package/dist/agent/index.d.mts.map +1 -1
  7. package/dist/agent/index.mjs +10 -7
  8. package/dist/agent/index.mjs.map +1 -1
  9. package/dist/lib/runtime/copilot-runtime.cjs +17 -2
  10. package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
  11. package/dist/lib/runtime/copilot-runtime.d.cts +2 -2
  12. package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
  13. package/dist/lib/runtime/copilot-runtime.d.mts +2 -2
  14. package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
  15. package/dist/lib/runtime/copilot-runtime.mjs +18 -3
  16. package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
  17. package/dist/lib/runtime/legacy-service-adapter-agent.cjs +360 -0
  18. package/dist/lib/runtime/legacy-service-adapter-agent.cjs.map +1 -0
  19. package/dist/lib/runtime/legacy-service-adapter-agent.mjs +359 -0
  20. package/dist/lib/runtime/legacy-service-adapter-agent.mjs.map +1 -0
  21. package/dist/lib/runtime/telemetry-agent-runner.cjs +1 -1
  22. package/dist/lib/runtime/telemetry-agent-runner.cjs.map +1 -1
  23. package/dist/lib/runtime/telemetry-agent-runner.d.cts.map +1 -1
  24. package/dist/lib/runtime/telemetry-agent-runner.d.mts.map +1 -1
  25. package/dist/lib/runtime/telemetry-agent-runner.mjs +1 -1
  26. package/dist/lib/runtime/telemetry-agent-runner.mjs.map +1 -1
  27. package/dist/lib/telemetry-client.cjs +12 -1
  28. package/dist/lib/telemetry-client.cjs.map +1 -1
  29. package/dist/lib/telemetry-client.mjs +12 -1
  30. package/dist/lib/telemetry-client.mjs.map +1 -1
  31. package/dist/package.cjs +2 -2
  32. package/dist/package.mjs +2 -2
  33. package/dist/service-adapters/events.cjs +91 -0
  34. package/dist/service-adapters/events.cjs.map +1 -1
  35. package/dist/service-adapters/events.d.cts +6 -1
  36. package/dist/service-adapters/events.d.cts.map +1 -1
  37. package/dist/service-adapters/events.d.mts +6 -1
  38. package/dist/service-adapters/events.d.mts.map +1 -1
  39. package/dist/service-adapters/events.mjs +90 -1
  40. package/dist/service-adapters/events.mjs.map +1 -1
  41. package/dist/service-adapters/langchain/langchain-adapter.cjs +1 -1
  42. package/dist/service-adapters/langchain/langchain-adapter.cjs.map +1 -1
  43. package/dist/service-adapters/langchain/langchain-adapter.d.cts.map +1 -1
  44. package/dist/service-adapters/langchain/langchain-adapter.d.mts.map +1 -1
  45. package/dist/service-adapters/langchain/langchain-adapter.mjs +2 -2
  46. package/dist/service-adapters/langchain/langchain-adapter.mjs.map +1 -1
  47. package/dist/service-adapters/langchain/utils.cjs +53 -15
  48. package/dist/service-adapters/langchain/utils.cjs.map +1 -1
  49. package/dist/service-adapters/langchain/utils.mjs +53 -16
  50. package/dist/service-adapters/langchain/utils.mjs.map +1 -1
  51. package/dist/v2/index.cjs +5 -0
  52. package/dist/v2/index.d.cts +5 -2
  53. package/dist/v2/index.d.mts +5 -2
  54. package/dist/v2/index.mjs +4 -2
  55. package/dist/v2/runtime/core/channel-manager.cjs +1 -0
  56. package/dist/v2/runtime/core/channel-manager.cjs.map +1 -1
  57. package/dist/v2/runtime/core/channel-manager.mjs +1 -0
  58. package/dist/v2/runtime/core/channel-manager.mjs.map +1 -1
  59. package/dist/v2/runtime/core/fetch-handler.cjs +1 -1
  60. package/dist/v2/runtime/core/fetch-handler.cjs.map +1 -1
  61. package/dist/v2/runtime/core/fetch-handler.mjs +1 -1
  62. package/dist/v2/runtime/core/fetch-handler.mjs.map +1 -1
  63. package/dist/v2/runtime/core/package-info.cjs +1 -1
  64. package/dist/v2/runtime/core/package-info.mjs +1 -1
  65. package/dist/v2/runtime/core/runtime.cjs +5 -1
  66. package/dist/v2/runtime/core/runtime.cjs.map +1 -1
  67. package/dist/v2/runtime/core/runtime.d.cts +15 -0
  68. package/dist/v2/runtime/core/runtime.d.cts.map +1 -1
  69. package/dist/v2/runtime/core/runtime.d.mts +15 -0
  70. package/dist/v2/runtime/core/runtime.d.mts.map +1 -1
  71. package/dist/v2/runtime/core/runtime.mjs +5 -1
  72. package/dist/v2/runtime/core/runtime.mjs.map +1 -1
  73. package/dist/v2/runtime/endpoints/express.cjs +2 -2
  74. package/dist/v2/runtime/endpoints/express.cjs.map +1 -1
  75. package/dist/v2/runtime/endpoints/express.mjs +2 -2
  76. package/dist/v2/runtime/endpoints/express.mjs.map +1 -1
  77. package/dist/v2/runtime/endpoints/node-fetch-handler.cjs +51 -1
  78. package/dist/v2/runtime/endpoints/node-fetch-handler.cjs.map +1 -1
  79. package/dist/v2/runtime/endpoints/node-fetch-handler.d.cts.map +1 -1
  80. package/dist/v2/runtime/endpoints/node-fetch-handler.d.mts.map +1 -1
  81. package/dist/v2/runtime/endpoints/node-fetch-handler.mjs +52 -2
  82. package/dist/v2/runtime/endpoints/node-fetch-handler.mjs.map +1 -1
  83. package/dist/v2/runtime/generative-ui/generative-ui-middleware.cjs +394 -0
  84. package/dist/v2/runtime/generative-ui/generative-ui-middleware.cjs.map +1 -0
  85. package/dist/v2/runtime/generative-ui/generative-ui-middleware.d.cts +21 -0
  86. package/dist/v2/runtime/generative-ui/generative-ui-middleware.d.cts.map +1 -0
  87. package/dist/v2/runtime/generative-ui/generative-ui-middleware.d.mts +21 -0
  88. package/dist/v2/runtime/generative-ui/generative-ui-middleware.d.mts.map +1 -0
  89. package/dist/v2/runtime/generative-ui/generative-ui-middleware.mjs +393 -0
  90. package/dist/v2/runtime/generative-ui/generative-ui-middleware.mjs.map +1 -0
  91. package/dist/v2/runtime/generative-ui/index.d.cts +3 -0
  92. package/dist/v2/runtime/generative-ui/index.d.mts +3 -0
  93. package/dist/v2/runtime/generative-ui/surface-writer.cjs +86 -0
  94. package/dist/v2/runtime/generative-ui/surface-writer.cjs.map +1 -0
  95. package/dist/v2/runtime/generative-ui/surface-writer.d.cts +33 -0
  96. package/dist/v2/runtime/generative-ui/surface-writer.d.cts.map +1 -0
  97. package/dist/v2/runtime/generative-ui/surface-writer.d.mts +33 -0
  98. package/dist/v2/runtime/generative-ui/surface-writer.d.mts.map +1 -0
  99. package/dist/v2/runtime/generative-ui/surface-writer.mjs +85 -0
  100. package/dist/v2/runtime/generative-ui/surface-writer.mjs.map +1 -0
  101. package/dist/v2/runtime/handlers/handle-run.cjs +8 -3
  102. package/dist/v2/runtime/handlers/handle-run.cjs.map +1 -1
  103. package/dist/v2/runtime/handlers/handle-run.mjs +5 -1
  104. package/dist/v2/runtime/handlers/handle-run.mjs.map +1 -1
  105. package/dist/v2/runtime/handlers/intelligence/run.cjs +3 -0
  106. package/dist/v2/runtime/handlers/intelligence/run.cjs.map +1 -1
  107. package/dist/v2/runtime/handlers/intelligence/run.mjs +3 -0
  108. package/dist/v2/runtime/handlers/intelligence/run.mjs.map +1 -1
  109. package/dist/v2/runtime/handlers/shared/agent-utils.cjs +7 -0
  110. package/dist/v2/runtime/handlers/shared/agent-utils.cjs.map +1 -1
  111. package/dist/v2/runtime/handlers/shared/agent-utils.mjs +7 -0
  112. package/dist/v2/runtime/handlers/shared/agent-utils.mjs.map +1 -1
  113. package/dist/v2/runtime/handlers/shared/mcp-apps-servers.cjs +2 -1
  114. package/dist/v2/runtime/handlers/shared/mcp-apps-servers.cjs.map +1 -1
  115. package/dist/v2/runtime/handlers/shared/mcp-apps-servers.mjs +3 -1
  116. package/dist/v2/runtime/handlers/shared/mcp-apps-servers.mjs.map +1 -1
  117. package/dist/v2/runtime/handlers/shared/sse-response.cjs +1 -1
  118. package/dist/v2/runtime/handlers/shared/sse-response.cjs.map +1 -1
  119. package/dist/v2/runtime/handlers/shared/sse-response.mjs +1 -1
  120. package/dist/v2/runtime/handlers/shared/sse-response.mjs.map +1 -1
  121. package/dist/v2/runtime/index.d.cts +5 -1
  122. package/dist/v2/runtime/index.d.cts.map +1 -1
  123. package/dist/v2/runtime/index.d.mts +5 -1
  124. package/dist/v2/runtime/index.d.mts.map +1 -1
  125. package/dist/v2/runtime/intelligence-platform/client.cjs +85 -1
  126. package/dist/v2/runtime/intelligence-platform/client.cjs.map +1 -1
  127. package/dist/v2/runtime/intelligence-platform/client.d.cts +24 -1
  128. package/dist/v2/runtime/intelligence-platform/client.d.cts.map +1 -1
  129. package/dist/v2/runtime/intelligence-platform/client.d.mts +24 -1
  130. package/dist/v2/runtime/intelligence-platform/client.d.mts.map +1 -1
  131. package/dist/v2/runtime/intelligence-platform/client.mjs +85 -1
  132. package/dist/v2/runtime/intelligence-platform/client.mjs.map +1 -1
  133. package/dist/v2/runtime/intelligence-platform/experimental.d.cts +27 -0
  134. package/dist/v2/runtime/intelligence-platform/experimental.d.cts.map +1 -0
  135. package/dist/v2/runtime/intelligence-platform/experimental.d.mts +27 -0
  136. package/dist/v2/runtime/intelligence-platform/experimental.d.mts.map +1 -0
  137. package/dist/v2/runtime/intelligence-platform/index.d.cts +2 -1
  138. package/dist/v2/runtime/intelligence-platform/index.d.mts +2 -1
  139. package/dist/v2/runtime/intelligence-platform/learning-management.cjs +204 -0
  140. package/dist/v2/runtime/intelligence-platform/learning-management.cjs.map +1 -0
  141. package/dist/v2/runtime/intelligence-platform/learning-management.d.cts +112 -0
  142. package/dist/v2/runtime/intelligence-platform/learning-management.d.cts.map +1 -0
  143. package/dist/v2/runtime/intelligence-platform/learning-management.d.mts +112 -0
  144. package/dist/v2/runtime/intelligence-platform/learning-management.d.mts.map +1 -0
  145. package/dist/v2/runtime/intelligence-platform/learning-management.mjs +194 -0
  146. package/dist/v2/runtime/intelligence-platform/learning-management.mjs.map +1 -0
  147. package/dist/v2/runtime/telemetry/telemetry-client.cjs +1 -1
  148. package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -1
  149. package/dist/v2/runtime/telemetry/telemetry-client.mjs +1 -1
  150. package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -1
  151. package/package.json +6 -6
  152. package/dist/v2/runtime/endpoints/express-fetch-bridge.cjs +0 -82
  153. package/dist/v2/runtime/endpoints/express-fetch-bridge.cjs.map +0 -1
  154. package/dist/v2/runtime/endpoints/express-fetch-bridge.mjs +0 -81
  155. package/dist/v2/runtime/endpoints/express-fetch-bridge.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-service-adapter-agent.cjs","names":["AbstractAgent","Observable","EventType","convertToolsToVercelAITools","aguiToGQL","RuntimeEventSubject","RuntimeEventTypes","InvalidToolInputError","TypeValidationError"],"sources":["../../../../src/v1-deprecated/lib/runtime/legacy-service-adapter-agent.ts"],"sourcesContent":["import { AbstractAgent, EventType } from \"@ag-ui/client\";\nimport type {\n BaseEvent,\n Message as AguiMessage,\n RunAgentInput,\n} from \"@ag-ui/client\";\nimport { Observable } from \"rxjs\";\nimport { asSchema, InvalidToolInputError, TypeValidationError } from \"ai\";\nimport type { FlexibleSchema } from \"ai\";\nimport { randomUUID } from \"@copilotkit/shared\";\nimport type * as SharedAgui from \"@copilotkit/shared\";\nimport { convertToolsToVercelAITools } from \"../../../agent\";\nimport type { BuiltInAgentClassicConfig } from \"../../../agent\";\nimport type { CopilotServiceAdapter } from \"../../service-adapters/service-adapter\";\nimport {\n RuntimeEventSubject,\n RuntimeEventTypes,\n} from \"../../service-adapters/events\";\nimport type {\n RuntimeEvent,\n RuntimeEventSource,\n} from \"../../service-adapters/events\";\nimport { aguiToGQL } from \"../../graphql/message-conversion/agui-to-gql\";\nimport type { ActionInput } from \"../../graphql/inputs/action.input\";\n\n/**\n * More than one step is required: the v2 client starts a follow-up run only\n * after it executes a frontend tool, so a server tool's result reaches the\n * model only if this run calls it again. Ten is the limit BuiltInAgent uses\n * when it loops (with learned skills). Its own default is one step, which\n * stops before answering a server tool (OSS-1232).\n */\nconst MAX_STEPS = 10;\n\n/** Roles `aguiToGQL` converts. Anything else (e.g. `activity`) has no v1 form. */\nconst V1_ROLES = new Set([\"developer\", \"system\", \"assistant\", \"user\", \"tool\"]);\n\ntype ServerTool = NonNullable<BuiltInAgentClassicConfig[\"tools\"]>[number];\n\ninterface StepToolCall {\n id: string;\n name: string;\n args: string;\n}\n\ninterface StepResult {\n text: string;\n textMessageId?: string;\n toolCalls: StepToolCall[];\n results: { toolCallId: string; content: string }[];\n}\n\n/**\n * Runs a v1 `CopilotServiceAdapter` through its own `process()` method.\n *\n * Since v1.50.0 the runtime turned a service adapter into a `BuiltInAgent`,\n * which only works when the adapter can name a model. An adapter whose value\n * lives in `process()` -- `LangChainAdapter`'s `chainFn` above all -- had no\n * path to execution at all (#3217). This agent is that path: it converts the\n * AG-UI input to the v1 request shape, calls `process()`, and maps the\n * adapter's runtime events back to AG-UI events.\n *\n * Server-side v1 `actions` and `mcpServers` reach it the same way they reach\n * `BuiltInAgent`, as `config.tools`. They are advertised to the adapter\n * alongside the frontend tools, and executed here when the model calls them,\n * which is what the v1 runtime did before v1.50.0.\n */\nexport class LegacyServiceAdapterAgent extends AbstractAgent {\n /** Written by `assignToolsToAgents`, the same as on `BuiltInAgent`. */\n config: { tools?: BuiltInAgentClassicConfig[\"tools\"] } = {};\n\n private abortController?: AbortController;\n\n constructor(private readonly serviceAdapter: CopilotServiceAdapter) {\n super();\n }\n\n clone(): LegacyServiceAdapterAgent {\n const cloned = super.clone() as LegacyServiceAdapterAgent;\n Reflect.set(cloned, \"serviceAdapter\", this.serviceAdapter);\n cloned.config = { ...this.config };\n return cloned;\n }\n\n /**\n * Stops the current run, which is what the runner calls when the user\n * presses Stop. The adapter's in-flight stream is abandoned, no further\n * `process()` step or server-side tool runs, and the run completes without\n * a terminal event, the same as `BuiltInAgent`.\n */\n abortRun(): void {\n this.abortController?.abort();\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n const controller = new AbortController();\n this.abortController = controller;\n const { signal } = controller;\n const emit = (event: BaseEvent) => {\n if (!signal.aborted) subscriber.next(event);\n };\n const release = () => {\n if (this.abortController === controller) {\n this.abortController = undefined;\n }\n };\n\n this.execute(input, emit, signal).then(\n () => {\n release();\n if (signal.aborted) {\n subscriber.complete();\n return;\n }\n emit({\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n } as BaseEvent);\n subscriber.complete();\n },\n (error: unknown) => {\n release();\n if (signal.aborted) {\n subscriber.complete();\n return;\n }\n emit({\n type: EventType.RUN_ERROR,\n message: error instanceof Error ? error.message : String(error),\n } as BaseEvent);\n subscriber.error(error);\n },\n );\n\n return () => {\n controller.abort();\n release();\n };\n });\n }\n\n private async execute(\n input: RunAgentInput,\n emit: (event: BaseEvent) => void,\n signal: AbortSignal,\n ): Promise<void> {\n emit({\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n } as BaseEvent);\n\n const frontendNames = new Set(input.tools.map((tool) => tool.name));\n const serverTools = new Map<string, ServerTool>();\n for (const tool of this.config.tools ?? []) {\n // A frontend tool of the same name wins, as it does on BuiltInAgent.\n if (tool.execute && !frontendNames.has(tool.name)) {\n serverTools.set(tool.name, tool);\n }\n }\n\n const actions = [\n ...input.tools.map((tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n jsonSchema: JSON.stringify(\n tool.parameters ?? { type: \"object\", properties: {} },\n ),\n })),\n ...(await Promise.all(\n [...serverTools.values()].map(async (tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n // v1 actions and MCP tools arrive here with Zod parameters; the AI\n // SDK is what converts those for BuiltInAgent too.\n jsonSchema: JSON.stringify(\n await asSchema(tool.parameters as FlexibleSchema<unknown>)\n .jsonSchema,\n ),\n })),\n )),\n ] as ActionInput[];\n\n const messages: AguiMessage[] = [];\n if (input.context?.length) {\n // The v1 frontend folded readable context into the system message. The\n // v2 frontend sends it separately, so put it back where the adapter\n // expects it.\n messages.push({\n id: randomUUID(),\n role: \"system\",\n content:\n \"## Context from the application\\n\" +\n input.context\n .map((ctx) => `${ctx.description}:\\n${ctx.value}\\n`)\n .join(\"\"),\n });\n }\n messages.push(\n ...input.messages.filter((message) => V1_ROLES.has(message.role)),\n );\n\n for (let step = 0; step < MAX_STEPS; step++) {\n const result = await this.runStep(input, messages, actions, emit, signal);\n if (signal.aborted) return;\n\n const answered = new Set(result.results.map((r) => r.toolCallId));\n const pending = result.toolCalls.filter((call) => !answered.has(call.id));\n const serverCalls = pending.filter((call) => serverTools.has(call.name));\n\n if (result.text || result.toolCalls.length) {\n messages.push({\n id: result.textMessageId ?? randomUUID(),\n role: \"assistant\",\n content: result.text,\n ...(result.toolCalls.length && {\n toolCalls: result.toolCalls.map((call) => ({\n id: call.id,\n type: \"function\" as const,\n function: { name: call.name, arguments: call.args || \"{}\" },\n })),\n }),\n });\n }\n for (const { toolCallId, content } of result.results) {\n messages.push({ id: randomUUID(), role: \"tool\", toolCallId, content });\n }\n\n // BuiltInAgent checks frontend tool calls against their JSON Schema on\n // the server too, and answers a failing call with an error result\n // instead of sending it to the browser. Do the same, so the client never\n // runs a handler with arguments its own schema rejects.\n const rejected = new Set<string>();\n for (const call of pending) {\n if (serverTools.has(call.name)) continue;\n const tool = input.tools.find((t) => t.name === call.name);\n if (!tool) continue;\n let schema: FlexibleSchema<unknown> | undefined;\n try {\n schema = convertToolsToVercelAITools([tool])[tool.name]?.inputSchema;\n } catch {\n // Not a JSON Schema the validator accepts: leave the call as it was.\n continue;\n }\n const checked = await validateToolArgs(call, schema);\n if (\"error\" in checked) {\n rejected.add(call.id);\n emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: randomUUID(),\n toolCallId: call.id,\n content: checked.error,\n } as BaseEvent);\n messages.push({\n id: randomUUID(),\n role: \"tool\",\n toolCallId: call.id,\n content: checked.error,\n });\n }\n }\n\n for (const call of serverCalls) {\n if (signal.aborted) return;\n const content = await this.executeServerTool(\n serverTools.get(call.name)!,\n call,\n );\n emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: randomUUID(),\n toolCallId: call.id,\n content,\n } as BaseEvent);\n messages.push({\n id: randomUUID(),\n role: \"tool\",\n toolCallId: call.id,\n content,\n });\n }\n\n // Another step only makes sense when every open call has a result. A\n // frontend tool call ends the run; the client executes it and starts\n // the next one. A rejected call already has its (error) result.\n const answeredHere = serverCalls.length + rejected.size;\n if (!answeredHere || answeredHere !== pending.length) {\n return;\n }\n }\n }\n\n private async executeServerTool(\n tool: ServerTool,\n call: StepToolCall,\n ): Promise<string> {\n // Validate against the tool's schema, as the AI SDK does for BuiltInAgent,\n // so one action behaves the same whichever adapter runs it. Arguments that\n // fail go back to the model as an error result it can correct, and never\n // reach the handler. Unknown keys are stripped. v1 itself (<= 1.10) passed\n // the raw parsed JSON to the handler; this follows BuiltInAgent instead.\n const checked = await validateToolArgs(\n call,\n tool.parameters as FlexibleSchema<unknown> | undefined,\n );\n if (\"error\" in checked) return checked.error;\n try {\n const output = await tool.execute!(checked.value as never);\n return typeof output === \"string\" ? output : JSON.stringify(output ?? \"\");\n } catch (error) {\n return JSON.stringify({\n error: {\n code: \"ERROR\",\n message: error instanceof Error ? error.message : String(error),\n },\n result: \"\",\n });\n }\n }\n\n /** One call to `process()`, with its runtime events forwarded as AG-UI. */\n private async runStep(\n input: RunAgentInput,\n messages: AguiMessage[],\n actions: ActionInput[],\n emit: (event: BaseEvent) => void,\n signal: AbortSignal,\n ): Promise<StepResult> {\n let streamCallback:\n | ((eventStream$: RuntimeEventSubject) => Promise<void>)\n | undefined;\n // `RuntimeEventSource.stream` only stores the callback; the code that\n // consumed it was deleted in v1.50.0. Capture it and consume it here.\n const eventSource = {\n stream: async (\n callback: (eventStream$: RuntimeEventSubject) => Promise<void>,\n ) => {\n streamCallback = callback;\n },\n } as unknown as RuntimeEventSource;\n\n await this.serviceAdapter.process({\n eventSource,\n messages: aguiToGQL(messages as SharedAgui.Message[]),\n actions,\n threadId: input.threadId,\n runId: input.runId,\n });\n\n const result: StepResult = { text: \"\", toolCalls: [], results: [] };\n if (!streamCallback || signal.aborted) {\n return result;\n }\n\n const subject = new RuntimeEventSubject(signal);\n const done = new Promise<void>((resolve, reject) => {\n subject.subscribe({\n next: (event) => {\n try {\n this.forward(event, result, emit);\n } catch (error) {\n reject(error);\n }\n },\n error: reject,\n complete: resolve,\n });\n // Nothing can cancel an adapter's stream from outside, so on abort stop\n // waiting for it; `emit` already drops anything it sends afterwards.\n signal.addEventListener(\"abort\", () => resolve(), { once: true });\n });\n // An adapter that returns without completing its stream is finished too.\n streamCallback(subject).then(\n () => subject.complete(),\n (error) => subject.error(error),\n );\n await done;\n return result;\n }\n\n private forward(\n event: RuntimeEvent,\n step: StepResult,\n emit: (event: BaseEvent) => void,\n ): void {\n switch (event.type) {\n case RuntimeEventTypes.TextMessageStart:\n step.textMessageId ??= event.messageId;\n emit({\n type: EventType.TEXT_MESSAGE_START,\n messageId: event.messageId,\n role: \"assistant\",\n } as BaseEvent);\n return;\n case RuntimeEventTypes.TextMessageContent:\n // AG-UI rejects an empty delta.\n if (!event.content) return;\n step.text += event.content;\n emit({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.messageId,\n delta: event.content,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.TextMessageEnd:\n emit({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.messageId,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.ActionExecutionStart:\n step.toolCalls.push({\n id: event.actionExecutionId,\n name: event.actionName,\n args: \"\",\n });\n emit({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.actionExecutionId,\n toolCallName: event.actionName,\n parentMessageId: event.parentMessageId,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.ActionExecutionArgs: {\n if (!event.args) return;\n const call = step.toolCalls.find(\n (c) => c.id === event.actionExecutionId,\n );\n if (call) call.args += event.args;\n emit({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.actionExecutionId,\n delta: event.args,\n } as BaseEvent);\n return;\n }\n case RuntimeEventTypes.ActionExecutionEnd:\n emit({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.actionExecutionId,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.ActionExecutionResult:\n step.results.push({\n toolCallId: event.actionExecutionId,\n content: event.result,\n });\n emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: randomUUID(),\n toolCallId: event.actionExecutionId,\n content: event.result,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.RunError:\n throw new Error(event.message);\n default:\n // Agent-state and LangGraph meta events came only from remote agent\n // endpoints, which do not run through a service adapter.\n return;\n }\n }\n}\n\n/**\n * Parses a tool call's arguments and checks them against `schema`, with the\n * AI SDK's own error, so a failure reads exactly as it does on BuiltInAgent.\n * Returns the validated value (undeclared keys stripped by a Zod schema) or\n * the text of the error result to send back.\n */\nasync function validateToolArgs(\n call: StepToolCall,\n schema: FlexibleSchema<unknown> | undefined,\n): Promise<{ value: unknown } | { error: string }> {\n let args: unknown = {};\n try {\n args = call.args ? JSON.parse(call.args) : {};\n } catch {\n return {\n error: `The tool \"${call.name}\" received arguments that are not valid JSON.`,\n };\n }\n const validate = asSchema(schema).validate;\n if (!validate) return { value: args };\n const result = await validate(args);\n // `in`, not `!result.success`: this package compiles with `strict: false`,\n // which does not narrow on a boolean discriminant.\n if (\"error\" in result) {\n const error = new InvalidToolInputError({\n toolName: call.name,\n toolInput: call.args,\n cause: TypeValidationError.wrap({ value: args, cause: result.error }),\n });\n return { error: `Error: ${error.message}` };\n }\n return { value: result.value };\n}\n"],"mappings":"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"}
@@ -0,0 +1,359 @@
1
+ import "reflect-metadata";
2
+ import { RuntimeEventSubject, RuntimeEventTypes } from "../../service-adapters/events.mjs";
3
+ import { aguiToGQL } from "../../graphql/message-conversion/agui-to-gql.mjs";
4
+ import { convertToolsToVercelAITools } from "../../agent/index.mjs";
5
+ import { randomUUID } from "@copilotkit/shared";
6
+ import { Observable } from "rxjs";
7
+ import { AbstractAgent, EventType } from "@ag-ui/client";
8
+ import { InvalidToolInputError, TypeValidationError, asSchema } from "ai";
9
+
10
+ //#region src/v1-deprecated/lib/runtime/legacy-service-adapter-agent.ts
11
+ /**
12
+ * More than one step is required: the v2 client starts a follow-up run only
13
+ * after it executes a frontend tool, so a server tool's result reaches the
14
+ * model only if this run calls it again. Ten is the limit BuiltInAgent uses
15
+ * when it loops (with learned skills). Its own default is one step, which
16
+ * stops before answering a server tool (OSS-1232).
17
+ */
18
+ const MAX_STEPS = 10;
19
+ /** Roles `aguiToGQL` converts. Anything else (e.g. `activity`) has no v1 form. */
20
+ const V1_ROLES = new Set([
21
+ "developer",
22
+ "system",
23
+ "assistant",
24
+ "user",
25
+ "tool"
26
+ ]);
27
+ /**
28
+ * Runs a v1 `CopilotServiceAdapter` through its own `process()` method.
29
+ *
30
+ * Since v1.50.0 the runtime turned a service adapter into a `BuiltInAgent`,
31
+ * which only works when the adapter can name a model. An adapter whose value
32
+ * lives in `process()` -- `LangChainAdapter`'s `chainFn` above all -- had no
33
+ * path to execution at all (#3217). This agent is that path: it converts the
34
+ * AG-UI input to the v1 request shape, calls `process()`, and maps the
35
+ * adapter's runtime events back to AG-UI events.
36
+ *
37
+ * Server-side v1 `actions` and `mcpServers` reach it the same way they reach
38
+ * `BuiltInAgent`, as `config.tools`. They are advertised to the adapter
39
+ * alongside the frontend tools, and executed here when the model calls them,
40
+ * which is what the v1 runtime did before v1.50.0.
41
+ */
42
+ var LegacyServiceAdapterAgent = class extends AbstractAgent {
43
+ constructor(serviceAdapter) {
44
+ super();
45
+ this.serviceAdapter = serviceAdapter;
46
+ this.config = {};
47
+ }
48
+ clone() {
49
+ const cloned = super.clone();
50
+ Reflect.set(cloned, "serviceAdapter", this.serviceAdapter);
51
+ cloned.config = { ...this.config };
52
+ return cloned;
53
+ }
54
+ /**
55
+ * Stops the current run, which is what the runner calls when the user
56
+ * presses Stop. The adapter's in-flight stream is abandoned, no further
57
+ * `process()` step or server-side tool runs, and the run completes without
58
+ * a terminal event, the same as `BuiltInAgent`.
59
+ */
60
+ abortRun() {
61
+ this.abortController?.abort();
62
+ }
63
+ run(input) {
64
+ return new Observable((subscriber) => {
65
+ const controller = new AbortController();
66
+ this.abortController = controller;
67
+ const { signal } = controller;
68
+ const emit = (event) => {
69
+ if (!signal.aborted) subscriber.next(event);
70
+ };
71
+ const release = () => {
72
+ if (this.abortController === controller) this.abortController = void 0;
73
+ };
74
+ this.execute(input, emit, signal).then(() => {
75
+ release();
76
+ if (signal.aborted) {
77
+ subscriber.complete();
78
+ return;
79
+ }
80
+ emit({
81
+ type: EventType.RUN_FINISHED,
82
+ threadId: input.threadId,
83
+ runId: input.runId
84
+ });
85
+ subscriber.complete();
86
+ }, (error) => {
87
+ release();
88
+ if (signal.aborted) {
89
+ subscriber.complete();
90
+ return;
91
+ }
92
+ emit({
93
+ type: EventType.RUN_ERROR,
94
+ message: error instanceof Error ? error.message : String(error)
95
+ });
96
+ subscriber.error(error);
97
+ });
98
+ return () => {
99
+ controller.abort();
100
+ release();
101
+ };
102
+ });
103
+ }
104
+ async execute(input, emit, signal) {
105
+ emit({
106
+ type: EventType.RUN_STARTED,
107
+ threadId: input.threadId,
108
+ runId: input.runId
109
+ });
110
+ const frontendNames = new Set(input.tools.map((tool) => tool.name));
111
+ const serverTools = /* @__PURE__ */ new Map();
112
+ for (const tool of this.config.tools ?? []) if (tool.execute && !frontendNames.has(tool.name)) serverTools.set(tool.name, tool);
113
+ const actions = [...input.tools.map((tool) => ({
114
+ name: tool.name,
115
+ description: tool.description ?? "",
116
+ jsonSchema: JSON.stringify(tool.parameters ?? {
117
+ type: "object",
118
+ properties: {}
119
+ })
120
+ })), ...await Promise.all([...serverTools.values()].map(async (tool) => ({
121
+ name: tool.name,
122
+ description: tool.description ?? "",
123
+ jsonSchema: JSON.stringify(await asSchema(tool.parameters).jsonSchema)
124
+ })))];
125
+ const messages = [];
126
+ if (input.context?.length) messages.push({
127
+ id: randomUUID(),
128
+ role: "system",
129
+ content: "## Context from the application\n" + input.context.map((ctx) => `${ctx.description}:\n${ctx.value}\n`).join("")
130
+ });
131
+ messages.push(...input.messages.filter((message) => V1_ROLES.has(message.role)));
132
+ for (let step = 0; step < MAX_STEPS; step++) {
133
+ const result = await this.runStep(input, messages, actions, emit, signal);
134
+ if (signal.aborted) return;
135
+ const answered = new Set(result.results.map((r) => r.toolCallId));
136
+ const pending = result.toolCalls.filter((call) => !answered.has(call.id));
137
+ const serverCalls = pending.filter((call) => serverTools.has(call.name));
138
+ if (result.text || result.toolCalls.length) messages.push({
139
+ id: result.textMessageId ?? randomUUID(),
140
+ role: "assistant",
141
+ content: result.text,
142
+ ...result.toolCalls.length && { toolCalls: result.toolCalls.map((call) => ({
143
+ id: call.id,
144
+ type: "function",
145
+ function: {
146
+ name: call.name,
147
+ arguments: call.args || "{}"
148
+ }
149
+ })) }
150
+ });
151
+ for (const { toolCallId, content } of result.results) messages.push({
152
+ id: randomUUID(),
153
+ role: "tool",
154
+ toolCallId,
155
+ content
156
+ });
157
+ const rejected = /* @__PURE__ */ new Set();
158
+ for (const call of pending) {
159
+ if (serverTools.has(call.name)) continue;
160
+ const tool = input.tools.find((t) => t.name === call.name);
161
+ if (!tool) continue;
162
+ let schema;
163
+ try {
164
+ schema = convertToolsToVercelAITools([tool])[tool.name]?.inputSchema;
165
+ } catch {
166
+ continue;
167
+ }
168
+ const checked = await validateToolArgs(call, schema);
169
+ if ("error" in checked) {
170
+ rejected.add(call.id);
171
+ emit({
172
+ type: EventType.TOOL_CALL_RESULT,
173
+ messageId: randomUUID(),
174
+ toolCallId: call.id,
175
+ content: checked.error
176
+ });
177
+ messages.push({
178
+ id: randomUUID(),
179
+ role: "tool",
180
+ toolCallId: call.id,
181
+ content: checked.error
182
+ });
183
+ }
184
+ }
185
+ for (const call of serverCalls) {
186
+ if (signal.aborted) return;
187
+ const content = await this.executeServerTool(serverTools.get(call.name), call);
188
+ emit({
189
+ type: EventType.TOOL_CALL_RESULT,
190
+ messageId: randomUUID(),
191
+ toolCallId: call.id,
192
+ content
193
+ });
194
+ messages.push({
195
+ id: randomUUID(),
196
+ role: "tool",
197
+ toolCallId: call.id,
198
+ content
199
+ });
200
+ }
201
+ const answeredHere = serverCalls.length + rejected.size;
202
+ if (!answeredHere || answeredHere !== pending.length) return;
203
+ }
204
+ }
205
+ async executeServerTool(tool, call) {
206
+ const checked = await validateToolArgs(call, tool.parameters);
207
+ if ("error" in checked) return checked.error;
208
+ try {
209
+ const output = await tool.execute(checked.value);
210
+ return typeof output === "string" ? output : JSON.stringify(output ?? "");
211
+ } catch (error) {
212
+ return JSON.stringify({
213
+ error: {
214
+ code: "ERROR",
215
+ message: error instanceof Error ? error.message : String(error)
216
+ },
217
+ result: ""
218
+ });
219
+ }
220
+ }
221
+ /** One call to `process()`, with its runtime events forwarded as AG-UI. */
222
+ async runStep(input, messages, actions, emit, signal) {
223
+ let streamCallback;
224
+ await this.serviceAdapter.process({
225
+ eventSource: { stream: async (callback) => {
226
+ streamCallback = callback;
227
+ } },
228
+ messages: aguiToGQL(messages),
229
+ actions,
230
+ threadId: input.threadId,
231
+ runId: input.runId
232
+ });
233
+ const result = {
234
+ text: "",
235
+ toolCalls: [],
236
+ results: []
237
+ };
238
+ if (!streamCallback || signal.aborted) return result;
239
+ const subject = new RuntimeEventSubject(signal);
240
+ const done = new Promise((resolve, reject) => {
241
+ subject.subscribe({
242
+ next: (event) => {
243
+ try {
244
+ this.forward(event, result, emit);
245
+ } catch (error) {
246
+ reject(error);
247
+ }
248
+ },
249
+ error: reject,
250
+ complete: resolve
251
+ });
252
+ signal.addEventListener("abort", () => resolve(), { once: true });
253
+ });
254
+ streamCallback(subject).then(() => subject.complete(), (error) => subject.error(error));
255
+ await done;
256
+ return result;
257
+ }
258
+ forward(event, step, emit) {
259
+ switch (event.type) {
260
+ case RuntimeEventTypes.TextMessageStart:
261
+ step.textMessageId ??= event.messageId;
262
+ emit({
263
+ type: EventType.TEXT_MESSAGE_START,
264
+ messageId: event.messageId,
265
+ role: "assistant"
266
+ });
267
+ return;
268
+ case RuntimeEventTypes.TextMessageContent:
269
+ if (!event.content) return;
270
+ step.text += event.content;
271
+ emit({
272
+ type: EventType.TEXT_MESSAGE_CONTENT,
273
+ messageId: event.messageId,
274
+ delta: event.content
275
+ });
276
+ return;
277
+ case RuntimeEventTypes.TextMessageEnd:
278
+ emit({
279
+ type: EventType.TEXT_MESSAGE_END,
280
+ messageId: event.messageId
281
+ });
282
+ return;
283
+ case RuntimeEventTypes.ActionExecutionStart:
284
+ step.toolCalls.push({
285
+ id: event.actionExecutionId,
286
+ name: event.actionName,
287
+ args: ""
288
+ });
289
+ emit({
290
+ type: EventType.TOOL_CALL_START,
291
+ toolCallId: event.actionExecutionId,
292
+ toolCallName: event.actionName,
293
+ parentMessageId: event.parentMessageId
294
+ });
295
+ return;
296
+ case RuntimeEventTypes.ActionExecutionArgs: {
297
+ if (!event.args) return;
298
+ const call = step.toolCalls.find((c) => c.id === event.actionExecutionId);
299
+ if (call) call.args += event.args;
300
+ emit({
301
+ type: EventType.TOOL_CALL_ARGS,
302
+ toolCallId: event.actionExecutionId,
303
+ delta: event.args
304
+ });
305
+ return;
306
+ }
307
+ case RuntimeEventTypes.ActionExecutionEnd:
308
+ emit({
309
+ type: EventType.TOOL_CALL_END,
310
+ toolCallId: event.actionExecutionId
311
+ });
312
+ return;
313
+ case RuntimeEventTypes.ActionExecutionResult:
314
+ step.results.push({
315
+ toolCallId: event.actionExecutionId,
316
+ content: event.result
317
+ });
318
+ emit({
319
+ type: EventType.TOOL_CALL_RESULT,
320
+ messageId: randomUUID(),
321
+ toolCallId: event.actionExecutionId,
322
+ content: event.result
323
+ });
324
+ return;
325
+ case RuntimeEventTypes.RunError: throw new Error(event.message);
326
+ default: return;
327
+ }
328
+ }
329
+ };
330
+ /**
331
+ * Parses a tool call's arguments and checks them against `schema`, with the
332
+ * AI SDK's own error, so a failure reads exactly as it does on BuiltInAgent.
333
+ * Returns the validated value (undeclared keys stripped by a Zod schema) or
334
+ * the text of the error result to send back.
335
+ */
336
+ async function validateToolArgs(call, schema) {
337
+ let args = {};
338
+ try {
339
+ args = call.args ? JSON.parse(call.args) : {};
340
+ } catch {
341
+ return { error: `The tool "${call.name}" received arguments that are not valid JSON.` };
342
+ }
343
+ const validate = asSchema(schema).validate;
344
+ if (!validate) return { value: args };
345
+ const result = await validate(args);
346
+ if ("error" in result) return { error: `Error: ${new InvalidToolInputError({
347
+ toolName: call.name,
348
+ toolInput: call.args,
349
+ cause: TypeValidationError.wrap({
350
+ value: args,
351
+ cause: result.error
352
+ })
353
+ }).message}` };
354
+ return { value: result.value };
355
+ }
356
+
357
+ //#endregion
358
+ export { LegacyServiceAdapterAgent };
359
+ //# sourceMappingURL=legacy-service-adapter-agent.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-service-adapter-agent.mjs","names":[],"sources":["../../../../src/v1-deprecated/lib/runtime/legacy-service-adapter-agent.ts"],"sourcesContent":["import { AbstractAgent, EventType } from \"@ag-ui/client\";\nimport type {\n BaseEvent,\n Message as AguiMessage,\n RunAgentInput,\n} from \"@ag-ui/client\";\nimport { Observable } from \"rxjs\";\nimport { asSchema, InvalidToolInputError, TypeValidationError } from \"ai\";\nimport type { FlexibleSchema } from \"ai\";\nimport { randomUUID } from \"@copilotkit/shared\";\nimport type * as SharedAgui from \"@copilotkit/shared\";\nimport { convertToolsToVercelAITools } from \"../../../agent\";\nimport type { BuiltInAgentClassicConfig } from \"../../../agent\";\nimport type { CopilotServiceAdapter } from \"../../service-adapters/service-adapter\";\nimport {\n RuntimeEventSubject,\n RuntimeEventTypes,\n} from \"../../service-adapters/events\";\nimport type {\n RuntimeEvent,\n RuntimeEventSource,\n} from \"../../service-adapters/events\";\nimport { aguiToGQL } from \"../../graphql/message-conversion/agui-to-gql\";\nimport type { ActionInput } from \"../../graphql/inputs/action.input\";\n\n/**\n * More than one step is required: the v2 client starts a follow-up run only\n * after it executes a frontend tool, so a server tool's result reaches the\n * model only if this run calls it again. Ten is the limit BuiltInAgent uses\n * when it loops (with learned skills). Its own default is one step, which\n * stops before answering a server tool (OSS-1232).\n */\nconst MAX_STEPS = 10;\n\n/** Roles `aguiToGQL` converts. Anything else (e.g. `activity`) has no v1 form. */\nconst V1_ROLES = new Set([\"developer\", \"system\", \"assistant\", \"user\", \"tool\"]);\n\ntype ServerTool = NonNullable<BuiltInAgentClassicConfig[\"tools\"]>[number];\n\ninterface StepToolCall {\n id: string;\n name: string;\n args: string;\n}\n\ninterface StepResult {\n text: string;\n textMessageId?: string;\n toolCalls: StepToolCall[];\n results: { toolCallId: string; content: string }[];\n}\n\n/**\n * Runs a v1 `CopilotServiceAdapter` through its own `process()` method.\n *\n * Since v1.50.0 the runtime turned a service adapter into a `BuiltInAgent`,\n * which only works when the adapter can name a model. An adapter whose value\n * lives in `process()` -- `LangChainAdapter`'s `chainFn` above all -- had no\n * path to execution at all (#3217). This agent is that path: it converts the\n * AG-UI input to the v1 request shape, calls `process()`, and maps the\n * adapter's runtime events back to AG-UI events.\n *\n * Server-side v1 `actions` and `mcpServers` reach it the same way they reach\n * `BuiltInAgent`, as `config.tools`. They are advertised to the adapter\n * alongside the frontend tools, and executed here when the model calls them,\n * which is what the v1 runtime did before v1.50.0.\n */\nexport class LegacyServiceAdapterAgent extends AbstractAgent {\n /** Written by `assignToolsToAgents`, the same as on `BuiltInAgent`. */\n config: { tools?: BuiltInAgentClassicConfig[\"tools\"] } = {};\n\n private abortController?: AbortController;\n\n constructor(private readonly serviceAdapter: CopilotServiceAdapter) {\n super();\n }\n\n clone(): LegacyServiceAdapterAgent {\n const cloned = super.clone() as LegacyServiceAdapterAgent;\n Reflect.set(cloned, \"serviceAdapter\", this.serviceAdapter);\n cloned.config = { ...this.config };\n return cloned;\n }\n\n /**\n * Stops the current run, which is what the runner calls when the user\n * presses Stop. The adapter's in-flight stream is abandoned, no further\n * `process()` step or server-side tool runs, and the run completes without\n * a terminal event, the same as `BuiltInAgent`.\n */\n abortRun(): void {\n this.abortController?.abort();\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n const controller = new AbortController();\n this.abortController = controller;\n const { signal } = controller;\n const emit = (event: BaseEvent) => {\n if (!signal.aborted) subscriber.next(event);\n };\n const release = () => {\n if (this.abortController === controller) {\n this.abortController = undefined;\n }\n };\n\n this.execute(input, emit, signal).then(\n () => {\n release();\n if (signal.aborted) {\n subscriber.complete();\n return;\n }\n emit({\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n } as BaseEvent);\n subscriber.complete();\n },\n (error: unknown) => {\n release();\n if (signal.aborted) {\n subscriber.complete();\n return;\n }\n emit({\n type: EventType.RUN_ERROR,\n message: error instanceof Error ? error.message : String(error),\n } as BaseEvent);\n subscriber.error(error);\n },\n );\n\n return () => {\n controller.abort();\n release();\n };\n });\n }\n\n private async execute(\n input: RunAgentInput,\n emit: (event: BaseEvent) => void,\n signal: AbortSignal,\n ): Promise<void> {\n emit({\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n } as BaseEvent);\n\n const frontendNames = new Set(input.tools.map((tool) => tool.name));\n const serverTools = new Map<string, ServerTool>();\n for (const tool of this.config.tools ?? []) {\n // A frontend tool of the same name wins, as it does on BuiltInAgent.\n if (tool.execute && !frontendNames.has(tool.name)) {\n serverTools.set(tool.name, tool);\n }\n }\n\n const actions = [\n ...input.tools.map((tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n jsonSchema: JSON.stringify(\n tool.parameters ?? { type: \"object\", properties: {} },\n ),\n })),\n ...(await Promise.all(\n [...serverTools.values()].map(async (tool) => ({\n name: tool.name,\n description: tool.description ?? \"\",\n // v1 actions and MCP tools arrive here with Zod parameters; the AI\n // SDK is what converts those for BuiltInAgent too.\n jsonSchema: JSON.stringify(\n await asSchema(tool.parameters as FlexibleSchema<unknown>)\n .jsonSchema,\n ),\n })),\n )),\n ] as ActionInput[];\n\n const messages: AguiMessage[] = [];\n if (input.context?.length) {\n // The v1 frontend folded readable context into the system message. The\n // v2 frontend sends it separately, so put it back where the adapter\n // expects it.\n messages.push({\n id: randomUUID(),\n role: \"system\",\n content:\n \"## Context from the application\\n\" +\n input.context\n .map((ctx) => `${ctx.description}:\\n${ctx.value}\\n`)\n .join(\"\"),\n });\n }\n messages.push(\n ...input.messages.filter((message) => V1_ROLES.has(message.role)),\n );\n\n for (let step = 0; step < MAX_STEPS; step++) {\n const result = await this.runStep(input, messages, actions, emit, signal);\n if (signal.aborted) return;\n\n const answered = new Set(result.results.map((r) => r.toolCallId));\n const pending = result.toolCalls.filter((call) => !answered.has(call.id));\n const serverCalls = pending.filter((call) => serverTools.has(call.name));\n\n if (result.text || result.toolCalls.length) {\n messages.push({\n id: result.textMessageId ?? randomUUID(),\n role: \"assistant\",\n content: result.text,\n ...(result.toolCalls.length && {\n toolCalls: result.toolCalls.map((call) => ({\n id: call.id,\n type: \"function\" as const,\n function: { name: call.name, arguments: call.args || \"{}\" },\n })),\n }),\n });\n }\n for (const { toolCallId, content } of result.results) {\n messages.push({ id: randomUUID(), role: \"tool\", toolCallId, content });\n }\n\n // BuiltInAgent checks frontend tool calls against their JSON Schema on\n // the server too, and answers a failing call with an error result\n // instead of sending it to the browser. Do the same, so the client never\n // runs a handler with arguments its own schema rejects.\n const rejected = new Set<string>();\n for (const call of pending) {\n if (serverTools.has(call.name)) continue;\n const tool = input.tools.find((t) => t.name === call.name);\n if (!tool) continue;\n let schema: FlexibleSchema<unknown> | undefined;\n try {\n schema = convertToolsToVercelAITools([tool])[tool.name]?.inputSchema;\n } catch {\n // Not a JSON Schema the validator accepts: leave the call as it was.\n continue;\n }\n const checked = await validateToolArgs(call, schema);\n if (\"error\" in checked) {\n rejected.add(call.id);\n emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: randomUUID(),\n toolCallId: call.id,\n content: checked.error,\n } as BaseEvent);\n messages.push({\n id: randomUUID(),\n role: \"tool\",\n toolCallId: call.id,\n content: checked.error,\n });\n }\n }\n\n for (const call of serverCalls) {\n if (signal.aborted) return;\n const content = await this.executeServerTool(\n serverTools.get(call.name)!,\n call,\n );\n emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: randomUUID(),\n toolCallId: call.id,\n content,\n } as BaseEvent);\n messages.push({\n id: randomUUID(),\n role: \"tool\",\n toolCallId: call.id,\n content,\n });\n }\n\n // Another step only makes sense when every open call has a result. A\n // frontend tool call ends the run; the client executes it and starts\n // the next one. A rejected call already has its (error) result.\n const answeredHere = serverCalls.length + rejected.size;\n if (!answeredHere || answeredHere !== pending.length) {\n return;\n }\n }\n }\n\n private async executeServerTool(\n tool: ServerTool,\n call: StepToolCall,\n ): Promise<string> {\n // Validate against the tool's schema, as the AI SDK does for BuiltInAgent,\n // so one action behaves the same whichever adapter runs it. Arguments that\n // fail go back to the model as an error result it can correct, and never\n // reach the handler. Unknown keys are stripped. v1 itself (<= 1.10) passed\n // the raw parsed JSON to the handler; this follows BuiltInAgent instead.\n const checked = await validateToolArgs(\n call,\n tool.parameters as FlexibleSchema<unknown> | undefined,\n );\n if (\"error\" in checked) return checked.error;\n try {\n const output = await tool.execute!(checked.value as never);\n return typeof output === \"string\" ? output : JSON.stringify(output ?? \"\");\n } catch (error) {\n return JSON.stringify({\n error: {\n code: \"ERROR\",\n message: error instanceof Error ? error.message : String(error),\n },\n result: \"\",\n });\n }\n }\n\n /** One call to `process()`, with its runtime events forwarded as AG-UI. */\n private async runStep(\n input: RunAgentInput,\n messages: AguiMessage[],\n actions: ActionInput[],\n emit: (event: BaseEvent) => void,\n signal: AbortSignal,\n ): Promise<StepResult> {\n let streamCallback:\n | ((eventStream$: RuntimeEventSubject) => Promise<void>)\n | undefined;\n // `RuntimeEventSource.stream` only stores the callback; the code that\n // consumed it was deleted in v1.50.0. Capture it and consume it here.\n const eventSource = {\n stream: async (\n callback: (eventStream$: RuntimeEventSubject) => Promise<void>,\n ) => {\n streamCallback = callback;\n },\n } as unknown as RuntimeEventSource;\n\n await this.serviceAdapter.process({\n eventSource,\n messages: aguiToGQL(messages as SharedAgui.Message[]),\n actions,\n threadId: input.threadId,\n runId: input.runId,\n });\n\n const result: StepResult = { text: \"\", toolCalls: [], results: [] };\n if (!streamCallback || signal.aborted) {\n return result;\n }\n\n const subject = new RuntimeEventSubject(signal);\n const done = new Promise<void>((resolve, reject) => {\n subject.subscribe({\n next: (event) => {\n try {\n this.forward(event, result, emit);\n } catch (error) {\n reject(error);\n }\n },\n error: reject,\n complete: resolve,\n });\n // Nothing can cancel an adapter's stream from outside, so on abort stop\n // waiting for it; `emit` already drops anything it sends afterwards.\n signal.addEventListener(\"abort\", () => resolve(), { once: true });\n });\n // An adapter that returns without completing its stream is finished too.\n streamCallback(subject).then(\n () => subject.complete(),\n (error) => subject.error(error),\n );\n await done;\n return result;\n }\n\n private forward(\n event: RuntimeEvent,\n step: StepResult,\n emit: (event: BaseEvent) => void,\n ): void {\n switch (event.type) {\n case RuntimeEventTypes.TextMessageStart:\n step.textMessageId ??= event.messageId;\n emit({\n type: EventType.TEXT_MESSAGE_START,\n messageId: event.messageId,\n role: \"assistant\",\n } as BaseEvent);\n return;\n case RuntimeEventTypes.TextMessageContent:\n // AG-UI rejects an empty delta.\n if (!event.content) return;\n step.text += event.content;\n emit({\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: event.messageId,\n delta: event.content,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.TextMessageEnd:\n emit({\n type: EventType.TEXT_MESSAGE_END,\n messageId: event.messageId,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.ActionExecutionStart:\n step.toolCalls.push({\n id: event.actionExecutionId,\n name: event.actionName,\n args: \"\",\n });\n emit({\n type: EventType.TOOL_CALL_START,\n toolCallId: event.actionExecutionId,\n toolCallName: event.actionName,\n parentMessageId: event.parentMessageId,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.ActionExecutionArgs: {\n if (!event.args) return;\n const call = step.toolCalls.find(\n (c) => c.id === event.actionExecutionId,\n );\n if (call) call.args += event.args;\n emit({\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: event.actionExecutionId,\n delta: event.args,\n } as BaseEvent);\n return;\n }\n case RuntimeEventTypes.ActionExecutionEnd:\n emit({\n type: EventType.TOOL_CALL_END,\n toolCallId: event.actionExecutionId,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.ActionExecutionResult:\n step.results.push({\n toolCallId: event.actionExecutionId,\n content: event.result,\n });\n emit({\n type: EventType.TOOL_CALL_RESULT,\n messageId: randomUUID(),\n toolCallId: event.actionExecutionId,\n content: event.result,\n } as BaseEvent);\n return;\n case RuntimeEventTypes.RunError:\n throw new Error(event.message);\n default:\n // Agent-state and LangGraph meta events came only from remote agent\n // endpoints, which do not run through a service adapter.\n return;\n }\n }\n}\n\n/**\n * Parses a tool call's arguments and checks them against `schema`, with the\n * AI SDK's own error, so a failure reads exactly as it does on BuiltInAgent.\n * Returns the validated value (undeclared keys stripped by a Zod schema) or\n * the text of the error result to send back.\n */\nasync function validateToolArgs(\n call: StepToolCall,\n schema: FlexibleSchema<unknown> | undefined,\n): Promise<{ value: unknown } | { error: string }> {\n let args: unknown = {};\n try {\n args = call.args ? JSON.parse(call.args) : {};\n } catch {\n return {\n error: `The tool \"${call.name}\" received arguments that are not valid JSON.`,\n };\n }\n const validate = asSchema(schema).validate;\n if (!validate) return { value: args };\n const result = await validate(args);\n // `in`, not `!result.success`: this package compiles with `strict: false`,\n // which does not narrow on a boolean discriminant.\n if (\"error\" in result) {\n const error = new InvalidToolInputError({\n toolName: call.name,\n toolInput: call.args,\n cause: TypeValidationError.wrap({ value: args, cause: result.error }),\n });\n return { error: `Error: ${error.message}` };\n }\n return { value: result.value };\n}\n"],"mappings":"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"}
@@ -59,7 +59,7 @@ var TelemetryAgentRunner = class {
59
59
  streamErrored = true;
60
60
  this.telemetry.capture("oss.runtime.agent_execution_stream_errored", {
61
61
  ...streamInfo,
62
- error: error instanceof Error ? error.message : String(error)
62
+ error: "AGENT_EXECUTION_FAILED"
63
63
  });
64
64
  throw error;
65
65
  }), (0, rxjs.finalize)(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-agent-runner.cjs","names":["InMemoryAgentRunner","telemetry"],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime — TelemetryAgentRunner:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * @copilotkit/runtime — TelemetryAgentRunnerConfig:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\n/**\n * TelemetryAgentRunner - A wrapper around AgentRunner that adds telemetry\n * for agent execution streams.\n *\n * This captures the following telemetry events:\n * - oss.runtime.agent_execution_stream_started - when an agent execution starts\n * - oss.runtime.agent_execution_stream_ended - when an agent execution completes\n * - oss.runtime.agent_execution_stream_errored - when an agent execution fails\n */\n\nimport { InMemoryAgentRunner } from \"../../../v2/runtime/runner\";\nimport type { AgentRunner } from \"../../../v2/runtime/runner\";\nimport { createHash } from \"node:crypto\";\nimport { tap, catchError, finalize } from \"rxjs\";\nimport telemetry from \"../telemetry-client\";\nimport type { AgentExecutionResponseInfo } from \"@copilotkit/shared/src/telemetry/events\";\nimport type { TelemetryCapture } from \"@copilotkit/shared\";\n\n/**\n * Configuration options for TelemetryAgentRunner\n */\nexport interface TelemetryAgentRunnerConfig {\n /**\n * The underlying runner to delegate to\n * If not provided, defaults to InMemoryAgentRunner\n */\n runner?: AgentRunner;\n\n /**\n * Optional LangSmith API key (will be hashed for telemetry)\n */\n langsmithApiKey?: string;\n\n /** Runtime-bound telemetry capture. Defaults to the legacy singleton. */\n telemetry?: TelemetryCapture;\n}\n\n/**\n * An AgentRunner wrapper that adds telemetry tracking for agent executions.\n *\n * Usage:\n * ```ts\n * const runtime = new CopilotRuntime({\n * runner: new TelemetryAgentRunner(),\n * // or with custom runner:\n * runner: new TelemetryAgentRunner({ runner: customRunner }),\n * });\n * ```\n */\nexport class TelemetryAgentRunner implements AgentRunner {\n private readonly _runner: AgentRunner;\n private readonly hashedLgcKey: string | undefined;\n private readonly telemetry: TelemetryCapture;\n\n constructor(config?: TelemetryAgentRunnerConfig) {\n this._runner = config?.runner ?? new InMemoryAgentRunner();\n this.telemetry = config?.telemetry ?? telemetry;\n this.hashedLgcKey = config?.langsmithApiKey\n ? createHash(\"sha256\").update(config.langsmithApiKey).digest(\"hex\")\n : undefined;\n }\n\n /**\n * Runs an agent with telemetry tracking.\n * Wraps the underlying runner's Observable stream with telemetry events.\n */\n run(...args: Parameters<AgentRunner[\"run\"]>): ReturnType<AgentRunner[\"run\"]> {\n const streamInfo: AgentExecutionResponseInfo = {\n hashedLgcKey: this.hashedLgcKey,\n };\n let streamErrored = false;\n\n // Capture stream started event\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_started\", {\n hashedLgcKey: this.hashedLgcKey,\n });\n\n // Delegate to the underlying runner and wrap with telemetry\n return this._runner.run(...args).pipe(\n // Extract metadata from events if available\n tap((event) => {\n // Try to extract provider/model info from raw events\n const rawEvent = (\n event as {\n rawEvent?: {\n metadata?: Record<string, unknown>;\n data?: Record<string, unknown>;\n };\n }\n ).rawEvent;\n if (rawEvent?.data) {\n const data = rawEvent.data as { output?: { model?: string } };\n if (data?.output?.model) {\n streamInfo.model = data.output.model;\n streamInfo.provider = data.output.model;\n }\n }\n if (rawEvent?.metadata) {\n const metadata = rawEvent.metadata as {\n langgraph_host?: string;\n langgraph_version?: string;\n };\n if (metadata?.langgraph_host) {\n streamInfo.langGraphHost = metadata.langgraph_host;\n }\n if (metadata?.langgraph_version) {\n streamInfo.langGraphVersion = metadata.langgraph_version;\n }\n }\n }),\n catchError((error) => {\n // Capture stream error event\n streamErrored = true;\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_errored\", {\n ...streamInfo,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }),\n finalize(() => {\n // Capture stream ended event (only if not errored)\n if (!streamErrored) {\n this.telemetry.capture(\n \"oss.runtime.agent_execution_stream_ended\",\n streamInfo,\n );\n }\n }),\n );\n }\n\n /**\n * Delegates to the underlying runner's connect method\n */\n connect(\n ...args: Parameters<AgentRunner[\"connect\"]>\n ): ReturnType<AgentRunner[\"connect\"]> {\n return this._runner.connect(...args);\n }\n\n /**\n * Delegates to the underlying runner's isRunning method\n */\n isRunning(\n ...args: Parameters<AgentRunner[\"isRunning\"]>\n ): ReturnType<AgentRunner[\"isRunning\"]> {\n return this._runner.isRunning(...args);\n }\n\n /**\n * Delegates to the underlying runner's stop method\n */\n stop(\n ...args: Parameters<AgentRunner[\"stop\"]>\n ): ReturnType<AgentRunner[\"stop\"]> {\n return this._runner.stop(...args);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyEA,IAAa,uBAAb,MAAyD;CAKvD,YAAY,QAAqC;AAC/C,OAAK,UAAU,QAAQ,UAAU,IAAIA,uCAAqB;AAC1D,OAAK,YAAY,QAAQ,aAAaC;AACtC,OAAK,eAAe,QAAQ,8CACb,SAAS,CAAC,OAAO,OAAO,gBAAgB,CAAC,OAAO,MAAM,GACjE;;;;;;CAON,IAAI,GAAG,MAAsE;EAC3E,MAAM,aAAyC,EAC7C,cAAc,KAAK,cACpB;EACD,IAAI,gBAAgB;AAGpB,OAAK,UAAU,QAAQ,8CAA8C,EACnE,cAAc,KAAK,cACpB,CAAC;AAGF,SAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,oBAE1B,UAAU;GAEb,MAAM,WACJ,MAMA;AACF,OAAI,UAAU,MAAM;IAClB,MAAM,OAAO,SAAS;AACtB,QAAI,MAAM,QAAQ,OAAO;AACvB,gBAAW,QAAQ,KAAK,OAAO;AAC/B,gBAAW,WAAW,KAAK,OAAO;;;AAGtC,OAAI,UAAU,UAAU;IACtB,MAAM,WAAW,SAAS;AAI1B,QAAI,UAAU,eACZ,YAAW,gBAAgB,SAAS;AAEtC,QAAI,UAAU,kBACZ,YAAW,mBAAmB,SAAS;;IAG3C,wBACU,UAAU;AAEpB,mBAAgB;AAChB,QAAK,UAAU,QAAQ,8CAA8C;IACnE,GAAG;IACH,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9D,CAAC;AACF,SAAM;IACN,2BACa;AAEb,OAAI,CAAC,cACH,MAAK,UAAU,QACb,4CACA,WACD;IAEH,CACH;;;;;CAMH,QACE,GAAG,MACiC;AACpC,SAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK;;;;;CAMtC,UACE,GAAG,MACmC;AACtC,SAAO,KAAK,QAAQ,UAAU,GAAG,KAAK;;;;;CAMxC,KACE,GAAG,MAC8B;AACjC,SAAO,KAAK,QAAQ,KAAK,GAAG,KAAK"}
1
+ {"version":3,"file":"telemetry-agent-runner.cjs","names":["InMemoryAgentRunner","telemetry"],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime — TelemetryAgentRunner:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * @copilotkit/runtime — TelemetryAgentRunnerConfig:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\n/**\n * TelemetryAgentRunner - A wrapper around AgentRunner that adds telemetry\n * for agent execution streams.\n *\n * This captures the following telemetry events:\n * - oss.runtime.agent_execution_stream_started - when an agent execution starts\n * - oss.runtime.agent_execution_stream_ended - when an agent execution completes\n * - oss.runtime.agent_execution_stream_errored - when an agent execution fails\n */\n\nimport { InMemoryAgentRunner } from \"../../../v2/runtime/runner\";\nimport type { AgentRunner } from \"../../../v2/runtime/runner\";\nimport { createHash } from \"node:crypto\";\nimport { tap, catchError, finalize } from \"rxjs\";\nimport telemetry from \"../telemetry-client\";\nimport type { AgentExecutionResponseInfo } from \"@copilotkit/shared/src/telemetry/events\";\nimport type { TelemetryCapture } from \"@copilotkit/shared\";\n\n/**\n * Configuration options for TelemetryAgentRunner\n */\nexport interface TelemetryAgentRunnerConfig {\n /**\n * The underlying runner to delegate to\n * If not provided, defaults to InMemoryAgentRunner\n */\n runner?: AgentRunner;\n\n /**\n * Optional LangSmith API key (will be hashed for telemetry)\n */\n langsmithApiKey?: string;\n\n /** Runtime-bound telemetry capture. Defaults to the legacy singleton. */\n telemetry?: TelemetryCapture;\n}\n\n/**\n * An AgentRunner wrapper that adds telemetry tracking for agent executions.\n *\n * Usage:\n * ```ts\n * const runtime = new CopilotRuntime({\n * runner: new TelemetryAgentRunner(),\n * // or with custom runner:\n * runner: new TelemetryAgentRunner({ runner: customRunner }),\n * });\n * ```\n */\nexport class TelemetryAgentRunner implements AgentRunner {\n private readonly _runner: AgentRunner;\n private readonly hashedLgcKey: string | undefined;\n private readonly telemetry: TelemetryCapture;\n\n constructor(config?: TelemetryAgentRunnerConfig) {\n this._runner = config?.runner ?? new InMemoryAgentRunner();\n this.telemetry = config?.telemetry ?? telemetry;\n this.hashedLgcKey = config?.langsmithApiKey\n ? createHash(\"sha256\").update(config.langsmithApiKey).digest(\"hex\")\n : undefined;\n }\n\n /**\n * Runs an agent with telemetry tracking.\n * Wraps the underlying runner's Observable stream with telemetry events.\n */\n run(...args: Parameters<AgentRunner[\"run\"]>): ReturnType<AgentRunner[\"run\"]> {\n const streamInfo: AgentExecutionResponseInfo = {\n hashedLgcKey: this.hashedLgcKey,\n };\n let streamErrored = false;\n\n // Capture stream started event\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_started\", {\n hashedLgcKey: this.hashedLgcKey,\n });\n\n // Delegate to the underlying runner and wrap with telemetry\n return this._runner.run(...args).pipe(\n // Extract metadata from events if available\n tap((event) => {\n // Try to extract provider/model info from raw events\n const rawEvent = (\n event as {\n rawEvent?: {\n metadata?: Record<string, unknown>;\n data?: Record<string, unknown>;\n };\n }\n ).rawEvent;\n if (rawEvent?.data) {\n const data = rawEvent.data as { output?: { model?: string } };\n if (data?.output?.model) {\n streamInfo.model = data.output.model;\n streamInfo.provider = data.output.model;\n }\n }\n if (rawEvent?.metadata) {\n const metadata = rawEvent.metadata as {\n langgraph_host?: string;\n langgraph_version?: string;\n };\n if (metadata?.langgraph_host) {\n streamInfo.langGraphHost = metadata.langgraph_host;\n }\n if (metadata?.langgraph_version) {\n streamInfo.langGraphVersion = metadata.langgraph_version;\n }\n }\n }),\n catchError((error) => {\n // Capture stream error event\n streamErrored = true;\n // Outcome only: the message can quote prompts, arguments or URLs.\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_errored\", {\n ...streamInfo,\n error: \"AGENT_EXECUTION_FAILED\",\n });\n throw error;\n }),\n finalize(() => {\n // Capture stream ended event (only if not errored)\n if (!streamErrored) {\n this.telemetry.capture(\n \"oss.runtime.agent_execution_stream_ended\",\n streamInfo,\n );\n }\n }),\n );\n }\n\n /**\n * Delegates to the underlying runner's connect method\n */\n connect(\n ...args: Parameters<AgentRunner[\"connect\"]>\n ): ReturnType<AgentRunner[\"connect\"]> {\n return this._runner.connect(...args);\n }\n\n /**\n * Delegates to the underlying runner's isRunning method\n */\n isRunning(\n ...args: Parameters<AgentRunner[\"isRunning\"]>\n ): ReturnType<AgentRunner[\"isRunning\"]> {\n return this._runner.isRunning(...args);\n }\n\n /**\n * Delegates to the underlying runner's stop method\n */\n stop(\n ...args: Parameters<AgentRunner[\"stop\"]>\n ): ReturnType<AgentRunner[\"stop\"]> {\n return this._runner.stop(...args);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyEA,IAAa,uBAAb,MAAyD;CAKvD,YAAY,QAAqC;AAC/C,OAAK,UAAU,QAAQ,UAAU,IAAIA,uCAAqB;AAC1D,OAAK,YAAY,QAAQ,aAAaC;AACtC,OAAK,eAAe,QAAQ,8CACb,SAAS,CAAC,OAAO,OAAO,gBAAgB,CAAC,OAAO,MAAM,GACjE;;;;;;CAON,IAAI,GAAG,MAAsE;EAC3E,MAAM,aAAyC,EAC7C,cAAc,KAAK,cACpB;EACD,IAAI,gBAAgB;AAGpB,OAAK,UAAU,QAAQ,8CAA8C,EACnE,cAAc,KAAK,cACpB,CAAC;AAGF,SAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,oBAE1B,UAAU;GAEb,MAAM,WACJ,MAMA;AACF,OAAI,UAAU,MAAM;IAClB,MAAM,OAAO,SAAS;AACtB,QAAI,MAAM,QAAQ,OAAO;AACvB,gBAAW,QAAQ,KAAK,OAAO;AAC/B,gBAAW,WAAW,KAAK,OAAO;;;AAGtC,OAAI,UAAU,UAAU;IACtB,MAAM,WAAW,SAAS;AAI1B,QAAI,UAAU,eACZ,YAAW,gBAAgB,SAAS;AAEtC,QAAI,UAAU,kBACZ,YAAW,mBAAmB,SAAS;;IAG3C,wBACU,UAAU;AAEpB,mBAAgB;AAEhB,QAAK,UAAU,QAAQ,8CAA8C;IACnE,GAAG;IACH,OAAO;IACR,CAAC;AACF,SAAM;IACN,2BACa;AAEb,OAAI,CAAC,cACH,MAAK,UAAU,QACb,4CACA,WACD;IAEH,CACH;;;;;CAMH,QACE,GAAG,MACiC;AACpC,SAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK;;;;;CAMtC,UACE,GAAG,MACmC;AACtC,SAAO,KAAK,QAAQ,UAAU,GAAG,KAAK;;;;;CAMxC,KACE,GAAG,MAC8B;AACjC,SAAO,KAAK,QAAQ,KAAK,GAAG,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-agent-runner.d.cts","names":[],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"mappings":";;;;;;;;;UA6CiB,0BAAA;EAA0B;;;;EAKzC,MAAA,GAAS,WAAA;EAKT;;;EAAA,eAAA;EAG4B;EAA5B,SAAA,GAAY,gBAAA;AAAA;;;;;;;;;;;;;cAeD,oBAAA,YAAgC,WAAA;EAAA,iBAC1B,OAAA;EAAA,iBACA,YAAA;EAAA,iBACA,SAAA;cAEL,MAAA,GAAS,0BAAA;EAoGlB;;;;EAxFH,GAAA,CAAA,GAAO,IAAA,EAAM,UAAA,CAAW,WAAA,WAAsB,UAAA,CAAW,WAAA;EAhBxC;;;EAoFjB,OAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,eACnB,UAAA,CAAW,WAAA;EAlFO;;;EAyFrB,SAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,iBACnB,UAAA,CAAW,WAAA;EA/ED;;;EAsFb,IAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,YACnB,UAAA,CAAW,WAAA;AAAA"}
1
+ {"version":3,"file":"telemetry-agent-runner.d.cts","names":[],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"mappings":";;;;;;;;;UA6CiB,0BAAA;EAA0B;;;;EAKzC,MAAA,GAAS,WAAA;EAKT;;;EAAA,eAAA;EAG4B;EAA5B,SAAA,GAAY,gBAAA;AAAA;;;;;;;;;;;;;cAeD,oBAAA,YAAgC,WAAA;EAAA,iBAC1B,OAAA;EAAA,iBACA,YAAA;EAAA,iBACA,SAAA;cAEL,MAAA,GAAS,0BAAA;EAqGlB;;;;EAzFH,GAAA,CAAA,GAAO,IAAA,EAAM,UAAA,CAAW,WAAA,WAAsB,UAAA,CAAW,WAAA;EAhBxC;;;EAqFjB,OAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,eACnB,UAAA,CAAW,WAAA;EAnFO;;;EA0FrB,SAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,iBACnB,UAAA,CAAW,WAAA;EAhFD;;;EAuFb,IAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,YACnB,UAAA,CAAW,WAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-agent-runner.d.mts","names":[],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"mappings":";;;;;;;;;UA6CiB,0BAAA;EAA0B;;;;EAKzC,MAAA,GAAS,WAAA;EAKT;;;EAAA,eAAA;EAG4B;EAA5B,SAAA,GAAY,gBAAA;AAAA;;;;;;;;;;;;;cAeD,oBAAA,YAAgC,WAAA;EAAA,iBAC1B,OAAA;EAAA,iBACA,YAAA;EAAA,iBACA,SAAA;cAEL,MAAA,GAAS,0BAAA;EAoGlB;;;;EAxFH,GAAA,CAAA,GAAO,IAAA,EAAM,UAAA,CAAW,WAAA,WAAsB,UAAA,CAAW,WAAA;EAhBxC;;;EAoFjB,OAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,eACnB,UAAA,CAAW,WAAA;EAlFO;;;EAyFrB,SAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,iBACnB,UAAA,CAAW,WAAA;EA/ED;;;EAsFb,IAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,YACnB,UAAA,CAAW,WAAA;AAAA"}
1
+ {"version":3,"file":"telemetry-agent-runner.d.mts","names":[],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"mappings":";;;;;;;;;UA6CiB,0BAAA;EAA0B;;;;EAKzC,MAAA,GAAS,WAAA;EAKT;;;EAAA,eAAA;EAG4B;EAA5B,SAAA,GAAY,gBAAA;AAAA;;;;;;;;;;;;;cAeD,oBAAA,YAAgC,WAAA;EAAA,iBAC1B,OAAA;EAAA,iBACA,YAAA;EAAA,iBACA,SAAA;cAEL,MAAA,GAAS,0BAAA;EAqGlB;;;;EAzFH,GAAA,CAAA,GAAO,IAAA,EAAM,UAAA,CAAW,WAAA,WAAsB,UAAA,CAAW,WAAA;EAhBxC;;;EAqFjB,OAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,eACnB,UAAA,CAAW,WAAA;EAnFO;;;EA0FrB,SAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,iBACnB,UAAA,CAAW,WAAA;EAhFD;;;EAuFb,IAAA,CAAA,GACK,IAAA,EAAM,UAAA,CAAW,WAAA,YACnB,UAAA,CAAW,WAAA;AAAA"}
@@ -58,7 +58,7 @@ var TelemetryAgentRunner = class {
58
58
  streamErrored = true;
59
59
  this.telemetry.capture("oss.runtime.agent_execution_stream_errored", {
60
60
  ...streamInfo,
61
- error: error instanceof Error ? error.message : String(error)
61
+ error: "AGENT_EXECUTION_FAILED"
62
62
  });
63
63
  throw error;
64
64
  }), finalize(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-agent-runner.mjs","names":["telemetry"],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime — TelemetryAgentRunner:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * @copilotkit/runtime — TelemetryAgentRunnerConfig:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\n/**\n * TelemetryAgentRunner - A wrapper around AgentRunner that adds telemetry\n * for agent execution streams.\n *\n * This captures the following telemetry events:\n * - oss.runtime.agent_execution_stream_started - when an agent execution starts\n * - oss.runtime.agent_execution_stream_ended - when an agent execution completes\n * - oss.runtime.agent_execution_stream_errored - when an agent execution fails\n */\n\nimport { InMemoryAgentRunner } from \"../../../v2/runtime/runner\";\nimport type { AgentRunner } from \"../../../v2/runtime/runner\";\nimport { createHash } from \"node:crypto\";\nimport { tap, catchError, finalize } from \"rxjs\";\nimport telemetry from \"../telemetry-client\";\nimport type { AgentExecutionResponseInfo } from \"@copilotkit/shared/src/telemetry/events\";\nimport type { TelemetryCapture } from \"@copilotkit/shared\";\n\n/**\n * Configuration options for TelemetryAgentRunner\n */\nexport interface TelemetryAgentRunnerConfig {\n /**\n * The underlying runner to delegate to\n * If not provided, defaults to InMemoryAgentRunner\n */\n runner?: AgentRunner;\n\n /**\n * Optional LangSmith API key (will be hashed for telemetry)\n */\n langsmithApiKey?: string;\n\n /** Runtime-bound telemetry capture. Defaults to the legacy singleton. */\n telemetry?: TelemetryCapture;\n}\n\n/**\n * An AgentRunner wrapper that adds telemetry tracking for agent executions.\n *\n * Usage:\n * ```ts\n * const runtime = new CopilotRuntime({\n * runner: new TelemetryAgentRunner(),\n * // or with custom runner:\n * runner: new TelemetryAgentRunner({ runner: customRunner }),\n * });\n * ```\n */\nexport class TelemetryAgentRunner implements AgentRunner {\n private readonly _runner: AgentRunner;\n private readonly hashedLgcKey: string | undefined;\n private readonly telemetry: TelemetryCapture;\n\n constructor(config?: TelemetryAgentRunnerConfig) {\n this._runner = config?.runner ?? new InMemoryAgentRunner();\n this.telemetry = config?.telemetry ?? telemetry;\n this.hashedLgcKey = config?.langsmithApiKey\n ? createHash(\"sha256\").update(config.langsmithApiKey).digest(\"hex\")\n : undefined;\n }\n\n /**\n * Runs an agent with telemetry tracking.\n * Wraps the underlying runner's Observable stream with telemetry events.\n */\n run(...args: Parameters<AgentRunner[\"run\"]>): ReturnType<AgentRunner[\"run\"]> {\n const streamInfo: AgentExecutionResponseInfo = {\n hashedLgcKey: this.hashedLgcKey,\n };\n let streamErrored = false;\n\n // Capture stream started event\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_started\", {\n hashedLgcKey: this.hashedLgcKey,\n });\n\n // Delegate to the underlying runner and wrap with telemetry\n return this._runner.run(...args).pipe(\n // Extract metadata from events if available\n tap((event) => {\n // Try to extract provider/model info from raw events\n const rawEvent = (\n event as {\n rawEvent?: {\n metadata?: Record<string, unknown>;\n data?: Record<string, unknown>;\n };\n }\n ).rawEvent;\n if (rawEvent?.data) {\n const data = rawEvent.data as { output?: { model?: string } };\n if (data?.output?.model) {\n streamInfo.model = data.output.model;\n streamInfo.provider = data.output.model;\n }\n }\n if (rawEvent?.metadata) {\n const metadata = rawEvent.metadata as {\n langgraph_host?: string;\n langgraph_version?: string;\n };\n if (metadata?.langgraph_host) {\n streamInfo.langGraphHost = metadata.langgraph_host;\n }\n if (metadata?.langgraph_version) {\n streamInfo.langGraphVersion = metadata.langgraph_version;\n }\n }\n }),\n catchError((error) => {\n // Capture stream error event\n streamErrored = true;\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_errored\", {\n ...streamInfo,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }),\n finalize(() => {\n // Capture stream ended event (only if not errored)\n if (!streamErrored) {\n this.telemetry.capture(\n \"oss.runtime.agent_execution_stream_ended\",\n streamInfo,\n );\n }\n }),\n );\n }\n\n /**\n * Delegates to the underlying runner's connect method\n */\n connect(\n ...args: Parameters<AgentRunner[\"connect\"]>\n ): ReturnType<AgentRunner[\"connect\"]> {\n return this._runner.connect(...args);\n }\n\n /**\n * Delegates to the underlying runner's isRunning method\n */\n isRunning(\n ...args: Parameters<AgentRunner[\"isRunning\"]>\n ): ReturnType<AgentRunner[\"isRunning\"]> {\n return this._runner.isRunning(...args);\n }\n\n /**\n * Delegates to the underlying runner's stop method\n */\n stop(\n ...args: Parameters<AgentRunner[\"stop\"]>\n ): ReturnType<AgentRunner[\"stop\"]> {\n return this._runner.stop(...args);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyEA,IAAa,uBAAb,MAAyD;CAKvD,YAAY,QAAqC;AAC/C,OAAK,UAAU,QAAQ,UAAU,IAAI,qBAAqB;AAC1D,OAAK,YAAY,QAAQ,aAAaA;AACtC,OAAK,eAAe,QAAQ,kBACxB,WAAW,SAAS,CAAC,OAAO,OAAO,gBAAgB,CAAC,OAAO,MAAM,GACjE;;;;;;CAON,IAAI,GAAG,MAAsE;EAC3E,MAAM,aAAyC,EAC7C,cAAc,KAAK,cACpB;EACD,IAAI,gBAAgB;AAGpB,OAAK,UAAU,QAAQ,8CAA8C,EACnE,cAAc,KAAK,cACpB,CAAC;AAGF,SAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,KAE/B,KAAK,UAAU;GAEb,MAAM,WACJ,MAMA;AACF,OAAI,UAAU,MAAM;IAClB,MAAM,OAAO,SAAS;AACtB,QAAI,MAAM,QAAQ,OAAO;AACvB,gBAAW,QAAQ,KAAK,OAAO;AAC/B,gBAAW,WAAW,KAAK,OAAO;;;AAGtC,OAAI,UAAU,UAAU;IACtB,MAAM,WAAW,SAAS;AAI1B,QAAI,UAAU,eACZ,YAAW,gBAAgB,SAAS;AAEtC,QAAI,UAAU,kBACZ,YAAW,mBAAmB,SAAS;;IAG3C,EACF,YAAY,UAAU;AAEpB,mBAAgB;AAChB,QAAK,UAAU,QAAQ,8CAA8C;IACnE,GAAG;IACH,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9D,CAAC;AACF,SAAM;IACN,EACF,eAAe;AAEb,OAAI,CAAC,cACH,MAAK,UAAU,QACb,4CACA,WACD;IAEH,CACH;;;;;CAMH,QACE,GAAG,MACiC;AACpC,SAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK;;;;;CAMtC,UACE,GAAG,MACmC;AACtC,SAAO,KAAK,QAAQ,UAAU,GAAG,KAAK;;;;;CAMxC,KACE,GAAG,MAC8B;AACjC,SAAO,KAAK,QAAQ,KAAK,GAAG,KAAK"}
1
+ {"version":3,"file":"telemetry-agent-runner.mjs","names":["telemetry"],"sources":["../../../../src/v1-deprecated/lib/runtime/telemetry-agent-runner.ts"],"sourcesContent":["/*\n * V1 SDK DEPRECATED. USE V2 INSTEAD\n *\n * This file defines public v1 SDK exports. Use the exact v2 mappings below.\n * AI CODING AGENTS: Never copy, suggest, or generate these v1 APIs. Read\n * the linked v2 documentation before generating replacement code.\n *\n * @copilotkit/runtime — TelemetryAgentRunner:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * @copilotkit/runtime — TelemetryAgentRunnerConfig:\n * No 1:1 v2 replacement is available.\n * Start at: @copilotkit/runtime/v2\n * V2 docs: https://docs.copilotkit.ai/\n * V2 reference docs: https://docs.copilotkit.ai/reference/v2\n *\n * Migration guide: https://docs.copilotkit.ai/migrate/v2\n *\n * END V1 SDK DEPRECATED. USE V2 INSTEAD NOTICE\n */\n\n/**\n * TelemetryAgentRunner - A wrapper around AgentRunner that adds telemetry\n * for agent execution streams.\n *\n * This captures the following telemetry events:\n * - oss.runtime.agent_execution_stream_started - when an agent execution starts\n * - oss.runtime.agent_execution_stream_ended - when an agent execution completes\n * - oss.runtime.agent_execution_stream_errored - when an agent execution fails\n */\n\nimport { InMemoryAgentRunner } from \"../../../v2/runtime/runner\";\nimport type { AgentRunner } from \"../../../v2/runtime/runner\";\nimport { createHash } from \"node:crypto\";\nimport { tap, catchError, finalize } from \"rxjs\";\nimport telemetry from \"../telemetry-client\";\nimport type { AgentExecutionResponseInfo } from \"@copilotkit/shared/src/telemetry/events\";\nimport type { TelemetryCapture } from \"@copilotkit/shared\";\n\n/**\n * Configuration options for TelemetryAgentRunner\n */\nexport interface TelemetryAgentRunnerConfig {\n /**\n * The underlying runner to delegate to\n * If not provided, defaults to InMemoryAgentRunner\n */\n runner?: AgentRunner;\n\n /**\n * Optional LangSmith API key (will be hashed for telemetry)\n */\n langsmithApiKey?: string;\n\n /** Runtime-bound telemetry capture. Defaults to the legacy singleton. */\n telemetry?: TelemetryCapture;\n}\n\n/**\n * An AgentRunner wrapper that adds telemetry tracking for agent executions.\n *\n * Usage:\n * ```ts\n * const runtime = new CopilotRuntime({\n * runner: new TelemetryAgentRunner(),\n * // or with custom runner:\n * runner: new TelemetryAgentRunner({ runner: customRunner }),\n * });\n * ```\n */\nexport class TelemetryAgentRunner implements AgentRunner {\n private readonly _runner: AgentRunner;\n private readonly hashedLgcKey: string | undefined;\n private readonly telemetry: TelemetryCapture;\n\n constructor(config?: TelemetryAgentRunnerConfig) {\n this._runner = config?.runner ?? new InMemoryAgentRunner();\n this.telemetry = config?.telemetry ?? telemetry;\n this.hashedLgcKey = config?.langsmithApiKey\n ? createHash(\"sha256\").update(config.langsmithApiKey).digest(\"hex\")\n : undefined;\n }\n\n /**\n * Runs an agent with telemetry tracking.\n * Wraps the underlying runner's Observable stream with telemetry events.\n */\n run(...args: Parameters<AgentRunner[\"run\"]>): ReturnType<AgentRunner[\"run\"]> {\n const streamInfo: AgentExecutionResponseInfo = {\n hashedLgcKey: this.hashedLgcKey,\n };\n let streamErrored = false;\n\n // Capture stream started event\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_started\", {\n hashedLgcKey: this.hashedLgcKey,\n });\n\n // Delegate to the underlying runner and wrap with telemetry\n return this._runner.run(...args).pipe(\n // Extract metadata from events if available\n tap((event) => {\n // Try to extract provider/model info from raw events\n const rawEvent = (\n event as {\n rawEvent?: {\n metadata?: Record<string, unknown>;\n data?: Record<string, unknown>;\n };\n }\n ).rawEvent;\n if (rawEvent?.data) {\n const data = rawEvent.data as { output?: { model?: string } };\n if (data?.output?.model) {\n streamInfo.model = data.output.model;\n streamInfo.provider = data.output.model;\n }\n }\n if (rawEvent?.metadata) {\n const metadata = rawEvent.metadata as {\n langgraph_host?: string;\n langgraph_version?: string;\n };\n if (metadata?.langgraph_host) {\n streamInfo.langGraphHost = metadata.langgraph_host;\n }\n if (metadata?.langgraph_version) {\n streamInfo.langGraphVersion = metadata.langgraph_version;\n }\n }\n }),\n catchError((error) => {\n // Capture stream error event\n streamErrored = true;\n // Outcome only: the message can quote prompts, arguments or URLs.\n this.telemetry.capture(\"oss.runtime.agent_execution_stream_errored\", {\n ...streamInfo,\n error: \"AGENT_EXECUTION_FAILED\",\n });\n throw error;\n }),\n finalize(() => {\n // Capture stream ended event (only if not errored)\n if (!streamErrored) {\n this.telemetry.capture(\n \"oss.runtime.agent_execution_stream_ended\",\n streamInfo,\n );\n }\n }),\n );\n }\n\n /**\n * Delegates to the underlying runner's connect method\n */\n connect(\n ...args: Parameters<AgentRunner[\"connect\"]>\n ): ReturnType<AgentRunner[\"connect\"]> {\n return this._runner.connect(...args);\n }\n\n /**\n * Delegates to the underlying runner's isRunning method\n */\n isRunning(\n ...args: Parameters<AgentRunner[\"isRunning\"]>\n ): ReturnType<AgentRunner[\"isRunning\"]> {\n return this._runner.isRunning(...args);\n }\n\n /**\n * Delegates to the underlying runner's stop method\n */\n stop(\n ...args: Parameters<AgentRunner[\"stop\"]>\n ): ReturnType<AgentRunner[\"stop\"]> {\n return this._runner.stop(...args);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyEA,IAAa,uBAAb,MAAyD;CAKvD,YAAY,QAAqC;AAC/C,OAAK,UAAU,QAAQ,UAAU,IAAI,qBAAqB;AAC1D,OAAK,YAAY,QAAQ,aAAaA;AACtC,OAAK,eAAe,QAAQ,kBACxB,WAAW,SAAS,CAAC,OAAO,OAAO,gBAAgB,CAAC,OAAO,MAAM,GACjE;;;;;;CAON,IAAI,GAAG,MAAsE;EAC3E,MAAM,aAAyC,EAC7C,cAAc,KAAK,cACpB;EACD,IAAI,gBAAgB;AAGpB,OAAK,UAAU,QAAQ,8CAA8C,EACnE,cAAc,KAAK,cACpB,CAAC;AAGF,SAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,CAAC,KAE/B,KAAK,UAAU;GAEb,MAAM,WACJ,MAMA;AACF,OAAI,UAAU,MAAM;IAClB,MAAM,OAAO,SAAS;AACtB,QAAI,MAAM,QAAQ,OAAO;AACvB,gBAAW,QAAQ,KAAK,OAAO;AAC/B,gBAAW,WAAW,KAAK,OAAO;;;AAGtC,OAAI,UAAU,UAAU;IACtB,MAAM,WAAW,SAAS;AAI1B,QAAI,UAAU,eACZ,YAAW,gBAAgB,SAAS;AAEtC,QAAI,UAAU,kBACZ,YAAW,mBAAmB,SAAS;;IAG3C,EACF,YAAY,UAAU;AAEpB,mBAAgB;AAEhB,QAAK,UAAU,QAAQ,8CAA8C;IACnE,GAAG;IACH,OAAO;IACR,CAAC;AACF,SAAM;IACN,EACF,eAAe;AAEb,OAAI,CAAC,cACH,MAAK,UAAU,QACb,4CACA,WACD;IAEH,CACH;;;;;CAMH,QACE,GAAG,MACiC;AACpC,SAAO,KAAK,QAAQ,QAAQ,GAAG,KAAK;;;;;CAMtC,UACE,GAAG,MACmC;AACtC,SAAO,KAAK,QAAQ,UAAU,GAAG,KAAK;;;;;CAMxC,KACE,GAAG,MAC8B;AACjC,SAAO,KAAK,QAAQ,KAAK,GAAG,KAAK"}
@@ -12,6 +12,17 @@ const telemetryClient = new _copilotkit_shared_telemetry.TelemetryClient({
12
12
  packageName: packageJson.name,
13
13
  packageVersion: packageJson.version
14
14
  });
15
+ /**
16
+ * The configured agents, counted without touching `runtime.instance`. Every
17
+ * v1 endpoint captures telemetry before it calls `handleServiceAdapter`, and
18
+ * reading the instance there builds the v2 runtime with these agents, so the
19
+ * per-request factory `handleServiceAdapter` installs afterwards was never
20
+ * used and no v1 `actions` or `mcpServers` tool reached an agent.
21
+ */
22
+ function countConfiguredAgents(agents) {
23
+ if (!agents || typeof agents !== "object" || "then" in agents) return 0;
24
+ return Object.keys(agents).length;
25
+ }
15
26
  function getRuntimeInstanceTelemetryInfo(options) {
16
27
  const runtime = options.runtime;
17
28
  const remoteEndpoints = runtime.params?.remoteEndpoints ?? [];
@@ -42,7 +53,7 @@ function getRuntimeInstanceTelemetryInfo(options) {
42
53
  actionsAmount: runtime.params?.actions?.length ?? 0,
43
54
  endpointsAmount: remoteEndpoints.length,
44
55
  endpointTypes: endpointsInfo.endpointTypes,
45
- agentsAmount: Object.keys(runtime.instance.agents).length,
56
+ agentsAmount: countConfiguredAgents(runtime.params?.agents),
46
57
  hashedLgcKey: endpointsInfo.hashedKey,
47
58
  "cloud.api_key_provided": apiKeyProvided,
48
59
  ...apiKeyProvided ? { "cloud.public_api_key": publicApiKey } : {},
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-client.cjs","names":["TelemetryClient","resolveEndpointType","EndpointType"],"sources":["../../../src/v1-deprecated/lib/telemetry-client.ts"],"sourcesContent":["import { TelemetryClient } from \"@copilotkit/shared/telemetry\";\nimport { createHash } from \"node:crypto\";\nimport { CopilotRuntime, resolveEndpointType } from \"./runtime/copilot-runtime\";\nimport type { RuntimeInstanceCreatedInfo } from \"@copilotkit/shared/src/telemetry/events\";\nimport type { CreateCopilotRuntimeServerOptions } from \"./integrations/shared\";\nimport type { LangGraphPlatformEndpoint } from \"./runtime/types\";\nimport { EndpointType } from \"./runtime/types\";\nconst packageJson = require(\"../../../package.json\");\n\nconst telemetryClient = new TelemetryClient({\n packageName: packageJson.name,\n packageVersion: packageJson.version,\n});\n\nexport function getRuntimeInstanceTelemetryInfo(\n options: CreateCopilotRuntimeServerOptions,\n): RuntimeInstanceCreatedInfo {\n const runtime = options.runtime;\n const remoteEndpoints = runtime.params?.remoteEndpoints ?? [];\n const endpointsInfo = remoteEndpoints.reduce(\n (acc, endpoint) => {\n let info = { ...acc };\n\n const endpointType = resolveEndpointType(endpoint);\n if (!info.endpointTypes.includes(endpointType)) {\n info = {\n ...info,\n endpointTypes: [...info.endpointTypes, endpointType],\n };\n }\n\n if (endpointType === EndpointType.LangGraphPlatform) {\n // When type is resolved, recreating a const with casting of type\n const ep = endpoint as LangGraphPlatformEndpoint;\n info = {\n ...info,\n agentsAmount: ep.agents.length,\n hashedKey: ep.langsmithApiKey\n ? createHash(\"sha256\").update(ep.langsmithApiKey).digest(\"hex\")\n : null,\n };\n }\n\n return info;\n },\n { endpointTypes: [], agentsAmount: null, hashedKey: null },\n );\n\n // Get public API key from options.cloud.publicApiKey\n const publicApiKey = options.cloud?.publicApiKey;\n const apiKeyProvided = !!publicApiKey && publicApiKey.trim().length > 0;\n\n return {\n actionsAmount: runtime.params?.actions?.length ?? 0,\n endpointsAmount: remoteEndpoints.length,\n endpointTypes: endpointsInfo.endpointTypes,\n agentsAmount: Object.keys(runtime.instance.agents).length,\n hashedLgcKey: endpointsInfo.hashedKey,\n \"cloud.api_key_provided\": apiKeyProvided,\n ...(apiKeyProvided ? { \"cloud.public_api_key\": publicApiKey } : {}),\n ...(options.cloud?.baseUrl\n ? { \"cloud.base_url\": options.cloud.baseUrl }\n : {}),\n } as RuntimeInstanceCreatedInfo;\n}\n\nexport default telemetryClient;\n"],"mappings":";;;;;;;;;AAOA,MAAM;AAEN,MAAM,kBAAkB,IAAIA,6CAAgB;CAC1C,aAAa,YAAY;CACzB,gBAAgB,YAAY;CAC7B,CAAC;AAEF,SAAgB,gCACd,SAC4B;CAC5B,MAAM,UAAU,QAAQ;CACxB,MAAM,kBAAkB,QAAQ,QAAQ,mBAAmB,EAAE;CAC7D,MAAM,gBAAgB,gBAAgB,QACnC,KAAK,aAAa;EACjB,IAAI,OAAO,EAAE,GAAG,KAAK;EAErB,MAAM,eAAeC,4CAAoB,SAAS;AAClD,MAAI,CAAC,KAAK,cAAc,SAAS,aAAa,CAC5C,QAAO;GACL,GAAG;GACH,eAAe,CAAC,GAAG,KAAK,eAAe,aAAa;GACrD;AAGH,MAAI,iBAAiBC,2BAAa,mBAAmB;GAEnD,MAAM,KAAK;AACX,UAAO;IACL,GAAG;IACH,cAAc,GAAG,OAAO;IACxB,WAAW,GAAG,8CACC,SAAS,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,MAAM,GAC7D;IACL;;AAGH,SAAO;IAET;EAAE,eAAe,EAAE;EAAE,cAAc;EAAM,WAAW;EAAM,CAC3D;CAGD,MAAM,eAAe,QAAQ,OAAO;CACpC,MAAM,iBAAiB,CAAC,CAAC,gBAAgB,aAAa,MAAM,CAAC,SAAS;AAEtE,QAAO;EACL,eAAe,QAAQ,QAAQ,SAAS,UAAU;EAClD,iBAAiB,gBAAgB;EACjC,eAAe,cAAc;EAC7B,cAAc,OAAO,KAAK,QAAQ,SAAS,OAAO,CAAC;EACnD,cAAc,cAAc;EAC5B,0BAA0B;EAC1B,GAAI,iBAAiB,EAAE,wBAAwB,cAAc,GAAG,EAAE;EAClE,GAAI,QAAQ,OAAO,UACf,EAAE,kBAAkB,QAAQ,MAAM,SAAS,GAC3C,EAAE;EACP"}
1
+ {"version":3,"file":"telemetry-client.cjs","names":["TelemetryClient","resolveEndpointType","EndpointType"],"sources":["../../../src/v1-deprecated/lib/telemetry-client.ts"],"sourcesContent":["import { TelemetryClient } from \"@copilotkit/shared/telemetry\";\nimport { createHash } from \"node:crypto\";\nimport { CopilotRuntime, resolveEndpointType } from \"./runtime/copilot-runtime\";\nimport type { RuntimeInstanceCreatedInfo } from \"@copilotkit/shared/src/telemetry/events\";\nimport type { CreateCopilotRuntimeServerOptions } from \"./integrations/shared\";\nimport type { LangGraphPlatformEndpoint } from \"./runtime/types\";\nimport { EndpointType } from \"./runtime/types\";\nconst packageJson = require(\"../../../package.json\");\n\nconst telemetryClient = new TelemetryClient({\n packageName: packageJson.name,\n packageVersion: packageJson.version,\n});\n\n/**\n * The configured agents, counted without touching `runtime.instance`. Every\n * v1 endpoint captures telemetry before it calls `handleServiceAdapter`, and\n * reading the instance there builds the v2 runtime with these agents, so the\n * per-request factory `handleServiceAdapter` installs afterwards was never\n * used and no v1 `actions` or `mcpServers` tool reached an agent.\n */\nfunction countConfiguredAgents(agents: unknown): number {\n if (!agents || typeof agents !== \"object\" || \"then\" in agents) {\n return 0;\n }\n return Object.keys(agents).length;\n}\n\nexport function getRuntimeInstanceTelemetryInfo(\n options: CreateCopilotRuntimeServerOptions,\n): RuntimeInstanceCreatedInfo {\n const runtime = options.runtime;\n const remoteEndpoints = runtime.params?.remoteEndpoints ?? [];\n const endpointsInfo = remoteEndpoints.reduce(\n (acc, endpoint) => {\n let info = { ...acc };\n\n const endpointType = resolveEndpointType(endpoint);\n if (!info.endpointTypes.includes(endpointType)) {\n info = {\n ...info,\n endpointTypes: [...info.endpointTypes, endpointType],\n };\n }\n\n if (endpointType === EndpointType.LangGraphPlatform) {\n // When type is resolved, recreating a const with casting of type\n const ep = endpoint as LangGraphPlatformEndpoint;\n info = {\n ...info,\n agentsAmount: ep.agents.length,\n hashedKey: ep.langsmithApiKey\n ? createHash(\"sha256\").update(ep.langsmithApiKey).digest(\"hex\")\n : null,\n };\n }\n\n return info;\n },\n { endpointTypes: [], agentsAmount: null, hashedKey: null },\n );\n\n // Get public API key from options.cloud.publicApiKey\n const publicApiKey = options.cloud?.publicApiKey;\n const apiKeyProvided = !!publicApiKey && publicApiKey.trim().length > 0;\n\n return {\n actionsAmount: runtime.params?.actions?.length ?? 0,\n endpointsAmount: remoteEndpoints.length,\n endpointTypes: endpointsInfo.endpointTypes,\n agentsAmount: countConfiguredAgents(runtime.params?.agents),\n hashedLgcKey: endpointsInfo.hashedKey,\n \"cloud.api_key_provided\": apiKeyProvided,\n ...(apiKeyProvided ? { \"cloud.public_api_key\": publicApiKey } : {}),\n ...(options.cloud?.baseUrl\n ? { \"cloud.base_url\": options.cloud.baseUrl }\n : {}),\n } as RuntimeInstanceCreatedInfo;\n}\n\nexport default telemetryClient;\n"],"mappings":";;;;;;;;;AAOA,MAAM;AAEN,MAAM,kBAAkB,IAAIA,6CAAgB;CAC1C,aAAa,YAAY;CACzB,gBAAgB,YAAY;CAC7B,CAAC;;;;;;;;AASF,SAAS,sBAAsB,QAAyB;AACtD,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,UAAU,OACrD,QAAO;AAET,QAAO,OAAO,KAAK,OAAO,CAAC;;AAG7B,SAAgB,gCACd,SAC4B;CAC5B,MAAM,UAAU,QAAQ;CACxB,MAAM,kBAAkB,QAAQ,QAAQ,mBAAmB,EAAE;CAC7D,MAAM,gBAAgB,gBAAgB,QACnC,KAAK,aAAa;EACjB,IAAI,OAAO,EAAE,GAAG,KAAK;EAErB,MAAM,eAAeC,4CAAoB,SAAS;AAClD,MAAI,CAAC,KAAK,cAAc,SAAS,aAAa,CAC5C,QAAO;GACL,GAAG;GACH,eAAe,CAAC,GAAG,KAAK,eAAe,aAAa;GACrD;AAGH,MAAI,iBAAiBC,2BAAa,mBAAmB;GAEnD,MAAM,KAAK;AACX,UAAO;IACL,GAAG;IACH,cAAc,GAAG,OAAO;IACxB,WAAW,GAAG,8CACC,SAAS,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,MAAM,GAC7D;IACL;;AAGH,SAAO;IAET;EAAE,eAAe,EAAE;EAAE,cAAc;EAAM,WAAW;EAAM,CAC3D;CAGD,MAAM,eAAe,QAAQ,OAAO;CACpC,MAAM,iBAAiB,CAAC,CAAC,gBAAgB,aAAa,MAAM,CAAC,SAAS;AAEtE,QAAO;EACL,eAAe,QAAQ,QAAQ,SAAS,UAAU;EAClD,iBAAiB,gBAAgB;EACjC,eAAe,cAAc;EAC7B,cAAc,sBAAsB,QAAQ,QAAQ,OAAO;EAC3D,cAAc,cAAc;EAC5B,0BAA0B;EAC1B,GAAI,iBAAiB,EAAE,wBAAwB,cAAc,GAAG,EAAE;EAClE,GAAI,QAAQ,OAAO,UACf,EAAE,kBAAkB,QAAQ,MAAM,SAAS,GAC3C,EAAE;EACP"}