@copilotkit/runtime 1.56.3 → 1.56.4-canary.1777529757

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 (114) hide show
  1. package/dist/agent/converters/tanstack.cjs +121 -25
  2. package/dist/agent/converters/tanstack.cjs.map +1 -1
  3. package/dist/agent/converters/tanstack.d.cts.map +1 -1
  4. package/dist/agent/converters/tanstack.d.mts.map +1 -1
  5. package/dist/agent/converters/tanstack.mjs +121 -25
  6. package/dist/agent/converters/tanstack.mjs.map +1 -1
  7. package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs +8 -1
  8. package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs.map +1 -1
  9. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts.map +1 -1
  10. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.mts.map +1 -1
  11. package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs +8 -1
  12. package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs.map +1 -1
  13. package/dist/package.cjs +6 -6
  14. package/dist/package.mjs +6 -6
  15. package/dist/v2/index.d.cts +2 -2
  16. package/dist/v2/index.d.mts +2 -2
  17. package/dist/v2/runtime/core/fetch-handler.cjs +2 -0
  18. package/dist/v2/runtime/core/fetch-handler.cjs.map +1 -1
  19. package/dist/v2/runtime/core/fetch-handler.d.cts.map +1 -1
  20. package/dist/v2/runtime/core/fetch-handler.d.mts.map +1 -1
  21. package/dist/v2/runtime/core/fetch-handler.mjs +2 -0
  22. package/dist/v2/runtime/core/fetch-handler.mjs.map +1 -1
  23. package/dist/v2/runtime/core/runtime.d.mts +0 -1
  24. package/dist/v2/runtime/core/runtime.d.mts.map +1 -1
  25. package/dist/v2/runtime/endpoints/express.cjs +5 -5
  26. package/dist/v2/runtime/endpoints/express.cjs.map +1 -1
  27. package/dist/v2/runtime/endpoints/express.mjs +5 -5
  28. package/dist/v2/runtime/endpoints/express.mjs.map +1 -1
  29. package/dist/v2/runtime/handlers/handle-connect.cjs +2 -3
  30. package/dist/v2/runtime/handlers/handle-connect.cjs.map +1 -1
  31. package/dist/v2/runtime/handlers/handle-connect.mjs +2 -3
  32. package/dist/v2/runtime/handlers/handle-connect.mjs.map +1 -1
  33. package/dist/v2/runtime/handlers/intelligence/connect.cjs +21 -31
  34. package/dist/v2/runtime/handlers/intelligence/connect.cjs.map +1 -1
  35. package/dist/v2/runtime/handlers/intelligence/connect.mjs +22 -31
  36. package/dist/v2/runtime/handlers/intelligence/connect.mjs.map +1 -1
  37. package/dist/v2/runtime/handlers/intelligence/run.cjs +111 -26
  38. package/dist/v2/runtime/handlers/intelligence/run.cjs.map +1 -1
  39. package/dist/v2/runtime/handlers/intelligence/run.mjs +111 -26
  40. package/dist/v2/runtime/handlers/intelligence/run.mjs.map +1 -1
  41. package/dist/v2/runtime/handlers/shared/intelligence-utils.cjs +7 -3
  42. package/dist/v2/runtime/handlers/shared/intelligence-utils.cjs.map +1 -1
  43. package/dist/v2/runtime/handlers/shared/intelligence-utils.mjs +7 -3
  44. package/dist/v2/runtime/handlers/shared/intelligence-utils.mjs.map +1 -1
  45. package/dist/v2/runtime/index.d.cts +1 -1
  46. package/dist/v2/runtime/index.d.mts +1 -2
  47. package/dist/v2/runtime/index.d.mts.map +1 -1
  48. package/dist/v2/runtime/intelligence-platform/client.cjs +5 -2
  49. package/dist/v2/runtime/intelligence-platform/client.cjs.map +1 -1
  50. package/dist/v2/runtime/intelligence-platform/client.d.cts +16 -18
  51. package/dist/v2/runtime/intelligence-platform/client.d.cts.map +1 -1
  52. package/dist/v2/runtime/intelligence-platform/client.d.mts +16 -18
  53. package/dist/v2/runtime/intelligence-platform/client.d.mts.map +1 -1
  54. package/dist/v2/runtime/intelligence-platform/client.mjs +5 -2
  55. package/dist/v2/runtime/intelligence-platform/client.mjs.map +1 -1
  56. package/dist/v2/runtime/runner/agent-runner.cjs.map +1 -1
  57. package/dist/v2/runtime/runner/agent-runner.d.cts +0 -1
  58. package/dist/v2/runtime/runner/agent-runner.d.cts.map +1 -1
  59. package/dist/v2/runtime/runner/agent-runner.d.mts +0 -1
  60. package/dist/v2/runtime/runner/agent-runner.d.mts.map +1 -1
  61. package/dist/v2/runtime/runner/agent-runner.mjs.map +1 -1
  62. package/dist/v2/runtime/runner/index.d.cts +1 -1
  63. package/dist/v2/runtime/runner/index.d.mts +1 -1
  64. package/dist/v2/runtime/runner/intelligence.cjs +30 -5
  65. package/dist/v2/runtime/runner/intelligence.cjs.map +1 -1
  66. package/dist/v2/runtime/runner/intelligence.d.cts +7 -1
  67. package/dist/v2/runtime/runner/intelligence.d.cts.map +1 -1
  68. package/dist/v2/runtime/runner/intelligence.d.mts +7 -1
  69. package/dist/v2/runtime/runner/intelligence.d.mts.map +1 -1
  70. package/dist/v2/runtime/runner/intelligence.mjs +30 -5
  71. package/dist/v2/runtime/runner/intelligence.mjs.map +1 -1
  72. package/dist/v2/runtime/telemetry/instance-created.cjs +33 -0
  73. package/dist/v2/runtime/telemetry/instance-created.cjs.map +1 -0
  74. package/dist/v2/runtime/telemetry/instance-created.mjs +33 -0
  75. package/dist/v2/runtime/telemetry/instance-created.mjs.map +1 -0
  76. package/dist/v2/runtime/telemetry/telemetry-client.cjs +1 -38
  77. package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -1
  78. package/dist/v2/runtime/telemetry/telemetry-client.mjs +1 -37
  79. package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -1
  80. package/package.json +7 -7
  81. package/src/agent/__tests__/agent-test-helpers.ts +31 -1
  82. package/src/agent/__tests__/converter-tanstack.test.ts +280 -0
  83. package/src/agent/converters/tanstack.ts +167 -10
  84. package/src/lib/runtime/agent-integrations/langgraph/agent.ts +8 -1
  85. package/src/v2/runtime/__tests__/express-fetch-bridge.test.ts +1 -1
  86. package/src/v2/runtime/__tests__/express-single-telemetry.integration.test.ts +65 -0
  87. package/src/v2/runtime/__tests__/express-telemetry.integration.test.ts +101 -0
  88. package/src/v2/runtime/__tests__/handle-connect.test.ts +155 -48
  89. package/src/v2/runtime/__tests__/handle-run.test.ts +380 -29
  90. package/src/v2/runtime/__tests__/hono-single-telemetry.integration.test.ts +46 -0
  91. package/src/v2/runtime/__tests__/hono-telemetry.integration.test.ts +99 -0
  92. package/src/v2/runtime/__tests__/intelligence-run-telemetry.test.ts +194 -0
  93. package/src/v2/runtime/__tests__/sse-response-telemetry.test.ts +108 -0
  94. package/src/v2/runtime/__tests__/telemetry.test.ts +0 -61
  95. package/src/v2/runtime/core/fetch-handler.ts +3 -0
  96. package/src/v2/runtime/endpoints/express.ts +9 -3
  97. package/src/v2/runtime/handlers/handle-connect.ts +1 -2
  98. package/src/v2/runtime/handlers/intelligence/connect.ts +48 -68
  99. package/src/v2/runtime/handlers/intelligence/run.ts +162 -21
  100. package/src/v2/runtime/handlers/shared/intelligence-utils.ts +21 -1
  101. package/src/v2/runtime/intelligence-platform/__tests__/client.test.ts +33 -39
  102. package/src/v2/runtime/intelligence-platform/client.ts +36 -31
  103. package/src/v2/runtime/runner/__tests__/intelligence-runner.test.ts +15 -7
  104. package/src/v2/runtime/runner/agent-runner.ts +0 -1
  105. package/src/v2/runtime/runner/intelligence.ts +47 -6
  106. package/src/v2/runtime/telemetry/__tests__/instance-created.test.ts +96 -0
  107. package/src/v2/runtime/telemetry/instance-created.ts +44 -0
  108. package/src/v2/runtime/telemetry/telemetry-client.ts +1 -57
  109. package/dist/v2/runtime/intelligence-platform/index.d.mts +0 -2
  110. package/dist/v2/runtime/telemetry/utils.cjs +0 -15
  111. package/dist/v2/runtime/telemetry/utils.cjs.map +0 -1
  112. package/dist/v2/runtime/telemetry/utils.mjs +0 -14
  113. package/dist/v2/runtime/telemetry/utils.mjs.map +0 -1
  114. package/src/v2/runtime/telemetry/utils.ts +0 -15
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Integration test: Express adapter + telemetry.
3
+ */
4
+ import express from "express";
5
+ import request from "supertest";
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
7
+ import type { AbstractAgent } from "@ag-ui/client";
8
+ import { Observable, of } from "rxjs";
9
+
10
+ import { telemetry } from "../telemetry";
11
+ import { createCopilotExpressHandler } from "../endpoints/express";
12
+ import { CopilotRuntime } from "../core/runtime";
13
+
14
+ function makeAgent(): AbstractAgent {
15
+ const a: unknown = { execute: async () => ({ events: [] }) };
16
+ (a as { clone: () => unknown }).clone = () => makeAgent();
17
+ return a as AbstractAgent;
18
+ }
19
+
20
+ function makeRuntime() {
21
+ const runner = {
22
+ run: () =>
23
+ new Observable((observer) => {
24
+ observer.next({});
25
+ observer.complete();
26
+ return () => undefined;
27
+ }),
28
+ connect: () => of({}),
29
+ stop: async () => true,
30
+ };
31
+ return new CopilotRuntime({
32
+ agents: { default: makeAgent() },
33
+ runner,
34
+ });
35
+ }
36
+
37
+ describe("Express adapter — telemetry firing (integration)", () => {
38
+ let captureSpy: ReturnType<typeof vi.spyOn>;
39
+
40
+ beforeEach(() => {
41
+ captureSpy = vi.spyOn(telemetry, "capture").mockResolvedValue(undefined);
42
+ });
43
+
44
+ afterEach(() => {
45
+ captureSpy.mockRestore();
46
+ });
47
+
48
+ it("fires instance_created on handler creation (multi-route)", async () => {
49
+ const runtime = makeRuntime();
50
+ createCopilotExpressHandler({ runtime, basePath: "/" });
51
+
52
+ await vi.waitFor(() => {
53
+ expect(captureSpy).toHaveBeenCalledWith(
54
+ "oss.runtime.instance_created",
55
+ expect.objectContaining({
56
+ agentsAmount: 1,
57
+ "cloud.api_key_provided": false,
58
+ }),
59
+ );
60
+ });
61
+ });
62
+
63
+ it("fires copilot_request_created when a real HTTP request hits the handler", async () => {
64
+ const runtime = makeRuntime();
65
+ const app = express();
66
+ app.use(createCopilotExpressHandler({ runtime, basePath: "/" }));
67
+
68
+ await request(app)
69
+ .post("/agent/default/run")
70
+ .set("Content-Type", "application/json")
71
+ .send({ messages: [], state: {}, threadId: "t1" });
72
+
73
+ expect(captureSpy).toHaveBeenCalledWith(
74
+ "oss.runtime.copilot_request_created",
75
+ expect.objectContaining({
76
+ requestType: "run",
77
+ "cloud.api_key_provided": false,
78
+ }),
79
+ );
80
+ });
81
+
82
+ it("includes cloud.public_api_key on request when header is present", async () => {
83
+ const runtime = makeRuntime();
84
+ const app = express();
85
+ app.use(createCopilotExpressHandler({ runtime, basePath: "/" }));
86
+
87
+ await request(app)
88
+ .post("/agent/default/run")
89
+ .set("Content-Type", "application/json")
90
+ .set("x-copilotcloud-public-api-key", "ck_pub_test_xyz")
91
+ .send({ messages: [], state: {}, threadId: "t1" });
92
+
93
+ expect(captureSpy).toHaveBeenCalledWith(
94
+ "oss.runtime.copilot_request_created",
95
+ expect.objectContaining({
96
+ "cloud.api_key_provided": true,
97
+ "cloud.public_api_key": "ck_pub_test_xyz",
98
+ }),
99
+ );
100
+ });
101
+ });
@@ -231,17 +231,18 @@ describe("handleConnectAgent", () => {
231
231
  identifyUser: vi
232
232
  .fn()
233
233
  .mockResolvedValue({ id: "user-1", name: "User One" }),
234
- intelligence: platform,
234
+ intelligence: {
235
+ ɵgetClientWsUrl: vi.fn(() => "wss://runtime.example/client"),
236
+ ...platform,
237
+ },
235
238
  } as unknown as CopilotRuntime;
236
239
  };
237
240
 
238
- it("returns a live connect plan when join credentials are available", async () => {
241
+ it("returns runtime websocket connection credentials when available", async () => {
239
242
  const platform = {
240
243
  ɵconnectThread: vi.fn().mockResolvedValue({
241
- mode: "live",
244
+ threadId: "thread-1",
242
245
  joinToken: "jt-connect-1",
243
- joinFromEventId: "event-1",
244
- events: [],
245
246
  }),
246
247
  };
247
248
  const runtime = createIntelligenceRuntime(platform);
@@ -256,33 +257,25 @@ describe("handleConnectAgent", () => {
256
257
  expect(response.headers.get("Content-Type")).toBe("application/json");
257
258
  const body = await response.json();
258
259
  expect(body).toEqual({
259
- mode: "live",
260
+ threadId: "thread-1",
260
261
  joinToken: "jt-connect-1",
261
- joinFromEventId: "event-1",
262
- events: [],
262
+ realtime: {
263
+ clientUrl: "wss://runtime.example/client",
264
+ topic: "thread:thread-1",
265
+ },
263
266
  });
264
267
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
265
268
  threadId: "thread-1",
266
269
  userId: "user-1",
267
- runId: "run-1",
268
- lastSeenEventId: null,
270
+ agentId: "my-agent",
269
271
  });
270
272
  });
271
273
 
272
- it("returns a bootstrap connect plan when no socket is needed", async () => {
274
+ it("does not restamp historical replay plans during connect", async () => {
273
275
  const platform = {
274
276
  ɵconnectThread: vi.fn().mockResolvedValue({
275
- mode: "bootstrap",
276
- latestEventId: "event-2",
277
- events: [
278
- {
279
- type: "RUN_STARTED",
280
- threadId: "thread-1",
281
- run_id: "backend-run-1",
282
- input: { messages: [] },
283
- },
284
- { type: "RUN_FINISHED" },
285
- ],
277
+ threadId: "thread-1",
278
+ joinToken: "jt-connect-1",
286
279
  }),
287
280
  };
288
281
  const runtime = createIntelligenceRuntime(platform);
@@ -296,25 +289,12 @@ describe("handleConnectAgent", () => {
296
289
  expect(response.status).toBe(200);
297
290
  const body = await response.json();
298
291
  expect(body).toEqual({
299
- mode: "bootstrap",
300
- latestEventId: "event-2",
301
- events: [
302
- {
303
- type: "RUN_STARTED",
304
- threadId: "thread-1",
305
- runId: "run-1",
306
- input: {
307
- messages: [],
308
- threadId: "thread-1",
309
- runId: "run-1",
310
- },
311
- },
312
- {
313
- type: "RUN_FINISHED",
314
- threadId: "thread-1",
315
- runId: "run-1",
316
- },
317
- ],
292
+ threadId: "thread-1",
293
+ joinToken: "jt-connect-1",
294
+ realtime: {
295
+ clientUrl: "wss://runtime.example/client",
296
+ topic: "thread:thread-1",
297
+ },
318
298
  });
319
299
  });
320
300
 
@@ -337,8 +317,7 @@ describe("handleConnectAgent", () => {
337
317
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
338
318
  threadId: "thread-1",
339
319
  userId: "user-1",
340
- runId: "run-1",
341
- lastSeenEventId: null,
320
+ agentId: "my-agent",
342
321
  });
343
322
  });
344
323
 
@@ -361,7 +340,73 @@ describe("handleConnectAgent", () => {
361
340
  expect(body.error).toBe("Connect plan not available");
362
341
  });
363
342
 
364
- 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 () => {
365
410
  const platform = {
366
411
  ɵconnectThread: vi.fn().mockResolvedValue(null),
367
412
  };
@@ -377,8 +422,7 @@ describe("handleConnectAgent", () => {
377
422
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
378
423
  threadId: "thread-1",
379
424
  userId: "user-1",
380
- runId: "run-1",
381
- lastSeenEventId: "event-9",
425
+ agentId: "my-agent",
382
426
  });
383
427
  });
384
428
 
@@ -408,8 +452,7 @@ describe("handleConnectAgent", () => {
408
452
  expect(platform.ɵconnectThread).toHaveBeenCalledWith({
409
453
  threadId: "thread-1",
410
454
  userId: "resolved-user",
411
- runId: "run-1",
412
- lastSeenEventId: "event-9",
455
+ agentId: "my-agent",
413
456
  });
414
457
  });
415
458
 
@@ -475,4 +518,68 @@ describe("handleConnectAgent", () => {
475
518
  }
476
519
  });
477
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
+ });
478
585
  });