@copilotkit/runtime 1.56.2 → 1.56.4

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 (181) hide show
  1. package/dist/graphql/resolvers/copilot.resolver.cjs +2 -1
  2. package/dist/graphql/resolvers/copilot.resolver.cjs.map +1 -1
  3. package/dist/graphql/resolvers/copilot.resolver.mjs +2 -1
  4. package/dist/graphql/resolvers/copilot.resolver.mjs.map +1 -1
  5. package/dist/graphql/resolvers/resolve-message-id.cjs +19 -0
  6. package/dist/graphql/resolvers/resolve-message-id.cjs.map +1 -0
  7. package/dist/graphql/resolvers/resolve-message-id.mjs +18 -0
  8. package/dist/graphql/resolvers/resolve-message-id.mjs.map +1 -0
  9. package/dist/lib/runtime/copilot-runtime.cjs +4 -2
  10. package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
  11. package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
  12. package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
  13. package/dist/lib/runtime/copilot-runtime.mjs +4 -2
  14. package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
  15. package/dist/package.cjs +2 -2
  16. package/dist/package.mjs +2 -2
  17. package/dist/v2/index.d.cts +2 -2
  18. package/dist/v2/index.d.mts +2 -2
  19. package/dist/v2/runtime/core/debug-event-bus.cjs +36 -0
  20. package/dist/v2/runtime/core/debug-event-bus.cjs.map +1 -0
  21. package/dist/v2/runtime/core/debug-event-bus.d.cts +19 -0
  22. package/dist/v2/runtime/core/debug-event-bus.d.cts.map +1 -0
  23. package/dist/v2/runtime/core/debug-event-bus.d.mts +19 -0
  24. package/dist/v2/runtime/core/debug-event-bus.d.mts.map +1 -0
  25. package/dist/v2/runtime/core/debug-event-bus.mjs +35 -0
  26. package/dist/v2/runtime/core/debug-event-bus.mjs.map +1 -0
  27. package/dist/v2/runtime/core/fetch-handler.cjs +8 -0
  28. package/dist/v2/runtime/core/fetch-handler.cjs.map +1 -1
  29. package/dist/v2/runtime/core/fetch-handler.d.cts.map +1 -1
  30. package/dist/v2/runtime/core/fetch-handler.d.mts.map +1 -1
  31. package/dist/v2/runtime/core/fetch-handler.mjs +8 -0
  32. package/dist/v2/runtime/core/fetch-handler.mjs.map +1 -1
  33. package/dist/v2/runtime/core/fetch-router.cjs +1 -0
  34. package/dist/v2/runtime/core/fetch-router.cjs.map +1 -1
  35. package/dist/v2/runtime/core/fetch-router.mjs +1 -0
  36. package/dist/v2/runtime/core/fetch-router.mjs.map +1 -1
  37. package/dist/v2/runtime/core/hooks.cjs.map +1 -1
  38. package/dist/v2/runtime/core/hooks.d.cts +2 -0
  39. package/dist/v2/runtime/core/hooks.d.cts.map +1 -1
  40. package/dist/v2/runtime/core/hooks.d.mts +2 -0
  41. package/dist/v2/runtime/core/hooks.d.mts.map +1 -1
  42. package/dist/v2/runtime/core/hooks.mjs.map +1 -1
  43. package/dist/v2/runtime/core/runtime.cjs +5 -0
  44. package/dist/v2/runtime/core/runtime.cjs.map +1 -1
  45. package/dist/v2/runtime/core/runtime.d.cts +5 -0
  46. package/dist/v2/runtime/core/runtime.d.cts.map +1 -1
  47. package/dist/v2/runtime/core/runtime.d.mts +5 -1
  48. package/dist/v2/runtime/core/runtime.d.mts.map +1 -1
  49. package/dist/v2/runtime/core/runtime.mjs +5 -0
  50. package/dist/v2/runtime/core/runtime.mjs.map +1 -1
  51. package/dist/v2/runtime/handlers/handle-connect.cjs +3 -2
  52. package/dist/v2/runtime/handlers/handle-connect.cjs.map +1 -1
  53. package/dist/v2/runtime/handlers/handle-connect.mjs +3 -2
  54. package/dist/v2/runtime/handlers/handle-connect.mjs.map +1 -1
  55. package/dist/v2/runtime/handlers/handle-debug-events.cjs +33 -0
  56. package/dist/v2/runtime/handlers/handle-debug-events.cjs.map +1 -0
  57. package/dist/v2/runtime/handlers/handle-debug-events.mjs +32 -0
  58. package/dist/v2/runtime/handlers/handle-debug-events.mjs.map +1 -0
  59. package/dist/v2/runtime/handlers/handle-run.cjs +1 -0
  60. package/dist/v2/runtime/handlers/handle-run.cjs.map +1 -1
  61. package/dist/v2/runtime/handlers/handle-run.mjs +1 -0
  62. package/dist/v2/runtime/handlers/handle-run.mjs.map +1 -1
  63. package/dist/v2/runtime/handlers/intelligence/connect.cjs +24 -4
  64. package/dist/v2/runtime/handlers/intelligence/connect.cjs.map +1 -1
  65. package/dist/v2/runtime/handlers/intelligence/connect.mjs +25 -5
  66. package/dist/v2/runtime/handlers/intelligence/connect.mjs.map +1 -1
  67. package/dist/v2/runtime/handlers/intelligence/run.cjs +111 -26
  68. package/dist/v2/runtime/handlers/intelligence/run.cjs.map +1 -1
  69. package/dist/v2/runtime/handlers/intelligence/run.mjs +111 -26
  70. package/dist/v2/runtime/handlers/intelligence/run.mjs.map +1 -1
  71. package/dist/v2/runtime/handlers/shared/intelligence-utils.cjs +7 -3
  72. package/dist/v2/runtime/handlers/shared/intelligence-utils.cjs.map +1 -1
  73. package/dist/v2/runtime/handlers/shared/intelligence-utils.mjs +7 -3
  74. package/dist/v2/runtime/handlers/shared/intelligence-utils.mjs.map +1 -1
  75. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.cjs +5 -1
  76. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.cjs.map +1 -1
  77. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.mjs +5 -1
  78. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.mjs.map +1 -1
  79. package/dist/v2/runtime/handlers/shared/sse-response.cjs +21 -1
  80. package/dist/v2/runtime/handlers/shared/sse-response.cjs.map +1 -1
  81. package/dist/v2/runtime/handlers/shared/sse-response.mjs +21 -1
  82. package/dist/v2/runtime/handlers/shared/sse-response.mjs.map +1 -1
  83. package/dist/v2/runtime/handlers/sse/connect.cjs +3 -1
  84. package/dist/v2/runtime/handlers/sse/connect.cjs.map +1 -1
  85. package/dist/v2/runtime/handlers/sse/connect.mjs +3 -1
  86. package/dist/v2/runtime/handlers/sse/connect.mjs.map +1 -1
  87. package/dist/v2/runtime/handlers/sse/run.cjs +3 -1
  88. package/dist/v2/runtime/handlers/sse/run.cjs.map +1 -1
  89. package/dist/v2/runtime/handlers/sse/run.mjs +3 -1
  90. package/dist/v2/runtime/handlers/sse/run.mjs.map +1 -1
  91. package/dist/v2/runtime/index.d.cts +1 -1
  92. package/dist/v2/runtime/index.d.mts +1 -2
  93. package/dist/v2/runtime/index.d.mts.map +1 -1
  94. package/dist/v2/runtime/intelligence-platform/client.cjs +6 -8
  95. package/dist/v2/runtime/intelligence-platform/client.cjs.map +1 -1
  96. package/dist/v2/runtime/intelligence-platform/client.d.cts +16 -21
  97. package/dist/v2/runtime/intelligence-platform/client.d.cts.map +1 -1
  98. package/dist/v2/runtime/intelligence-platform/client.d.mts +16 -21
  99. package/dist/v2/runtime/intelligence-platform/client.d.mts.map +1 -1
  100. package/dist/v2/runtime/intelligence-platform/client.mjs +6 -8
  101. package/dist/v2/runtime/intelligence-platform/client.mjs.map +1 -1
  102. package/dist/v2/runtime/runner/agent-runner.cjs.map +1 -1
  103. package/dist/v2/runtime/runner/agent-runner.d.cts +0 -1
  104. package/dist/v2/runtime/runner/agent-runner.d.cts.map +1 -1
  105. package/dist/v2/runtime/runner/agent-runner.d.mts +0 -1
  106. package/dist/v2/runtime/runner/agent-runner.d.mts.map +1 -1
  107. package/dist/v2/runtime/runner/agent-runner.mjs.map +1 -1
  108. package/dist/v2/runtime/runner/index.d.cts +1 -1
  109. package/dist/v2/runtime/runner/index.d.mts +1 -1
  110. package/dist/v2/runtime/runner/intelligence.cjs +47 -10
  111. package/dist/v2/runtime/runner/intelligence.cjs.map +1 -1
  112. package/dist/v2/runtime/runner/intelligence.d.cts +8 -1
  113. package/dist/v2/runtime/runner/intelligence.d.cts.map +1 -1
  114. package/dist/v2/runtime/runner/intelligence.d.mts +8 -1
  115. package/dist/v2/runtime/runner/intelligence.d.mts.map +1 -1
  116. package/dist/v2/runtime/runner/intelligence.mjs +47 -10
  117. package/dist/v2/runtime/runner/intelligence.mjs.map +1 -1
  118. package/dist/v2/runtime/telemetry/instance-created.cjs +33 -0
  119. package/dist/v2/runtime/telemetry/instance-created.cjs.map +1 -0
  120. package/dist/v2/runtime/telemetry/instance-created.mjs +33 -0
  121. package/dist/v2/runtime/telemetry/instance-created.mjs.map +1 -0
  122. package/dist/v2/runtime/telemetry/telemetry-client.cjs +1 -38
  123. package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -1
  124. package/dist/v2/runtime/telemetry/telemetry-client.mjs +1 -37
  125. package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -1
  126. package/package.json +3 -3
  127. package/src/agents/langgraph/__tests__/event-source.test.ts +256 -0
  128. package/src/graphql/resolvers/__tests__/resolve-message-id.test.ts +25 -0
  129. package/src/graphql/resolvers/copilot.resolver.ts +2 -1
  130. package/src/graphql/resolvers/resolve-message-id.ts +14 -0
  131. package/src/lib/runtime/__tests__/handle-service-adapter.test.ts +108 -0
  132. package/src/lib/runtime/__tests__/retry-utils.test.ts +137 -0
  133. package/src/lib/runtime/agent-integrations/langgraph/__tests__/dispatch-event-filtering.test.ts +190 -0
  134. package/src/lib/runtime/copilot-runtime.ts +20 -4
  135. package/src/lib/runtime/retry-utils.ts +41 -1
  136. package/src/v2/runtime/__tests__/express-single-telemetry.integration.test.ts +65 -0
  137. package/src/v2/runtime/__tests__/express-telemetry.integration.test.ts +101 -0
  138. package/src/v2/runtime/__tests__/fetch-router.test.ts +22 -0
  139. package/src/v2/runtime/__tests__/handle-connect.test.ts +183 -23
  140. package/src/v2/runtime/__tests__/handle-run.test.ts +411 -33
  141. package/src/v2/runtime/__tests__/handle-threads.test.ts +66 -4
  142. package/src/v2/runtime/__tests__/hono-single-telemetry.integration.test.ts +46 -0
  143. package/src/v2/runtime/__tests__/hono-telemetry.integration.test.ts +99 -0
  144. package/src/v2/runtime/__tests__/integration/node-servers.integration.test.ts +19 -0
  145. package/src/v2/runtime/__tests__/integration/suites/debug-events.suite.ts +253 -0
  146. package/src/v2/runtime/__tests__/intelligence-run-telemetry.test.ts +194 -0
  147. package/src/v2/runtime/__tests__/runtime.test.ts +3 -1
  148. package/src/v2/runtime/__tests__/sse-response-telemetry.test.ts +108 -0
  149. package/src/v2/runtime/__tests__/telemetry.test.ts +0 -61
  150. package/src/v2/runtime/core/__tests__/debug-event-bus.test.ts +156 -0
  151. package/src/v2/runtime/core/debug-event-bus.ts +45 -0
  152. package/src/v2/runtime/core/fetch-handler.ts +7 -0
  153. package/src/v2/runtime/core/fetch-router.ts +11 -0
  154. package/src/v2/runtime/core/hooks.ts +2 -1
  155. package/src/v2/runtime/core/runtime.ts +12 -0
  156. package/src/v2/runtime/handlers/__tests__/handle-debug-events.test.ts +176 -0
  157. package/src/v2/runtime/handlers/handle-connect.ts +2 -1
  158. package/src/v2/runtime/handlers/handle-debug-events.ts +52 -0
  159. package/src/v2/runtime/handlers/handle-run.ts +1 -0
  160. package/src/v2/runtime/handlers/intelligence/connect.ts +48 -11
  161. package/src/v2/runtime/handlers/intelligence/run.ts +162 -21
  162. package/src/v2/runtime/handlers/shared/intelligence-utils.ts +21 -1
  163. package/src/v2/runtime/handlers/shared/resolve-intelligence-user.ts +4 -1
  164. package/src/v2/runtime/handlers/shared/sse-response.ts +46 -0
  165. package/src/v2/runtime/handlers/sse/__tests__/sse-connect-agent-id.test.ts +71 -0
  166. package/src/v2/runtime/handlers/sse/connect.ts +6 -0
  167. package/src/v2/runtime/handlers/sse/run.ts +4 -0
  168. package/src/v2/runtime/intelligence-platform/__tests__/client.test.ts +33 -37
  169. package/src/v2/runtime/intelligence-platform/client.ts +37 -40
  170. package/src/v2/runtime/runner/__tests__/intelligence-runner.test.ts +66 -8
  171. package/src/v2/runtime/runner/agent-runner.ts +0 -1
  172. package/src/v2/runtime/runner/intelligence.ts +74 -15
  173. package/src/v2/runtime/telemetry/__tests__/instance-created.test.ts +96 -0
  174. package/src/v2/runtime/telemetry/instance-created.ts +44 -0
  175. package/src/v2/runtime/telemetry/telemetry-client.ts +1 -57
  176. package/dist/v2/runtime/intelligence-platform/index.d.mts +0 -2
  177. package/dist/v2/runtime/telemetry/utils.cjs +0 -15
  178. package/dist/v2/runtime/telemetry/utils.cjs.map +0 -1
  179. package/dist/v2/runtime/telemetry/utils.mjs +0 -14
  180. package/dist/v2/runtime/telemetry/utils.mjs.map +0 -1
  181. package/src/v2/runtime/telemetry/utils.ts +0 -15
@@ -228,18 +228,21 @@ describe("handleConnectAgent", () => {
228
228
  afterRequestMiddleware: undefined,
229
229
  runner,
230
230
  mode: "intelligence",
231
- identifyUser: vi.fn().mockResolvedValue({ id: "user-1" }),
232
- intelligence: platform,
231
+ identifyUser: vi
232
+ .fn()
233
+ .mockResolvedValue({ id: "user-1", name: "User One" }),
234
+ intelligence: {
235
+ ɵgetClientWsUrl: vi.fn(() => "wss://runtime.example/client"),
236
+ ...platform,
237
+ },
233
238
  } as unknown as CopilotRuntime;
234
239
  };
235
240
 
236
- it("returns a live connect plan when join credentials are available", async () => {
241
+ it("returns runtime websocket connection credentials when available", async () => {
237
242
  const platform = {
238
243
  ɵconnectThread: vi.fn().mockResolvedValue({
239
- mode: "live",
244
+ threadId: "thread-1",
240
245
  joinToken: "jt-connect-1",
241
- joinFromEventId: "event-1",
242
- events: [],
243
246
  }),
244
247
  };
245
248
  const runtime = createIntelligenceRuntime(platform);
@@ -254,24 +257,25 @@ describe("handleConnectAgent", () => {
254
257
  expect(response.headers.get("Content-Type")).toBe("application/json");
255
258
  const body = await response.json();
256
259
  expect(body).toEqual({
257
- mode: "live",
260
+ threadId: "thread-1",
258
261
  joinToken: "jt-connect-1",
259
- joinFromEventId: "event-1",
260
- events: [],
262
+ realtime: {
263
+ clientUrl: "wss://runtime.example/client",
264
+ topic: "thread:thread-1",
265
+ },
261
266
  });
262
267
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
263
268
  threadId: "thread-1",
264
269
  userId: "user-1",
265
- lastSeenEventId: null,
270
+ agentId: "my-agent",
266
271
  });
267
272
  });
268
273
 
269
- it("returns a bootstrap connect plan when no socket is needed", async () => {
274
+ it("does not restamp historical replay plans during connect", async () => {
270
275
  const platform = {
271
276
  ɵconnectThread: vi.fn().mockResolvedValue({
272
- mode: "bootstrap",
273
- latestEventId: "event-2",
274
- events: [{ type: "MESSAGES_SNAPSHOT", messages: [] }],
277
+ threadId: "thread-1",
278
+ joinToken: "jt-connect-1",
275
279
  }),
276
280
  };
277
281
  const runtime = createIntelligenceRuntime(platform);
@@ -285,9 +289,12 @@ describe("handleConnectAgent", () => {
285
289
  expect(response.status).toBe(200);
286
290
  const body = await response.json();
287
291
  expect(body).toEqual({
288
- mode: "bootstrap",
289
- latestEventId: "event-2",
290
- events: [{ type: "MESSAGES_SNAPSHOT", messages: [] }],
292
+ threadId: "thread-1",
293
+ joinToken: "jt-connect-1",
294
+ realtime: {
295
+ clientUrl: "wss://runtime.example/client",
296
+ topic: "thread:thread-1",
297
+ },
291
298
  });
292
299
  });
293
300
 
@@ -310,7 +317,7 @@ describe("handleConnectAgent", () => {
310
317
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
311
318
  threadId: "thread-1",
312
319
  userId: "user-1",
313
- lastSeenEventId: null,
320
+ agentId: "my-agent",
314
321
  });
315
322
  });
316
323
 
@@ -333,7 +340,73 @@ describe("handleConnectAgent", () => {
333
340
  expect(body.error).toBe("Connect plan not available");
334
341
  });
335
342
 
336
- it("forwards lastSeenEventId to the intelligence platform", async () => {
343
+ it("preserves platform not found errors when connect fails with 404", async () => {
344
+ const platform = {
345
+ ɵconnectThread: vi.fn().mockRejectedValue(
346
+ Object.assign(new Error("Intelligence platform error 404"), {
347
+ status: 404,
348
+ }),
349
+ ),
350
+ };
351
+ const runtime = createIntelligenceRuntime(platform);
352
+
353
+ const response = await handleConnectAgent({
354
+ runtime,
355
+ request: createConnectRequest(),
356
+ agentId: "my-agent",
357
+ });
358
+
359
+ expect(response.status).toBe(404);
360
+ const body = await response.json();
361
+ expect(body).toEqual({
362
+ error: "Connect request rejected",
363
+ message: "Intelligence platform error 404",
364
+ });
365
+ });
366
+
367
+ it("preserves platform validation errors when connect fails validation", async () => {
368
+ const platform = {
369
+ ɵconnectThread: vi.fn().mockRejectedValue(
370
+ Object.assign(new Error("Intelligence platform error 400"), {
371
+ status: 400,
372
+ }),
373
+ ),
374
+ };
375
+ const runtime = createIntelligenceRuntime(platform);
376
+
377
+ const response = await handleConnectAgent({
378
+ runtime,
379
+ request: createConnectRequest(),
380
+ agentId: "my-agent",
381
+ });
382
+
383
+ expect(response.status).toBe(400);
384
+ const body = await response.json();
385
+ expect(body.error).toBe("Connect request rejected");
386
+ });
387
+
388
+ it("preserves platform ownership conflicts when connect fails authorization", async () => {
389
+ const platform = {
390
+ ɵconnectThread: vi.fn().mockRejectedValue(
391
+ Object.assign(new Error("Intelligence platform error 403"), {
392
+ status: 403,
393
+ }),
394
+ ),
395
+ };
396
+ const runtime = createIntelligenceRuntime(platform);
397
+
398
+ const response = await handleConnectAgent({
399
+ runtime,
400
+ request: createConnectRequest(),
401
+ agentId: "my-agent",
402
+ });
403
+
404
+ expect(response.status).toBe(403);
405
+ const body = await response.json();
406
+ expect(body.error).toBe("Connect request rejected");
407
+ });
408
+
409
+ it("does not forward replay cursors to the credentials-only intelligence platform connect", async () => {
337
410
  const platform = {
338
411
  ɵconnectThread: vi.fn().mockResolvedValue(null),
339
412
  };
@@ -349,7 +422,7 @@ describe("handleConnectAgent", () => {
349
422
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
350
423
  threadId: "thread-1",
351
424
  userId: "user-1",
352
- lastSeenEventId: "event-9",
425
+ agentId: "my-agent",
353
426
  });
354
427
  });
355
428
 
@@ -357,7 +430,9 @@ describe("handleConnectAgent", () => {
357
430
  const platform = {
358
431
  ɵconnectThread: vi.fn().mockResolvedValue(null),
359
432
  };
360
- const identifyUser = vi.fn().mockResolvedValue({ id: "resolved-user" });
433
+ const identifyUser = vi
434
+ .fn()
435
+ .mockResolvedValue({ id: "resolved-user", name: "Resolved User" });
361
436
  const runtime = createIntelligenceRuntime(platform);
362
437
  runtime.identifyUser = identifyUser;
363
438
  const request = createConnectRequest(
@@ -377,7 +452,7 @@ describe("handleConnectAgent", () => {
377
452
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
378
453
  threadId: "thread-1",
379
454
  userId: "resolved-user",
380
- lastSeenEventId: "event-9",
455
+ agentId: "my-agent",
381
456
  });
382
457
  });
383
458
 
@@ -386,7 +461,28 @@ describe("handleConnectAgent", () => {
386
461
  ɵconnectThread: vi.fn(),
387
462
  };
388
463
  const runtime = createIntelligenceRuntime(platform);
389
- runtime.identifyUser = vi.fn().mockResolvedValue({ id: "" });
464
+ runtime.identifyUser = vi
465
+ .fn()
466
+ .mockResolvedValue({ id: "", name: "User" });
467
+
468
+ const response = await handleConnectAgent({
469
+ runtime,
470
+ request: createConnectRequest(),
471
+ agentId: "my-agent",
472
+ });
473
+
474
+ expect(response.status).toBe(400);
475
+ expect(platform.ɵconnectThread).not.toHaveBeenCalled();
476
+ });
477
+
478
+ it("returns 400 when identifyUser returns an invalid name", async () => {
479
+ const platform = {
480
+ ɵconnectThread: vi.fn(),
481
+ };
482
+ const runtime = createIntelligenceRuntime(platform);
483
+ runtime.identifyUser = vi
484
+ .fn()
485
+ .mockResolvedValue({ id: "user-1", name: "" });
390
486
 
391
487
  const response = await handleConnectAgent({
392
488
  runtime,
@@ -422,4 +518,68 @@ describe("handleConnectAgent", () => {
422
518
  }
423
519
  });
424
520
  });
521
+
522
+ describe("telemetry", () => {
523
+ it("captures oss.runtime.copilot_request_created on every invocation", async () => {
524
+ const { telemetry } = await import("../telemetry");
525
+ const captureSpy = vi
526
+ .spyOn(telemetry, "capture")
527
+ .mockResolvedValue(undefined);
528
+
529
+ try {
530
+ const runtime = createMockRuntime({});
531
+ const request = new Request("https://example.com/agent/test/connect", {
532
+ method: "POST",
533
+ });
534
+ await handleConnectAgent({
535
+ runtime,
536
+ request,
537
+ agentId: "nonexistent-agent",
538
+ });
539
+
540
+ expect(captureSpy).toHaveBeenCalledWith(
541
+ "oss.runtime.copilot_request_created",
542
+ expect.objectContaining({
543
+ requestType: "connect",
544
+ "cloud.api_key_provided": false,
545
+ }),
546
+ );
547
+ } finally {
548
+ captureSpy.mockRestore();
549
+ }
550
+ });
551
+
552
+ it("includes cloud.public_api_key when x-copilotcloud-public-api-key header is set", async () => {
553
+ const { telemetry } = await import("../telemetry");
554
+ const captureSpy = vi
555
+ .spyOn(telemetry, "capture")
556
+ .mockResolvedValue(undefined);
557
+
558
+ try {
559
+ const runtime = createMockRuntime({});
560
+ const request = new Request("https://example.com/agent/test/connect", {
561
+ method: "POST",
562
+ headers: {
563
+ "x-copilotcloud-public-api-key": "ck_pub_connect_test",
564
+ },
565
+ });
566
+
567
+ await handleConnectAgent({
568
+ runtime,
569
+ request,
570
+ agentId: "nonexistent-agent",
571
+ });
572
+
573
+ expect(captureSpy).toHaveBeenCalledWith(
574
+ "oss.runtime.copilot_request_created",
575
+ expect.objectContaining({
576
+ "cloud.api_key_provided": true,
577
+ "cloud.public_api_key": "ck_pub_connect_test",
578
+ }),
579
+ );
580
+ } finally {
581
+ captureSpy.mockRestore();
582
+ }
583
+ });
584
+ });
425
585
  });