@copilotkit/runtime 1.57.3 → 1.58.0-canary.thread-id-propagation
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.
- package/dist/lib/observability.d.cts +1 -1
- package/dist/lib/observability.d.cts.map +1 -1
- package/dist/lib/observability.d.mts +1 -1
- package/dist/lib/observability.d.mts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.cjs +2 -0
- package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.mjs +2 -0
- package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
- package/dist/package.cjs +5 -8
- package/dist/package.mjs +5 -8
- package/dist/v2/runtime/core/runtime.cjs +4 -1
- package/dist/v2/runtime/core/runtime.cjs.map +1 -1
- package/dist/v2/runtime/core/runtime.d.cts.map +1 -1
- package/dist/v2/runtime/core/runtime.d.mts.map +1 -1
- package/dist/v2/runtime/core/runtime.mjs +4 -1
- package/dist/v2/runtime/core/runtime.mjs.map +1 -1
- package/dist/v2/runtime/handlers/get-runtime-info.cjs +1 -1
- package/dist/v2/runtime/handlers/get-runtime-info.mjs +1 -1
- package/dist/v2/runtime/handlers/handle-connect.cjs +1 -1
- package/dist/v2/runtime/handlers/handle-connect.mjs +1 -1
- package/dist/v2/runtime/handlers/handle-run.cjs +1 -1
- package/dist/v2/runtime/handlers/handle-run.mjs +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.cjs +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.cjs.map +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.mjs +1 -1
- package/dist/v2/runtime/handlers/shared/agent-utils.mjs.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.cjs +22 -6
- package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.mjs +27 -11
- package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -1
- package/package.json +9 -19
- package/skills/runtime/SKILL.md +98 -0
- package/skills/runtime/references/agent-runners-custom.md +161 -0
- package/skills/runtime/references/agent-runners-in-memory.md +64 -0
- package/skills/runtime/references/agent-runners-sqlite.md +90 -0
- package/skills/runtime/references/agent-runners.md +304 -0
- package/skills/runtime/references/built-in-agent-factory-modes.md +232 -0
- package/skills/runtime/references/built-in-agent-helper-utilities.md +123 -0
- package/skills/runtime/references/built-in-agent-model-identifiers.md +59 -0
- package/skills/runtime/references/built-in-agent.md +523 -0
- package/skills/runtime/references/intelligence-mode.md +336 -0
- package/skills/runtime/references/middleware.md +376 -0
- package/skills/runtime/references/server-side-tools.md +414 -0
- package/skills/runtime/references/setup-endpoint.md +503 -0
- package/skills/runtime/references/transcription.md +287 -0
- package/skills/runtime/references/wiring-a2a.md +40 -0
- package/skills/runtime/references/wiring-adk.md +45 -0
- package/skills/runtime/references/wiring-ag2.md +41 -0
- package/skills/runtime/references/wiring-agno.md +39 -0
- package/skills/runtime/references/wiring-aws-strands.md +59 -0
- package/skills/runtime/references/wiring-crewai-crews.md +51 -0
- package/skills/runtime/references/wiring-crewai-flows.md +45 -0
- package/skills/runtime/references/wiring-external-agents.md +348 -0
- package/skills/runtime/references/wiring-langgraph.md +50 -0
- package/skills/runtime/references/wiring-llamaindex.md +39 -0
- package/skills/runtime/references/wiring-mastra.md +70 -0
- package/skills/runtime/references/wiring-mcp-apps-middleware.md +68 -0
- package/skills/runtime/references/wiring-ms-agent-framework.md +41 -0
- package/skills/runtime/references/wiring-pydantic-ai.md +45 -0
- package/CHANGELOG.md +0 -3624
- package/__snapshots__/schema/schema.graphql +0 -371
- package/dist/v2/runtime/telemetry/scarf-client.cjs +0 -32
- package/dist/v2/runtime/telemetry/scarf-client.cjs.map +0 -1
- package/dist/v2/runtime/telemetry/scarf-client.mjs +0 -32
- package/dist/v2/runtime/telemetry/scarf-client.mjs.map +0 -1
- package/scripts/generate-gql-schema.ts +0 -16
- package/src/agent/__tests__/agent-test-helpers.ts +0 -476
- package/src/agent/__tests__/agent.test.ts +0 -593
- package/src/agent/__tests__/ai-sdk-v6-compat.test.ts +0 -116
- package/src/agent/__tests__/basic-agent.test.ts +0 -1698
- package/src/agent/__tests__/capabilities.test.ts +0 -81
- package/src/agent/__tests__/config-tools-execution.test.ts +0 -516
- package/src/agent/__tests__/converter-aisdk.test.ts +0 -692
- package/src/agent/__tests__/converter-custom.test.ts +0 -319
- package/src/agent/__tests__/converter-tanstack-input.test.ts +0 -211
- package/src/agent/__tests__/converter-tanstack.test.ts +0 -594
- package/src/agent/__tests__/mcp-clients.test.ts +0 -246
- package/src/agent/__tests__/mcp-servers-integration.test.ts +0 -373
- package/src/agent/__tests__/multimodal-tanstack.test.ts +0 -284
- package/src/agent/__tests__/multimodal.test.ts +0 -176
- package/src/agent/__tests__/property-overrides.test.ts +0 -598
- package/src/agent/__tests__/provider-id-collision.test.ts +0 -195
- package/src/agent/__tests__/standard-schema-tools.test.ts +0 -313
- package/src/agent/__tests__/standard-schema-types.test.ts +0 -158
- package/src/agent/__tests__/state-tools.test.ts +0 -436
- package/src/agent/__tests__/test-helpers.ts +0 -197
- package/src/agent/__tests__/utils.test.ts +0 -536
- package/src/agent/__tests__/zod-regression.test.ts +0 -350
- package/src/agent/converters/aisdk.ts +0 -326
- package/src/agent/converters/index.ts +0 -7
- package/src/agent/converters/tanstack.ts +0 -451
- package/src/agent/index.ts +0 -1743
- package/src/agents/langgraph/__tests__/event-source.test.ts +0 -256
- package/src/agents/langgraph/event-source.ts +0 -365
- package/src/agents/langgraph/events.ts +0 -394
- package/src/graphql/inputs/action.input.ts +0 -16
- package/src/graphql/inputs/agent-session.input.ts +0 -13
- package/src/graphql/inputs/agent-state.input.ts +0 -13
- package/src/graphql/inputs/cloud-guardrails.input.ts +0 -16
- package/src/graphql/inputs/cloud.input.ts +0 -8
- package/src/graphql/inputs/context-property.input.ts +0 -10
- package/src/graphql/inputs/copilot-context.input.ts +0 -10
- package/src/graphql/inputs/custom-property.input.ts +0 -15
- package/src/graphql/inputs/extensions.input.ts +0 -21
- package/src/graphql/inputs/forwarded-parameters.input.ts +0 -22
- package/src/graphql/inputs/frontend.input.ts +0 -14
- package/src/graphql/inputs/generate-copilot-response.input.ts +0 -59
- package/src/graphql/inputs/load-agent-state.input.ts +0 -10
- package/src/graphql/inputs/message.input.ts +0 -110
- package/src/graphql/inputs/meta-event.input.ts +0 -18
- package/src/graphql/message-conversion/agui-to-gql.test.ts +0 -1384
- package/src/graphql/message-conversion/agui-to-gql.ts +0 -384
- package/src/graphql/message-conversion/gql-to-agui.test.ts +0 -1653
- package/src/graphql/message-conversion/gql-to-agui.ts +0 -297
- package/src/graphql/message-conversion/index.ts +0 -2
- package/src/graphql/message-conversion/roundtrip-conversion.test.ts +0 -561
- package/src/graphql/resolvers/__tests__/resolve-message-id.test.ts +0 -25
- package/src/graphql/resolvers/copilot.resolver.ts +0 -785
- package/src/graphql/resolvers/resolve-message-id.ts +0 -14
- package/src/graphql/resolvers/state.resolver.ts +0 -30
- package/src/graphql/types/agents-response.type.ts +0 -19
- package/src/graphql/types/base/index.ts +0 -10
- package/src/graphql/types/converted/index.ts +0 -183
- package/src/graphql/types/copilot-response.type.ts +0 -141
- package/src/graphql/types/enums.ts +0 -38
- package/src/graphql/types/extensions-response.type.ts +0 -23
- package/src/graphql/types/guardrails-result.type.ts +0 -20
- package/src/graphql/types/load-agent-state-response.type.ts +0 -17
- package/src/graphql/types/message-status.type.ts +0 -48
- package/src/graphql/types/meta-events.type.ts +0 -78
- package/src/graphql/types/response-status.type.ts +0 -77
- package/src/index.ts +0 -3
- package/src/langgraph.ts +0 -1
- package/src/lib/__tests__/telemetry-disclosure.test.ts +0 -55
- package/src/lib/cloud/index.ts +0 -4
- package/src/lib/error-messages.ts +0 -211
- package/src/lib/index.ts +0 -52
- package/src/lib/integrations/index.ts +0 -6
- package/src/lib/integrations/nest/index.ts +0 -21
- package/src/lib/integrations/nextjs/app-router.ts +0 -47
- package/src/lib/integrations/nextjs/pages-router.ts +0 -45
- package/src/lib/integrations/node-express/index.ts +0 -21
- package/src/lib/integrations/node-http/__tests__/request-duck-type.test.ts +0 -66
- package/src/lib/integrations/node-http/index.ts +0 -187
- package/src/lib/integrations/node-http/request-handler.ts +0 -128
- package/src/lib/integrations/shared.ts +0 -112
- package/src/lib/logger.ts +0 -31
- package/src/lib/observability.ts +0 -167
- package/src/lib/runtime/__tests__/copilot-runtime-error.test.ts +0 -183
- package/src/lib/runtime/__tests__/handle-service-adapter.test.ts +0 -108
- package/src/lib/runtime/__tests__/mcp-tools-utils.test.ts +0 -499
- package/src/lib/runtime/__tests__/on-after-request.test.ts +0 -122
- package/src/lib/runtime/__tests__/retry-utils.test.ts +0 -137
- package/src/lib/runtime/__tests__/v1-agent-factory.test.ts +0 -109
- package/src/lib/runtime/agent-integrations/langgraph/__tests__/dispatch-event-filtering.test.ts +0 -345
- package/src/lib/runtime/agent-integrations/langgraph/__tests__/run-message-filtering.test.ts +0 -156
- package/src/lib/runtime/agent-integrations/langgraph/agent.ts +0 -263
- package/src/lib/runtime/agent-integrations/langgraph/consts.ts +0 -37
- package/src/lib/runtime/agent-integrations/langgraph/index.ts +0 -2
- package/src/lib/runtime/copilot-runtime.ts +0 -863
- package/src/lib/runtime/mcp-tools-utils.ts +0 -313
- package/src/lib/runtime/retry-utils.ts +0 -141
- package/src/lib/runtime/telemetry-agent-runner.ts +0 -151
- package/src/lib/runtime/types.ts +0 -48
- package/src/lib/runtime/utils.ts +0 -93
- package/src/lib/streaming.ts +0 -220
- package/src/lib/telemetry-client.ts +0 -66
- package/src/lib/telemetry-disclosure.ts +0 -53
- package/src/service-adapters/anthropic/anthropic-adapter.ts +0 -532
- package/src/service-adapters/anthropic/utils.ts +0 -219
- package/src/service-adapters/bedrock/bedrock-adapter.ts +0 -73
- package/src/service-adapters/conversion.test.ts +0 -56
- package/src/service-adapters/conversion.ts +0 -69
- package/src/service-adapters/empty/empty-adapter.ts +0 -38
- package/src/service-adapters/events.ts +0 -337
- package/src/service-adapters/experimental/ollama/ollama-adapter.ts +0 -84
- package/src/service-adapters/google/google-genai-adapter.test.ts +0 -151
- package/src/service-adapters/google/google-genai-adapter.ts +0 -95
- package/src/service-adapters/groq/groq-adapter.ts +0 -229
- package/src/service-adapters/index.ts +0 -18
- package/src/service-adapters/langchain/langchain-adapter.ts +0 -113
- package/src/service-adapters/langchain/langserve.ts +0 -88
- package/src/service-adapters/langchain/types.ts +0 -20
- package/src/service-adapters/langchain/utils.ts +0 -330
- package/src/service-adapters/openai/__tests__/openai-v5-compat.test.ts +0 -177
- package/src/service-adapters/openai/openai-adapter.ts +0 -324
- package/src/service-adapters/openai/openai-assistant-adapter.ts +0 -385
- package/src/service-adapters/openai/utils.ts +0 -305
- package/src/service-adapters/service-adapter.ts +0 -50
- package/src/service-adapters/shared/error-utils.ts +0 -64
- package/src/service-adapters/shared/index.ts +0 -2
- package/src/service-adapters/shared/sdk-client-utils.ts +0 -19
- package/src/service-adapters/unify/unify-adapter.ts +0 -165
- package/src/utils/failed-response-status-reasons.ts +0 -70
- package/src/utils/index.ts +0 -1
- package/src/v2/express.ts +0 -1
- package/src/v2/hono.ts +0 -1
- package/src/v2/index.ts +0 -5
- package/src/v2/node.ts +0 -1
- package/src/v2/runtime/__tests__/agents-factory.test.ts +0 -136
- package/src/v2/runtime/__tests__/backward-compat.test.ts +0 -261
- package/src/v2/runtime/__tests__/code-review-fixes.test.ts +0 -500
- package/src/v2/runtime/__tests__/cors-credentials.test.ts +0 -320
- package/src/v2/runtime/__tests__/debug-sse-response.test.ts +0 -302
- package/src/v2/runtime/__tests__/express-adapter.test.ts +0 -188
- package/src/v2/runtime/__tests__/express-body-order.test.ts +0 -76
- package/src/v2/runtime/__tests__/express-fetch-bridge.test.ts +0 -344
- package/src/v2/runtime/__tests__/express-single-sse.test.ts +0 -122
- package/src/v2/runtime/__tests__/express-single-telemetry.integration.test.ts +0 -65
- package/src/v2/runtime/__tests__/express-telemetry.integration.test.ts +0 -101
- package/src/v2/runtime/__tests__/fetch-cors.test.ts +0 -205
- package/src/v2/runtime/__tests__/fetch-handler-validation.test.ts +0 -440
- package/src/v2/runtime/__tests__/fetch-handler.test.ts +0 -456
- package/src/v2/runtime/__tests__/fetch-router.test.ts +0 -276
- package/src/v2/runtime/__tests__/get-runtime-info.test.ts +0 -335
- package/src/v2/runtime/__tests__/handle-connect.test.ts +0 -585
- package/src/v2/runtime/__tests__/handle-run.test.ts +0 -1388
- package/src/v2/runtime/__tests__/handle-threads.test.ts +0 -930
- package/src/v2/runtime/__tests__/handle-transcribe.test.ts +0 -301
- package/src/v2/runtime/__tests__/header-utils.test.ts +0 -88
- package/src/v2/runtime/__tests__/hono-adapter.test.ts +0 -150
- package/src/v2/runtime/__tests__/hono-single-telemetry.integration.test.ts +0 -46
- package/src/v2/runtime/__tests__/hono-telemetry.integration.test.ts +0 -99
- package/src/v2/runtime/__tests__/hooks-edge-cases.test.ts +0 -457
- package/src/v2/runtime/__tests__/hooks.test.ts +0 -557
- package/src/v2/runtime/__tests__/in-process-agent-runner-messages.test.ts +0 -230
- package/src/v2/runtime/__tests__/in-process-agent-runner.test.ts +0 -1030
- package/src/v2/runtime/__tests__/integration/bun/bun-servers.integration.test.ts +0 -27
- package/src/v2/runtime/__tests__/integration/bun/elysia-multi.ts +0 -32
- package/src/v2/runtime/__tests__/integration/bun/elysia-single.ts +0 -33
- package/src/v2/runtime/__tests__/integration/bun/hono-bun-multi.ts +0 -25
- package/src/v2/runtime/__tests__/integration/bun/hono-bun-single.ts +0 -32
- package/src/v2/runtime/__tests__/integration/helpers/create-test-runtime.ts +0 -15
- package/src/v2/runtime/__tests__/integration/helpers/sse-reader.ts +0 -45
- package/src/v2/runtime/__tests__/integration/helpers/test-agent.ts +0 -58
- package/src/v2/runtime/__tests__/integration/node-servers.integration.test.ts +0 -58
- package/src/v2/runtime/__tests__/integration/servers/express-multi.ts +0 -35
- package/src/v2/runtime/__tests__/integration/servers/express-single.ts +0 -36
- package/src/v2/runtime/__tests__/integration/servers/fetch-direct.ts +0 -39
- package/src/v2/runtime/__tests__/integration/servers/hono-multi.ts +0 -30
- package/src/v2/runtime/__tests__/integration/servers/hono-single.ts +0 -37
- package/src/v2/runtime/__tests__/integration/servers/node-multi.ts +0 -45
- package/src/v2/runtime/__tests__/integration/servers/node-single.ts +0 -46
- package/src/v2/runtime/__tests__/integration/servers/types.ts +0 -18
- package/src/v2/runtime/__tests__/integration/suites/debug-events.suite.ts +0 -253
- package/src/v2/runtime/__tests__/integration/suites/multi-endpoint.suite.ts +0 -358
- package/src/v2/runtime/__tests__/integration/suites/single-endpoint.suite.ts +0 -363
- package/src/v2/runtime/__tests__/intelligence-run-telemetry.test.ts +0 -194
- package/src/v2/runtime/__tests__/mcp-apps-middleware-integration.test.ts +0 -275
- package/src/v2/runtime/__tests__/middleware-express.test.ts +0 -208
- package/src/v2/runtime/__tests__/middleware-single-express.test.ts +0 -213
- package/src/v2/runtime/__tests__/middleware-single.test.ts +0 -225
- package/src/v2/runtime/__tests__/middleware-sse-parser.test.ts +0 -237
- package/src/v2/runtime/__tests__/middleware.test.ts +0 -250
- package/src/v2/runtime/__tests__/node-fetch-handler.test.ts +0 -157
- package/src/v2/runtime/__tests__/open-generative-ui-middleware.e2e.test.ts +0 -728
- package/src/v2/runtime/__tests__/router-edge-cases.test.ts +0 -217
- package/src/v2/runtime/__tests__/routing-express.test.ts +0 -174
- package/src/v2/runtime/__tests__/routing-single-express.test.ts +0 -168
- package/src/v2/runtime/__tests__/routing-single.test.ts +0 -193
- package/src/v2/runtime/__tests__/routing.test.ts +0 -257
- package/src/v2/runtime/__tests__/runtime.test.ts +0 -234
- package/src/v2/runtime/__tests__/sse-response-telemetry.test.ts +0 -108
- package/src/v2/runtime/__tests__/telemetry.test.ts +0 -167
- package/src/v2/runtime/__tests__/thread-names.test.ts +0 -188
- package/src/v2/runtime/core/__tests__/debug-event-bus.test.ts +0 -156
- package/src/v2/runtime/core/debug-event-bus.ts +0 -45
- package/src/v2/runtime/core/fetch-cors.ts +0 -136
- package/src/v2/runtime/core/fetch-handler.ts +0 -492
- package/src/v2/runtime/core/fetch-router.ts +0 -203
- package/src/v2/runtime/core/hooks.ts +0 -160
- package/src/v2/runtime/core/middleware-sse-parser.ts +0 -210
- package/src/v2/runtime/core/middleware.ts +0 -115
- package/src/v2/runtime/core/runtime.ts +0 -432
- package/src/v2/runtime/endpoints/express-fetch-bridge.ts +0 -137
- package/src/v2/runtime/endpoints/express-single.ts +0 -54
- package/src/v2/runtime/endpoints/express.ts +0 -179
- package/src/v2/runtime/endpoints/hono-single.ts +0 -60
- package/src/v2/runtime/endpoints/hono.ts +0 -89
- package/src/v2/runtime/endpoints/index.ts +0 -4
- package/src/v2/runtime/endpoints/node-fetch-handler.ts +0 -48
- package/src/v2/runtime/endpoints/node.ts +0 -28
- package/src/v2/runtime/endpoints/single-route-helpers.ts +0 -125
- package/src/v2/runtime/express.ts +0 -2
- package/src/v2/runtime/handlers/__tests__/handle-debug-events.test.ts +0 -176
- package/src/v2/runtime/handlers/get-runtime-info.ts +0 -101
- package/src/v2/runtime/handlers/handle-connect.ts +0 -80
- package/src/v2/runtime/handlers/handle-debug-events.ts +0 -52
- package/src/v2/runtime/handlers/handle-run.ts +0 -111
- package/src/v2/runtime/handlers/handle-stop.ts +0 -77
- package/src/v2/runtime/handlers/handle-threads.ts +0 -11
- package/src/v2/runtime/handlers/handle-transcribe.ts +0 -269
- package/src/v2/runtime/handlers/header-utils.ts +0 -24
- package/src/v2/runtime/handlers/intelligence/connect.ts +0 -102
- package/src/v2/runtime/handlers/intelligence/run.ts +0 -351
- package/src/v2/runtime/handlers/intelligence/thread-names.ts +0 -246
- package/src/v2/runtime/handlers/intelligence/threads.ts +0 -420
- package/src/v2/runtime/handlers/shared/agent-utils.ts +0 -154
- package/src/v2/runtime/handlers/shared/intelligence-utils.ts +0 -41
- package/src/v2/runtime/handlers/shared/json-response.ts +0 -9
- package/src/v2/runtime/handlers/shared/resolve-intelligence-user.ts +0 -28
- package/src/v2/runtime/handlers/shared/sse-response.ts +0 -215
- package/src/v2/runtime/handlers/sse/__tests__/sse-connect-agent-id.test.ts +0 -71
- package/src/v2/runtime/handlers/sse/connect.ts +0 -30
- package/src/v2/runtime/handlers/sse/run.ts +0 -40
- package/src/v2/runtime/hono.ts +0 -2
- package/src/v2/runtime/index.ts +0 -51
- package/src/v2/runtime/intelligence-platform/__tests__/client.test.ts +0 -601
- package/src/v2/runtime/intelligence-platform/__tests__/intelligence-mcp-helper.test.ts +0 -246
- package/src/v2/runtime/intelligence-platform/client.ts +0 -818
- package/src/v2/runtime/intelligence-platform/index.ts +0 -10
- package/src/v2/runtime/node.ts +0 -6
- package/src/v2/runtime/open-generative-ui-middleware.ts +0 -373
- package/src/v2/runtime/runner/__tests__/finalize-events.test.ts +0 -109
- package/src/v2/runtime/runner/__tests__/in-memory-runner.e2e.test.ts +0 -775
- package/src/v2/runtime/runner/__tests__/in-memory-runner.test.ts +0 -777
- package/src/v2/runtime/runner/__tests__/intelligence-runner.test.ts +0 -1039
- package/src/v2/runtime/runner/agent-runner.ts +0 -35
- package/src/v2/runtime/runner/in-memory.ts +0 -467
- package/src/v2/runtime/runner/index.ts +0 -4
- package/src/v2/runtime/runner/intelligence.ts +0 -498
- package/src/v2/runtime/telemetry/__tests__/instance-created.test.ts +0 -96
- package/src/v2/runtime/telemetry/events.ts +0 -35
- package/src/v2/runtime/telemetry/index.ts +0 -7
- package/src/v2/runtime/telemetry/instance-created.ts +0 -44
- package/src/v2/runtime/telemetry/scarf-client.ts +0 -39
- package/src/v2/runtime/telemetry/telemetry-client.ts +0 -70
- package/src/v2/runtime/transcription-service/transcription-service.ts +0 -11
- package/tests/global.d.ts +0 -1
- package/tests/service-adapters/anthropic/allowlist-approach.test.ts +0 -259
- package/tests/service-adapters/anthropic/anthropic-adapter-language-model.test.ts +0 -101
- package/tests/service-adapters/anthropic/anthropic-adapter.test.ts +0 -645
- package/tests/service-adapters/anthropic/utils-token-trimming.test.ts +0 -301
- package/tests/service-adapters/groq/groq-adapter-language-model.test.ts +0 -102
- package/tests/service-adapters/openai/allowlist-approach.test.ts +0 -294
- package/tests/service-adapters/openai/openai-adapter-language-model.test.ts +0 -122
- package/tests/service-adapters/openai/openai-adapter.test.ts +0 -291
- package/tests/service-adapters/shared/sdk-client-utils.test.ts +0 -36
- package/tests/setup.vitest.ts +0 -8
- package/tests/tsconfig.json +0 -10
- package/tsconfig.json +0 -20
- package/tsdown.config.ts +0 -45
- package/typedoc.json +0 -4
- package/vitest.config.mjs +0 -13
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Telemetry lifecycle tests for `packages/runtime/src/v2/runtime/handlers/shared/sse-response.ts`.
|
|
3
|
-
*
|
|
4
|
-
* sse-response.ts fires three events across the SSE stream lifecycle:
|
|
5
|
-
* - oss.runtime.agent_execution_stream_started (line 73, right after observableFactory resolves)
|
|
6
|
-
* - oss.runtime.agent_execution_stream_errored (inside subscribe's error handler)
|
|
7
|
-
* - oss.runtime.agent_execution_stream_ended (inside subscribe's complete handler)
|
|
8
|
-
*
|
|
9
|
-
* Paired with intelligence-run-telemetry.test.ts which covers the
|
|
10
|
-
* intelligence/run path of the same event names — kept separate so a
|
|
11
|
-
* regression in one source file fails only its own test.
|
|
12
|
-
*/
|
|
13
|
-
import { BaseEvent } from "@ag-ui/client";
|
|
14
|
-
import { Observable } from "rxjs";
|
|
15
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
16
|
-
|
|
17
|
-
import { createSseEventResponse } from "../handlers/shared/sse-response";
|
|
18
|
-
import { telemetry } from "../telemetry";
|
|
19
|
-
|
|
20
|
-
function makeRequest(): Request {
|
|
21
|
-
return new Request("https://example.com/agent/test/run", { method: "POST" });
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
describe("sse-response.ts — telemetry lifecycle", () => {
|
|
25
|
-
let captureSpy: ReturnType<typeof vi.spyOn>;
|
|
26
|
-
let errorSpy: ReturnType<typeof vi.spyOn>;
|
|
27
|
-
|
|
28
|
-
beforeEach(() => {
|
|
29
|
-
captureSpy = vi.spyOn(telemetry, "capture").mockResolvedValue(undefined);
|
|
30
|
-
// Swallow the console.error from SSE logError on simulated failures.
|
|
31
|
-
errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
afterEach(() => {
|
|
35
|
-
captureSpy.mockRestore();
|
|
36
|
-
errorSpy.mockRestore();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("fires agent_execution_stream_started once the observable factory resolves", async () => {
|
|
40
|
-
// Observable that never completes — only started should fire.
|
|
41
|
-
const never = new Observable<BaseEvent>(() => {});
|
|
42
|
-
createSseEventResponse({
|
|
43
|
-
request: makeRequest(),
|
|
44
|
-
observableFactory: () => never,
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
await vi.waitFor(() => {
|
|
48
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
49
|
-
"oss.runtime.agent_execution_stream_started",
|
|
50
|
-
{},
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
expect(captureSpy).not.toHaveBeenCalledWith(
|
|
55
|
-
"oss.runtime.agent_execution_stream_errored",
|
|
56
|
-
expect.anything(),
|
|
57
|
-
);
|
|
58
|
-
expect(captureSpy).not.toHaveBeenCalledWith(
|
|
59
|
-
"oss.runtime.agent_execution_stream_ended",
|
|
60
|
-
expect.anything(),
|
|
61
|
-
);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("fires agent_execution_stream_ended when the observable completes", async () => {
|
|
65
|
-
const completing = new Observable<BaseEvent>((subscriber) => {
|
|
66
|
-
subscriber.complete();
|
|
67
|
-
});
|
|
68
|
-
createSseEventResponse({
|
|
69
|
-
request: makeRequest(),
|
|
70
|
-
observableFactory: () => completing,
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
await vi.waitFor(() => {
|
|
74
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
75
|
-
"oss.runtime.agent_execution_stream_ended",
|
|
76
|
-
{},
|
|
77
|
-
);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
// started should also have fired before ended
|
|
81
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
82
|
-
"oss.runtime.agent_execution_stream_started",
|
|
83
|
-
{},
|
|
84
|
-
);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it("fires agent_execution_stream_errored with the error message when the observable errors", async () => {
|
|
88
|
-
const failing = new Observable<BaseEvent>((subscriber) => {
|
|
89
|
-
subscriber.error(new Error("stream blew up"));
|
|
90
|
-
});
|
|
91
|
-
createSseEventResponse({
|
|
92
|
-
request: makeRequest(),
|
|
93
|
-
observableFactory: () => failing,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
await vi.waitFor(() => {
|
|
97
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
98
|
-
"oss.runtime.agent_execution_stream_errored",
|
|
99
|
-
expect.objectContaining({ error: "stream blew up" }),
|
|
100
|
-
);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
104
|
-
"oss.runtime.agent_execution_stream_started",
|
|
105
|
-
{},
|
|
106
|
-
);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { TelemetryClient } from "../telemetry/telemetry-client";
|
|
3
|
-
import scarfClient from "../telemetry/scarf-client";
|
|
4
|
-
|
|
5
|
-
describe("TelemetryClient", () => {
|
|
6
|
-
let scarfSpy: ReturnType<typeof vi.spyOn>;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
scarfSpy = vi.spyOn(scarfClient, "logEvent").mockResolvedValue(undefined);
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
scarfSpy.mockRestore();
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("sends event to scarf when sampled in", async () => {
|
|
17
|
-
vi.spyOn(Math, "random").mockReturnValue(0);
|
|
18
|
-
const client = new TelemetryClient({
|
|
19
|
-
telemetryDisabled: false,
|
|
20
|
-
sampleRate: 1,
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
await client.capture("oss.runtime.instance_created", {
|
|
24
|
-
actionsAmount: 0,
|
|
25
|
-
endpointTypes: [],
|
|
26
|
-
endpointsAmount: 0,
|
|
27
|
-
"cloud.api_key_provided": false,
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
expect(scarfSpy).toHaveBeenCalledWith({
|
|
31
|
-
event: "oss.runtime.instance_created",
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it("only sends event name to scarf, not properties", async () => {
|
|
36
|
-
const client = new TelemetryClient({
|
|
37
|
-
telemetryDisabled: false,
|
|
38
|
-
sampleRate: 1,
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
await client.capture("oss.runtime.copilot_request_created", {
|
|
42
|
-
"cloud.guardrails.enabled": true,
|
|
43
|
-
requestType: "run",
|
|
44
|
-
"cloud.api_key_provided": true,
|
|
45
|
-
"cloud.public_api_key": "pk_test_123",
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
expect(scarfSpy).toHaveBeenCalledWith({
|
|
49
|
-
event: "oss.runtime.copilot_request_created",
|
|
50
|
-
});
|
|
51
|
-
// Properties should NOT be forwarded to scarf
|
|
52
|
-
const callArg = scarfSpy.mock.calls[0][0];
|
|
53
|
-
expect(Object.keys(callArg)).toEqual(["event"]);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("does not send events when telemetryDisabled is true", async () => {
|
|
57
|
-
const client = new TelemetryClient({
|
|
58
|
-
telemetryDisabled: true,
|
|
59
|
-
sampleRate: 1,
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
await client.capture("oss.runtime.instance_created", {
|
|
63
|
-
actionsAmount: 0,
|
|
64
|
-
endpointTypes: [],
|
|
65
|
-
endpointsAmount: 0,
|
|
66
|
-
"cloud.api_key_provided": false,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
expect(scarfSpy).not.toHaveBeenCalled();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it("does not send events when sampled out", async () => {
|
|
73
|
-
vi.spyOn(Math, "random").mockReturnValue(0.99);
|
|
74
|
-
const client = new TelemetryClient({
|
|
75
|
-
telemetryDisabled: false,
|
|
76
|
-
sampleRate: 0.05,
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
await client.capture("oss.runtime.instance_created", {
|
|
80
|
-
actionsAmount: 0,
|
|
81
|
-
endpointTypes: [],
|
|
82
|
-
endpointsAmount: 0,
|
|
83
|
-
"cloud.api_key_provided": false,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
expect(scarfSpy).not.toHaveBeenCalled();
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it("respects sample rate boundary", async () => {
|
|
90
|
-
vi.spyOn(Math, "random").mockReturnValue(0.04);
|
|
91
|
-
const client = new TelemetryClient({
|
|
92
|
-
telemetryDisabled: false,
|
|
93
|
-
sampleRate: 0.05,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
await client.capture("oss.runtime.agent_execution_stream_started", {});
|
|
97
|
-
|
|
98
|
-
expect(scarfSpy).toHaveBeenCalled();
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it("throws when sample rate is out of range", () => {
|
|
102
|
-
expect(() => new TelemetryClient({ sampleRate: 1.5 })).toThrow(
|
|
103
|
-
"Sample rate must be between 0 and 1",
|
|
104
|
-
);
|
|
105
|
-
expect(() => new TelemetryClient({ sampleRate: -0.1 })).toThrow(
|
|
106
|
-
"Sample rate must be between 0 and 1",
|
|
107
|
-
);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
describe("ScarfClient", () => {
|
|
112
|
-
let originalFetch: typeof fetch;
|
|
113
|
-
let fetchMock: ReturnType<typeof vi.fn>;
|
|
114
|
-
|
|
115
|
-
beforeEach(() => {
|
|
116
|
-
originalFetch = global.fetch;
|
|
117
|
-
fetchMock = vi.fn().mockResolvedValue(new Response("", { status: 200 }));
|
|
118
|
-
global.fetch = fetchMock as unknown as typeof fetch;
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
afterEach(() => {
|
|
122
|
-
global.fetch = originalFetch;
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it("sends GET request to scarf gateway with event as query param", async () => {
|
|
126
|
-
await scarfClient.logEvent({ event: "oss.runtime.instance_created" });
|
|
127
|
-
|
|
128
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
129
|
-
const [url, options] = fetchMock.mock.calls[0];
|
|
130
|
-
expect(url).toContain("https://copilotkit.gateway.scarf.sh/");
|
|
131
|
-
expect(url).toContain("event=oss.runtime.instance_created");
|
|
132
|
-
expect(options.method).toBe("GET");
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it("silently fails on network error", async () => {
|
|
136
|
-
fetchMock.mockRejectedValue(new Error("Network error"));
|
|
137
|
-
|
|
138
|
-
// Should not throw
|
|
139
|
-
await expect(
|
|
140
|
-
scarfClient.logEvent({ event: "oss.runtime.instance_created" }),
|
|
141
|
-
).resolves.toBeUndefined();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it("silently fails on non-ok response", async () => {
|
|
145
|
-
fetchMock.mockResolvedValue(new Response("", { status: 500 }));
|
|
146
|
-
|
|
147
|
-
// Should not throw
|
|
148
|
-
await expect(
|
|
149
|
-
scarfClient.logEvent({ event: "oss.runtime.instance_created" }),
|
|
150
|
-
).resolves.toBeUndefined();
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it("skips null and undefined values in query params", async () => {
|
|
154
|
-
await scarfClient.logEvent({
|
|
155
|
-
event: "oss.runtime.instance_created",
|
|
156
|
-
nullVal: null,
|
|
157
|
-
undefinedVal: undefined,
|
|
158
|
-
validVal: "test",
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
const url = fetchMock.mock.calls[0][0] as string;
|
|
162
|
-
expect(url).toContain("event=oss.runtime.instance_created");
|
|
163
|
-
expect(url).toContain("validVal=test");
|
|
164
|
-
expect(url).not.toContain("nullVal");
|
|
165
|
-
expect(url).not.toContain("undefinedVal");
|
|
166
|
-
});
|
|
167
|
-
});
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import type { Message } from "@ag-ui/client";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
ɵnormalizeGeneratedTitle as normalizeGeneratedTitle,
|
|
6
|
-
ɵbuildThreadTitlePrompt as buildThreadTitlePrompt,
|
|
7
|
-
ɵhasThreadName as hasThreadName,
|
|
8
|
-
} from "../handlers/intelligence/thread-names";
|
|
9
|
-
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
// normalizeGeneratedTitle
|
|
12
|
-
// ---------------------------------------------------------------------------
|
|
13
|
-
|
|
14
|
-
describe("normalizeGeneratedTitle", () => {
|
|
15
|
-
it("extracts title from valid JSON response", () => {
|
|
16
|
-
expect(normalizeGeneratedTitle('{"title":"Budget Review"}')).toBe(
|
|
17
|
-
"Budget Review",
|
|
18
|
-
);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it("extracts title from JSON wrapped in code fences", () => {
|
|
22
|
-
expect(
|
|
23
|
-
normalizeGeneratedTitle('```json\n{"title":"Budget Review"}\n```'),
|
|
24
|
-
).toBe("Budget Review");
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it("strips surrounding quotes from plain text", () => {
|
|
28
|
-
expect(normalizeGeneratedTitle('"Budget Review"')).toBe("Budget Review");
|
|
29
|
-
expect(normalizeGeneratedTitle("'Budget Review'")).toBe("Budget Review");
|
|
30
|
-
expect(normalizeGeneratedTitle("`Budget Review`")).toBe("Budget Review");
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it("strips markdown characters", () => {
|
|
34
|
-
expect(normalizeGeneratedTitle("**Budget** _Review_")).toBe(
|
|
35
|
-
"Budget Review",
|
|
36
|
-
);
|
|
37
|
-
expect(normalizeGeneratedTitle("# Budget Review")).toBe("Budget Review");
|
|
38
|
-
expect(normalizeGeneratedTitle("[Budget](Review)")).toBe("BudgetReview");
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("strips trailing punctuation", () => {
|
|
42
|
-
expect(normalizeGeneratedTitle("Budget Review.")).toBe("Budget Review");
|
|
43
|
-
expect(normalizeGeneratedTitle("Budget Review!")).toBe("Budget Review");
|
|
44
|
-
expect(normalizeGeneratedTitle("Budget Review?")).toBe("Budget Review");
|
|
45
|
-
expect(normalizeGeneratedTitle("Budget Review;")).toBe("Budget Review");
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it("collapses whitespace", () => {
|
|
49
|
-
expect(normalizeGeneratedTitle("Budget Review")).toBe("Budget Review");
|
|
50
|
-
expect(normalizeGeneratedTitle(" Budget Review ")).toBe("Budget Review");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("returns null for empty or whitespace-only input", () => {
|
|
54
|
-
expect(normalizeGeneratedTitle("")).toBeNull();
|
|
55
|
-
expect(normalizeGeneratedTitle(" ")).toBeNull();
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("returns null when all content is stripped", () => {
|
|
59
|
-
expect(normalizeGeneratedTitle("***")).toBeNull();
|
|
60
|
-
expect(normalizeGeneratedTitle("[]()")).toBeNull();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("truncates titles longer than 80 characters", () => {
|
|
64
|
-
const long = "A".repeat(100);
|
|
65
|
-
const result = normalizeGeneratedTitle(long);
|
|
66
|
-
expect(result).not.toBeNull();
|
|
67
|
-
expect(result!.length).toBeLessThanOrEqual(80);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("returns null when title has more than 8 words", () => {
|
|
71
|
-
expect(
|
|
72
|
-
normalizeGeneratedTitle("one two three four five six seven eight nine"),
|
|
73
|
-
).toBeNull();
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it("accepts title with exactly 8 words", () => {
|
|
77
|
-
expect(
|
|
78
|
-
normalizeGeneratedTitle("one two three four five six seven eight"),
|
|
79
|
-
).toBe("one two three four five six seven eight");
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it("handles JSON with non-string title gracefully", () => {
|
|
83
|
-
// Falls back to raw text path
|
|
84
|
-
expect(normalizeGeneratedTitle('{"title":42}')).toBe('{"title":42}');
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it("handles malformed JSON gracefully", () => {
|
|
88
|
-
expect(normalizeGeneratedTitle("{not json}")).toBe("{not json}");
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
// buildThreadTitlePrompt
|
|
94
|
-
// ---------------------------------------------------------------------------
|
|
95
|
-
|
|
96
|
-
describe("buildThreadTitlePrompt", () => {
|
|
97
|
-
const msg = (role: string, content: string): Message =>
|
|
98
|
-
({ id: `msg-${role}`, role, content }) as Message;
|
|
99
|
-
|
|
100
|
-
it("returns null for empty messages", () => {
|
|
101
|
-
expect(buildThreadTitlePrompt([])).toBeNull();
|
|
102
|
-
expect(
|
|
103
|
-
buildThreadTitlePrompt(undefined as unknown as Message[]),
|
|
104
|
-
).toBeNull();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it("builds a prompt from user and assistant messages", () => {
|
|
108
|
-
const messages = [
|
|
109
|
-
msg("user", "What is the weather?"),
|
|
110
|
-
msg("assistant", "It is sunny today."),
|
|
111
|
-
];
|
|
112
|
-
|
|
113
|
-
const result = buildThreadTitlePrompt(messages);
|
|
114
|
-
expect(result).toContain("Generate a short title");
|
|
115
|
-
expect(result).toContain("user: What is the weather?");
|
|
116
|
-
expect(result).toContain("assistant: It is sunny today.");
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it("filters out tool role messages", () => {
|
|
120
|
-
const messages = [
|
|
121
|
-
msg("user", "Search for cats"),
|
|
122
|
-
msg("tool", '{"results": []}'),
|
|
123
|
-
msg("assistant", "Found some cats."),
|
|
124
|
-
];
|
|
125
|
-
|
|
126
|
-
const result = buildThreadTitlePrompt(messages);
|
|
127
|
-
expect(result).not.toContain("tool:");
|
|
128
|
-
expect(result).toContain("user: Search for cats");
|
|
129
|
-
expect(result).toContain("assistant: Found some cats.");
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it("includes system and developer messages", () => {
|
|
133
|
-
const messages = [
|
|
134
|
-
msg("system", "You are helpful."),
|
|
135
|
-
msg("developer", "Be concise."),
|
|
136
|
-
msg("user", "Hello"),
|
|
137
|
-
];
|
|
138
|
-
|
|
139
|
-
const result = buildThreadTitlePrompt(messages);
|
|
140
|
-
expect(result).toContain("system: You are helpful.");
|
|
141
|
-
expect(result).toContain("developer: Be concise.");
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
it("takes only the last 8 messages", () => {
|
|
145
|
-
const messages = Array.from({ length: 12 }, (_, i) =>
|
|
146
|
-
msg("user", `Message ${i}`),
|
|
147
|
-
);
|
|
148
|
-
|
|
149
|
-
const result = buildThreadTitlePrompt(messages)!;
|
|
150
|
-
// Should contain messages 4-11 (last 8) but not 0-3
|
|
151
|
-
expect(result).not.toContain("Message 3");
|
|
152
|
-
expect(result).toContain("Message 4");
|
|
153
|
-
expect(result).toContain("Message 11");
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
it("skips messages with empty content", () => {
|
|
157
|
-
const messages = [msg("user", ""), msg("assistant", "Hello")];
|
|
158
|
-
|
|
159
|
-
const result = buildThreadTitlePrompt(messages);
|
|
160
|
-
expect(result).not.toContain("user:");
|
|
161
|
-
expect(result).toContain("assistant: Hello");
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
it("returns null when all messages have empty content", () => {
|
|
165
|
-
const messages = [msg("user", ""), msg("assistant", "")];
|
|
166
|
-
expect(buildThreadTitlePrompt(messages)).toBeNull();
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
// ---------------------------------------------------------------------------
|
|
171
|
-
// hasThreadName
|
|
172
|
-
// ---------------------------------------------------------------------------
|
|
173
|
-
|
|
174
|
-
describe("hasThreadName", () => {
|
|
175
|
-
it("returns true for non-empty strings", () => {
|
|
176
|
-
expect(hasThreadName("Budget Review")).toBe(true);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it("returns false for null and undefined", () => {
|
|
180
|
-
expect(hasThreadName(null)).toBe(false);
|
|
181
|
-
expect(hasThreadName(undefined)).toBe(false);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it("returns false for empty or whitespace-only strings", () => {
|
|
185
|
-
expect(hasThreadName("")).toBe(false);
|
|
186
|
-
expect(hasThreadName(" ")).toBe(false);
|
|
187
|
-
});
|
|
188
|
-
});
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
-
import { EventType } from "@ag-ui/client";
|
|
3
|
-
import type { BaseEvent } from "@ag-ui/client";
|
|
4
|
-
import type { DebugEventEnvelope } from "@copilotkit/shared";
|
|
5
|
-
import { DebugEventBus } from "../debug-event-bus";
|
|
6
|
-
|
|
7
|
-
// ---------------------------------------------------------------------------
|
|
8
|
-
// Helpers
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
|
|
11
|
-
function createBaseEvent(
|
|
12
|
-
overrides: Partial<BaseEvent> & { type: EventType } = {
|
|
13
|
-
type: EventType.RUN_STARTED,
|
|
14
|
-
},
|
|
15
|
-
): BaseEvent {
|
|
16
|
-
return { type: overrides.type, ...overrides };
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const defaultMetadata = {
|
|
20
|
-
agentId: "test-agent",
|
|
21
|
-
threadId: "thread-1",
|
|
22
|
-
runId: "run-1",
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
26
|
-
// Tests
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
|
|
29
|
-
describe("DebugEventBus", () => {
|
|
30
|
-
it("subscribe adds a listener and broadcast calls it with the correct envelope shape", () => {
|
|
31
|
-
const bus = new DebugEventBus();
|
|
32
|
-
const listener = vi.fn<[DebugEventEnvelope], void>();
|
|
33
|
-
const event = createBaseEvent({ type: EventType.RUN_STARTED });
|
|
34
|
-
|
|
35
|
-
bus.subscribe(listener);
|
|
36
|
-
bus.broadcast(event, defaultMetadata);
|
|
37
|
-
|
|
38
|
-
expect(listener).toHaveBeenCalledOnce();
|
|
39
|
-
const envelope = listener.mock.calls[0][0];
|
|
40
|
-
expect(envelope).toEqual(
|
|
41
|
-
expect.objectContaining({
|
|
42
|
-
agentId: "test-agent",
|
|
43
|
-
threadId: "thread-1",
|
|
44
|
-
runId: "run-1",
|
|
45
|
-
event,
|
|
46
|
-
}),
|
|
47
|
-
);
|
|
48
|
-
expect(typeof envelope.timestamp).toBe("number");
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("unsubscribe removes the listener so subsequent broadcasts don't reach it", () => {
|
|
52
|
-
const bus = new DebugEventBus();
|
|
53
|
-
const listener = vi.fn<[DebugEventEnvelope], void>();
|
|
54
|
-
const event = createBaseEvent();
|
|
55
|
-
|
|
56
|
-
const unsub = bus.subscribe(listener);
|
|
57
|
-
unsub();
|
|
58
|
-
bus.broadcast(event, defaultMetadata);
|
|
59
|
-
|
|
60
|
-
expect(listener).not.toHaveBeenCalled();
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it("multiple listeners all receive the same broadcast", () => {
|
|
64
|
-
const bus = new DebugEventBus();
|
|
65
|
-
const listenerA = vi.fn<[DebugEventEnvelope], void>();
|
|
66
|
-
const listenerB = vi.fn<[DebugEventEnvelope], void>();
|
|
67
|
-
const event = createBaseEvent();
|
|
68
|
-
|
|
69
|
-
bus.subscribe(listenerA);
|
|
70
|
-
bus.subscribe(listenerB);
|
|
71
|
-
bus.broadcast(event, defaultMetadata);
|
|
72
|
-
|
|
73
|
-
expect(listenerA).toHaveBeenCalledOnce();
|
|
74
|
-
expect(listenerB).toHaveBeenCalledOnce();
|
|
75
|
-
// Both receive the same envelope object
|
|
76
|
-
expect(listenerA.mock.calls[0][0]).toBe(listenerB.mock.calls[0][0]);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it("listener errors are swallowed and other listeners still receive the event", () => {
|
|
80
|
-
const bus = new DebugEventBus();
|
|
81
|
-
const failingListener = vi
|
|
82
|
-
.fn<[DebugEventEnvelope], void>()
|
|
83
|
-
.mockImplementation(() => {
|
|
84
|
-
throw new Error("boom");
|
|
85
|
-
});
|
|
86
|
-
const healthyListener = vi.fn<[DebugEventEnvelope], void>();
|
|
87
|
-
const event = createBaseEvent();
|
|
88
|
-
|
|
89
|
-
bus.subscribe(failingListener);
|
|
90
|
-
bus.subscribe(healthyListener);
|
|
91
|
-
|
|
92
|
-
// Should not throw
|
|
93
|
-
expect(() => bus.broadcast(event, defaultMetadata)).not.toThrow();
|
|
94
|
-
expect(failingListener).toHaveBeenCalledOnce();
|
|
95
|
-
expect(healthyListener).toHaveBeenCalledOnce();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("broadcasting with no listeners does not throw", () => {
|
|
99
|
-
const bus = new DebugEventBus();
|
|
100
|
-
const event = createBaseEvent();
|
|
101
|
-
|
|
102
|
-
expect(() => bus.broadcast(event, defaultMetadata)).not.toThrow();
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("listenerCount reflects current count after subscribe and unsubscribe", () => {
|
|
106
|
-
const bus = new DebugEventBus();
|
|
107
|
-
|
|
108
|
-
expect(bus.listenerCount).toBe(0);
|
|
109
|
-
|
|
110
|
-
const unsub1 = bus.subscribe(vi.fn());
|
|
111
|
-
expect(bus.listenerCount).toBe(1);
|
|
112
|
-
|
|
113
|
-
const unsub2 = bus.subscribe(vi.fn());
|
|
114
|
-
expect(bus.listenerCount).toBe(2);
|
|
115
|
-
|
|
116
|
-
unsub1();
|
|
117
|
-
expect(bus.listenerCount).toBe(1);
|
|
118
|
-
|
|
119
|
-
unsub2();
|
|
120
|
-
expect(bus.listenerCount).toBe(0);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it("envelope has correct timestamp, agentId, threadId, runId, and the original event", () => {
|
|
124
|
-
const bus = new DebugEventBus();
|
|
125
|
-
const listener = vi.fn<[DebugEventEnvelope], void>();
|
|
126
|
-
const event = createBaseEvent({ type: EventType.STEP_STARTED });
|
|
127
|
-
const metadata = { agentId: "agent-x", threadId: "t-42", runId: "r-99" };
|
|
128
|
-
|
|
129
|
-
const before = Date.now();
|
|
130
|
-
bus.subscribe(listener);
|
|
131
|
-
bus.broadcast(event, metadata);
|
|
132
|
-
const after = Date.now();
|
|
133
|
-
|
|
134
|
-
const envelope = listener.mock.calls[0][0];
|
|
135
|
-
expect(envelope.agentId).toBe("agent-x");
|
|
136
|
-
expect(envelope.threadId).toBe("t-42");
|
|
137
|
-
expect(envelope.runId).toBe("r-99");
|
|
138
|
-
expect(envelope.event).toBe(event);
|
|
139
|
-
expect(envelope.timestamp).toBeGreaterThanOrEqual(before);
|
|
140
|
-
expect(envelope.timestamp).toBeLessThanOrEqual(after);
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it("RUN_STARTED event type passthrough: envelope.event is the original object, not a copy", () => {
|
|
144
|
-
const bus = new DebugEventBus();
|
|
145
|
-
const listener = vi.fn<[DebugEventEnvelope], void>();
|
|
146
|
-
const event = createBaseEvent({ type: EventType.RUN_STARTED });
|
|
147
|
-
|
|
148
|
-
bus.subscribe(listener);
|
|
149
|
-
bus.broadcast(event, defaultMetadata);
|
|
150
|
-
|
|
151
|
-
const envelope = listener.mock.calls[0][0];
|
|
152
|
-
// Strict referential equality — the event is passed through, not cloned
|
|
153
|
-
expect(envelope.event).toBe(event);
|
|
154
|
-
expect(envelope.event.type).toBe(EventType.RUN_STARTED);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { BaseEvent } from "@ag-ui/client";
|
|
2
|
-
import { DebugEventEnvelope } from "@copilotkit/shared";
|
|
3
|
-
|
|
4
|
-
export type DebugEventListener = (envelope: DebugEventEnvelope) => void;
|
|
5
|
-
|
|
6
|
-
export class DebugEventBus {
|
|
7
|
-
private listeners = new Set<DebugEventListener>();
|
|
8
|
-
|
|
9
|
-
subscribe(listener: DebugEventListener): () => void {
|
|
10
|
-
this.listeners.add(listener);
|
|
11
|
-
return () => {
|
|
12
|
-
this.listeners.delete(listener);
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
broadcast(
|
|
17
|
-
event: BaseEvent,
|
|
18
|
-
metadata: { agentId: string; threadId: string; runId: string },
|
|
19
|
-
): void {
|
|
20
|
-
if (this.listeners.size === 0) return;
|
|
21
|
-
|
|
22
|
-
const envelope: DebugEventEnvelope = {
|
|
23
|
-
timestamp: Date.now(),
|
|
24
|
-
agentId: metadata.agentId,
|
|
25
|
-
threadId: metadata.threadId,
|
|
26
|
-
runId: metadata.runId,
|
|
27
|
-
event,
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
for (const listener of this.listeners) {
|
|
31
|
-
try {
|
|
32
|
-
listener(envelope);
|
|
33
|
-
} catch (err) {
|
|
34
|
-
console.warn(
|
|
35
|
-
"[DebugEventBus] Listener error suppressed:",
|
|
36
|
-
err instanceof Error ? err.message : err,
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
get listenerCount(): number {
|
|
43
|
-
return this.listeners.size;
|
|
44
|
-
}
|
|
45
|
-
}
|