@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,275 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach, vi } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
AbstractAgent,
|
|
4
|
-
RunAgentInput,
|
|
5
|
-
BaseEvent,
|
|
6
|
-
EventType,
|
|
7
|
-
} from "@ag-ui/client";
|
|
8
|
-
import { Observable } from "rxjs";
|
|
9
|
-
import { LLMock, MCPMock } from "@copilotkit/aimock";
|
|
10
|
-
import { MCPAppsMiddleware, getServerHash } from "@ag-ui/mcp-apps-middleware";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* A minimal next-agent that emits RUN_STARTED and RUN_FINISHED.
|
|
14
|
-
* Used as the downstream agent when the middleware should NOT delegate.
|
|
15
|
-
*/
|
|
16
|
-
class MockNextAgent extends AbstractAgent {
|
|
17
|
-
run(input: RunAgentInput): Observable<BaseEvent> {
|
|
18
|
-
return new Observable((subscriber) => {
|
|
19
|
-
subscriber.next({
|
|
20
|
-
type: EventType.RUN_STARTED,
|
|
21
|
-
threadId: input.threadId,
|
|
22
|
-
runId: input.runId,
|
|
23
|
-
} as BaseEvent);
|
|
24
|
-
subscriber.next({
|
|
25
|
-
type: EventType.RUN_FINISHED,
|
|
26
|
-
threadId: input.threadId,
|
|
27
|
-
runId: input.runId,
|
|
28
|
-
} as BaseEvent);
|
|
29
|
-
subscriber.complete();
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
clone(): AbstractAgent {
|
|
34
|
-
return new MockNextAgent();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
protected connect(): ReturnType<AbstractAgent["connect"]> {
|
|
38
|
-
throw new Error("not used");
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function createRunInput(overrides: Partial<RunAgentInput> = {}): RunAgentInput {
|
|
43
|
-
return {
|
|
44
|
-
threadId: "thread-1",
|
|
45
|
-
runId: "run-1",
|
|
46
|
-
state: {},
|
|
47
|
-
messages: [],
|
|
48
|
-
tools: [],
|
|
49
|
-
context: [],
|
|
50
|
-
forwardedProps: undefined,
|
|
51
|
-
...overrides,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
async function collectEvents(
|
|
56
|
-
observable: Observable<BaseEvent>,
|
|
57
|
-
): Promise<BaseEvent[]> {
|
|
58
|
-
const events: BaseEvent[] = [];
|
|
59
|
-
await new Promise<void>((resolve, reject) => {
|
|
60
|
-
observable.subscribe({
|
|
61
|
-
next: (event) => events.push(event),
|
|
62
|
-
error: reject,
|
|
63
|
-
complete: resolve,
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
return events;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
describe("MCPAppsMiddleware integration", () => {
|
|
70
|
-
let llm: LLMock;
|
|
71
|
-
let mcpMock: MCPMock;
|
|
72
|
-
|
|
73
|
-
afterEach(async () => {
|
|
74
|
-
if (llm) {
|
|
75
|
-
await llm.stop().catch(() => {});
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
async function startMcpServer(): Promise<string> {
|
|
80
|
-
mcpMock = new MCPMock();
|
|
81
|
-
mcpMock.addTool({
|
|
82
|
-
name: "get_weather",
|
|
83
|
-
description: "Get the weather",
|
|
84
|
-
inputSchema: {
|
|
85
|
-
type: "object",
|
|
86
|
-
properties: { city: { type: "string" } },
|
|
87
|
-
},
|
|
88
|
-
});
|
|
89
|
-
mcpMock.onToolCall("get_weather", (args: unknown) => {
|
|
90
|
-
const parsed = args as { city?: string };
|
|
91
|
-
return `Weather in ${parsed.city || "unknown"}: sunny`;
|
|
92
|
-
});
|
|
93
|
-
mcpMock.addResource(
|
|
94
|
-
{
|
|
95
|
-
uri: "app://dashboard",
|
|
96
|
-
name: "Dashboard",
|
|
97
|
-
mimeType: "text/plain",
|
|
98
|
-
},
|
|
99
|
-
{ text: "Dashboard content here" },
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
llm = new LLMock({ port: 0 });
|
|
103
|
-
llm.mount("/mcp", mcpMock);
|
|
104
|
-
await llm.start();
|
|
105
|
-
return `${llm.url}/mcp`;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
it("can be created with mcpServers config pointing at MCPMock URL", async () => {
|
|
109
|
-
const mcpUrl = await startMcpServer();
|
|
110
|
-
|
|
111
|
-
const middleware = new MCPAppsMiddleware({
|
|
112
|
-
mcpServers: [{ type: "http", url: mcpUrl }],
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
expect(middleware).toBeInstanceOf(MCPAppsMiddleware);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it("proxies tools/call through to MCPMock and returns results", async () => {
|
|
119
|
-
const mcpUrl = await startMcpServer();
|
|
120
|
-
|
|
121
|
-
const serverConfig = { type: "http" as const, url: mcpUrl };
|
|
122
|
-
const serverHash = getServerHash(serverConfig);
|
|
123
|
-
|
|
124
|
-
const middleware = new MCPAppsMiddleware({
|
|
125
|
-
mcpServers: [serverConfig],
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
const input = createRunInput({
|
|
129
|
-
forwardedProps: {
|
|
130
|
-
__proxiedMCPRequest: {
|
|
131
|
-
serverHash,
|
|
132
|
-
method: "tools/call",
|
|
133
|
-
params: {
|
|
134
|
-
name: "get_weather",
|
|
135
|
-
arguments: { city: "NYC" },
|
|
136
|
-
},
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
const mockAgent = new MockNextAgent();
|
|
142
|
-
const events = await collectEvents(middleware.run(input, mockAgent));
|
|
143
|
-
|
|
144
|
-
// Should have RUN_STARTED and RUN_FINISHED
|
|
145
|
-
const types = events.map((e) => e.type);
|
|
146
|
-
expect(types).toContain(EventType.RUN_STARTED);
|
|
147
|
-
expect(types).toContain(EventType.RUN_FINISHED);
|
|
148
|
-
|
|
149
|
-
// RUN_FINISHED should contain the MCP tool result
|
|
150
|
-
const runFinished = events.find(
|
|
151
|
-
(e) => e.type === EventType.RUN_FINISHED,
|
|
152
|
-
) as BaseEvent & { result?: unknown };
|
|
153
|
-
expect(runFinished).toBeDefined();
|
|
154
|
-
expect(runFinished.result).toBeDefined();
|
|
155
|
-
|
|
156
|
-
// The result should contain the tool's text content
|
|
157
|
-
const result = runFinished.result as { content?: unknown[] };
|
|
158
|
-
expect(result.content).toBeDefined();
|
|
159
|
-
expect(Array.isArray(result.content)).toBe(true);
|
|
160
|
-
|
|
161
|
-
const textContent = (
|
|
162
|
-
result.content as Array<{ type: string; text?: string }>
|
|
163
|
-
).find((c) => c.type === "text");
|
|
164
|
-
expect(textContent).toBeDefined();
|
|
165
|
-
expect(textContent!.text).toContain("sunny");
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
it("non-proxied request delegates to next agent", async () => {
|
|
169
|
-
const mcpUrl = await startMcpServer();
|
|
170
|
-
|
|
171
|
-
const middleware = new MCPAppsMiddleware({
|
|
172
|
-
mcpServers: [{ type: "http", url: mcpUrl }],
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
// Input WITHOUT __proxiedMCPRequest — should delegate to MockNextAgent
|
|
176
|
-
const input = createRunInput();
|
|
177
|
-
|
|
178
|
-
const mockAgent = new MockNextAgent();
|
|
179
|
-
|
|
180
|
-
const events = await collectEvents(middleware.run(input, mockAgent));
|
|
181
|
-
|
|
182
|
-
// MockNextAgent's run should have been called (delegation happened)
|
|
183
|
-
// The middleware calls runNextWithState which internally calls next.run,
|
|
184
|
-
// but since processStream wraps it, we check the output events instead
|
|
185
|
-
const types = events.map((e) => e.type);
|
|
186
|
-
expect(types).toContain(EventType.RUN_STARTED);
|
|
187
|
-
expect(types).toContain(EventType.RUN_FINISHED);
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
it("wrong serverHash returns error in RUN_FINISHED result", async () => {
|
|
191
|
-
const mcpUrl = await startMcpServer();
|
|
192
|
-
|
|
193
|
-
const middleware = new MCPAppsMiddleware({
|
|
194
|
-
mcpServers: [{ type: "http", url: mcpUrl }],
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
const input = createRunInput({
|
|
198
|
-
forwardedProps: {
|
|
199
|
-
__proxiedMCPRequest: {
|
|
200
|
-
serverHash: "nonexistent-hash-value",
|
|
201
|
-
method: "tools/call",
|
|
202
|
-
params: {
|
|
203
|
-
name: "get_weather",
|
|
204
|
-
arguments: { city: "NYC" },
|
|
205
|
-
},
|
|
206
|
-
},
|
|
207
|
-
},
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
const mockAgent = new MockNextAgent();
|
|
211
|
-
const events = await collectEvents(middleware.run(input, mockAgent));
|
|
212
|
-
|
|
213
|
-
// Should still get RUN_STARTED and RUN_FINISHED
|
|
214
|
-
const types = events.map((e) => e.type);
|
|
215
|
-
expect(types).toContain(EventType.RUN_STARTED);
|
|
216
|
-
expect(types).toContain(EventType.RUN_FINISHED);
|
|
217
|
-
|
|
218
|
-
// RUN_FINISHED should contain an error about unknown server
|
|
219
|
-
const runFinished = events.find(
|
|
220
|
-
(e) => e.type === EventType.RUN_FINISHED,
|
|
221
|
-
) as BaseEvent & { result?: unknown };
|
|
222
|
-
expect(runFinished).toBeDefined();
|
|
223
|
-
const result = runFinished.result as { error?: string };
|
|
224
|
-
expect(result.error).toBeDefined();
|
|
225
|
-
expect(result.error).toContain("nonexistent-hash-value");
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
it("proxies resources/read through to MCPMock and returns results", async () => {
|
|
229
|
-
const mcpUrl = await startMcpServer();
|
|
230
|
-
|
|
231
|
-
const serverConfig = { type: "http" as const, url: mcpUrl };
|
|
232
|
-
const serverHash = getServerHash(serverConfig);
|
|
233
|
-
|
|
234
|
-
const middleware = new MCPAppsMiddleware({
|
|
235
|
-
mcpServers: [serverConfig],
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
const input = createRunInput({
|
|
239
|
-
forwardedProps: {
|
|
240
|
-
__proxiedMCPRequest: {
|
|
241
|
-
serverHash,
|
|
242
|
-
method: "resources/read",
|
|
243
|
-
params: { uri: "app://dashboard" },
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
const mockAgent = new MockNextAgent();
|
|
249
|
-
const events = await collectEvents(middleware.run(input, mockAgent));
|
|
250
|
-
|
|
251
|
-
// Should have RUN_STARTED and RUN_FINISHED
|
|
252
|
-
const types = events.map((e) => e.type);
|
|
253
|
-
expect(types).toContain(EventType.RUN_STARTED);
|
|
254
|
-
expect(types).toContain(EventType.RUN_FINISHED);
|
|
255
|
-
|
|
256
|
-
// RUN_FINISHED should contain the resource content
|
|
257
|
-
const runFinished = events.find(
|
|
258
|
-
(e) => e.type === EventType.RUN_FINISHED,
|
|
259
|
-
) as BaseEvent & { result?: unknown };
|
|
260
|
-
expect(runFinished).toBeDefined();
|
|
261
|
-
expect(runFinished.result).toBeDefined();
|
|
262
|
-
|
|
263
|
-
// The result should contain resource contents
|
|
264
|
-
const result = runFinished.result as { contents?: unknown[] };
|
|
265
|
-
expect(result.contents).toBeDefined();
|
|
266
|
-
expect(Array.isArray(result.contents)).toBe(true);
|
|
267
|
-
|
|
268
|
-
const resource = (
|
|
269
|
-
result.contents as Array<{ uri: string; text?: string }>
|
|
270
|
-
)[0];
|
|
271
|
-
expect(resource).toBeDefined();
|
|
272
|
-
expect(resource.uri).toBe("app://dashboard");
|
|
273
|
-
expect(resource.text).toContain("Dashboard content here");
|
|
274
|
-
});
|
|
275
|
-
});
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import express from "express";
|
|
2
|
-
import request from "supertest";
|
|
3
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
|
-
import type { AbstractAgent } from "@ag-ui/client";
|
|
5
|
-
|
|
6
|
-
import { createCopilotEndpointExpress } from "../express";
|
|
7
|
-
import { CopilotRuntime } from "../core/runtime";
|
|
8
|
-
import { logger } from "@copilotkit/shared";
|
|
9
|
-
|
|
10
|
-
const dummyRuntime = (opts: Partial<CopilotRuntime> = {}) => {
|
|
11
|
-
const runtime = new CopilotRuntime({
|
|
12
|
-
agents: { agent: {} as unknown as AbstractAgent },
|
|
13
|
-
...opts,
|
|
14
|
-
});
|
|
15
|
-
return runtime;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
describe("CopilotEndpointExpress middleware", () => {
|
|
19
|
-
afterEach(() => {
|
|
20
|
-
vi.restoreAllMocks();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const buildApp = (runtime: CopilotRuntime) => {
|
|
24
|
-
const app = express();
|
|
25
|
-
app.use(createCopilotEndpointExpress({ runtime, basePath: "/" }));
|
|
26
|
-
return app;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
it("processes request through middleware and handler", async () => {
|
|
30
|
-
const modifiedRequest = new Request("https://example.com/info", {
|
|
31
|
-
headers: { "x-modified": "yes" },
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
const before = vi.fn().mockResolvedValue(modifiedRequest);
|
|
35
|
-
const after = vi.fn().mockResolvedValue(undefined);
|
|
36
|
-
|
|
37
|
-
const runtime = dummyRuntime({
|
|
38
|
-
beforeRequestMiddleware: before,
|
|
39
|
-
afterRequestMiddleware: after,
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
const app = buildApp(runtime);
|
|
43
|
-
const response = await request(app).get("/info");
|
|
44
|
-
|
|
45
|
-
expect(before).toHaveBeenCalledWith({
|
|
46
|
-
runtime,
|
|
47
|
-
request: expect.any(Request),
|
|
48
|
-
path: "/info",
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
await vi.waitFor(() => {
|
|
52
|
-
expect(after).toHaveBeenCalledWith(
|
|
53
|
-
expect.objectContaining({
|
|
54
|
-
runtime,
|
|
55
|
-
response: expect.any(Response),
|
|
56
|
-
path: "/info",
|
|
57
|
-
}),
|
|
58
|
-
);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
expect(response.status).toBe(200);
|
|
62
|
-
expect(response.body).toHaveProperty("version");
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it("returns Response from before middleware", async () => {
|
|
66
|
-
const errorResponse = new Response("Error", { status: 400 });
|
|
67
|
-
const before = vi.fn().mockRejectedValue(errorResponse);
|
|
68
|
-
const after = vi.fn();
|
|
69
|
-
const runtime = dummyRuntime({
|
|
70
|
-
beforeRequestMiddleware: before,
|
|
71
|
-
afterRequestMiddleware: after,
|
|
72
|
-
});
|
|
73
|
-
const logSpy = vi
|
|
74
|
-
.spyOn(logger, "error")
|
|
75
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
76
|
-
|
|
77
|
-
const app = buildApp(runtime);
|
|
78
|
-
const response = await request(app).get("/info");
|
|
79
|
-
|
|
80
|
-
expect(response.status).toBe(400);
|
|
81
|
-
expect(logSpy).toHaveBeenCalledWith(
|
|
82
|
-
expect.objectContaining({
|
|
83
|
-
err: errorResponse,
|
|
84
|
-
url: expect.stringContaining("/info"),
|
|
85
|
-
path: "/info",
|
|
86
|
-
}),
|
|
87
|
-
"Error running before request middleware",
|
|
88
|
-
);
|
|
89
|
-
expect(after).not.toHaveBeenCalled();
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it("logs and returns 500 when before middleware throws", async () => {
|
|
93
|
-
const error = new Error("before");
|
|
94
|
-
const before = vi.fn().mockRejectedValue(error);
|
|
95
|
-
const after = vi.fn();
|
|
96
|
-
const runtime = dummyRuntime({
|
|
97
|
-
beforeRequestMiddleware: before,
|
|
98
|
-
afterRequestMiddleware: after,
|
|
99
|
-
});
|
|
100
|
-
const logSpy = vi
|
|
101
|
-
.spyOn(logger, "error")
|
|
102
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
103
|
-
|
|
104
|
-
const app = buildApp(runtime);
|
|
105
|
-
const response = await request(app).get("/info");
|
|
106
|
-
|
|
107
|
-
expect(response.status).toBe(500);
|
|
108
|
-
expect(logSpy).toHaveBeenCalledWith(
|
|
109
|
-
expect.objectContaining({
|
|
110
|
-
err: error,
|
|
111
|
-
url: expect.stringContaining("/info"),
|
|
112
|
-
path: "/info",
|
|
113
|
-
}),
|
|
114
|
-
"Error running before request middleware",
|
|
115
|
-
);
|
|
116
|
-
expect(after).not.toHaveBeenCalled();
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it("logs handler error", async () => {
|
|
120
|
-
const before = vi.fn();
|
|
121
|
-
const after = vi.fn();
|
|
122
|
-
const errorAgent = {
|
|
123
|
-
clone: () => {
|
|
124
|
-
throw new Error("Agent error");
|
|
125
|
-
},
|
|
126
|
-
} as unknown as AbstractAgent;
|
|
127
|
-
|
|
128
|
-
const runtime = dummyRuntime({
|
|
129
|
-
beforeRequestMiddleware: before,
|
|
130
|
-
afterRequestMiddleware: after,
|
|
131
|
-
agents: { agent: errorAgent },
|
|
132
|
-
});
|
|
133
|
-
const logSpy = vi
|
|
134
|
-
.spyOn(logger, "error")
|
|
135
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
136
|
-
|
|
137
|
-
const app = buildApp(runtime);
|
|
138
|
-
const response = await request(app)
|
|
139
|
-
.post("/agent/agent/run")
|
|
140
|
-
.set("Content-Type", "application/json")
|
|
141
|
-
.send({});
|
|
142
|
-
|
|
143
|
-
expect(response.status).toBe(500);
|
|
144
|
-
expect(logSpy).toHaveBeenCalled();
|
|
145
|
-
await vi.waitFor(() => {
|
|
146
|
-
expect(after).toHaveBeenCalled();
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
it("passes parsed messages to afterRequestMiddleware", async () => {
|
|
151
|
-
let receivedParams: Record<string, unknown> = {};
|
|
152
|
-
const after = vi.fn().mockImplementation((params) => {
|
|
153
|
-
receivedParams = params;
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
const runtime = dummyRuntime({
|
|
157
|
-
afterRequestMiddleware: after,
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
const app = buildApp(runtime);
|
|
161
|
-
const response = await request(app).get("/info");
|
|
162
|
-
|
|
163
|
-
await vi.waitFor(() => {
|
|
164
|
-
expect(after).toHaveBeenCalled();
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
expect(response.status).toBe(200);
|
|
168
|
-
expect(receivedParams).toHaveProperty("messages");
|
|
169
|
-
expect(receivedParams.messages).toEqual([]);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
it("logs error from after middleware", async () => {
|
|
173
|
-
const error = new Error("after");
|
|
174
|
-
const before = vi.fn();
|
|
175
|
-
const after = vi.fn().mockRejectedValue(error);
|
|
176
|
-
const runtime = dummyRuntime({
|
|
177
|
-
beforeRequestMiddleware: before,
|
|
178
|
-
afterRequestMiddleware: after,
|
|
179
|
-
});
|
|
180
|
-
const logSpy = vi
|
|
181
|
-
.spyOn(logger, "error")
|
|
182
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
183
|
-
|
|
184
|
-
const app = buildApp(runtime);
|
|
185
|
-
const response = await request(app).get("/info");
|
|
186
|
-
|
|
187
|
-
expect(response.status).toBe(200);
|
|
188
|
-
|
|
189
|
-
await vi.waitFor(() => {
|
|
190
|
-
expect(after).toHaveBeenCalledWith(
|
|
191
|
-
expect.objectContaining({
|
|
192
|
-
runtime,
|
|
193
|
-
response: expect.any(Response),
|
|
194
|
-
path: "/info",
|
|
195
|
-
}),
|
|
196
|
-
);
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
expect(logSpy).toHaveBeenCalledWith(
|
|
200
|
-
expect.objectContaining({
|
|
201
|
-
err: error,
|
|
202
|
-
url: expect.stringContaining("/info"),
|
|
203
|
-
path: "/info",
|
|
204
|
-
}),
|
|
205
|
-
"Error running after request middleware",
|
|
206
|
-
);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import express from "express";
|
|
2
|
-
import request from "supertest";
|
|
3
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
|
-
import type { AbstractAgent } from "@ag-ui/client";
|
|
5
|
-
|
|
6
|
-
import { createCopilotEndpointSingleRouteExpress } from "../express";
|
|
7
|
-
import { CopilotRuntime } from "../core/runtime";
|
|
8
|
-
import { logger } from "@copilotkit/shared";
|
|
9
|
-
|
|
10
|
-
const dummyRuntime = (opts: Partial<CopilotRuntime> = {}) => {
|
|
11
|
-
const runtime = new CopilotRuntime({
|
|
12
|
-
agents: { agent: {} as unknown as AbstractAgent },
|
|
13
|
-
...opts,
|
|
14
|
-
});
|
|
15
|
-
return runtime;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
describe("CopilotEndpointSingleRouteExpress middleware", () => {
|
|
19
|
-
afterEach(() => {
|
|
20
|
-
vi.restoreAllMocks();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const buildApp = (runtime: CopilotRuntime) => {
|
|
24
|
-
const app = express();
|
|
25
|
-
app.use(
|
|
26
|
-
createCopilotEndpointSingleRouteExpress({ runtime, basePath: "/rpc" }),
|
|
27
|
-
);
|
|
28
|
-
return app;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const rpcRequest = (app: express.Express, body: Record<string, unknown>) =>
|
|
32
|
-
request(app)
|
|
33
|
-
.post("/rpc")
|
|
34
|
-
.set("Content-Type", "application/json")
|
|
35
|
-
.send(body);
|
|
36
|
-
|
|
37
|
-
it("processes middleware and handler", async () => {
|
|
38
|
-
const before = vi.fn().mockResolvedValue(undefined);
|
|
39
|
-
const after = vi.fn().mockResolvedValue(undefined);
|
|
40
|
-
|
|
41
|
-
const runtime = dummyRuntime({
|
|
42
|
-
beforeRequestMiddleware: before,
|
|
43
|
-
afterRequestMiddleware: after,
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
const app = buildApp(runtime);
|
|
47
|
-
const response = await rpcRequest(app, { method: "info" });
|
|
48
|
-
|
|
49
|
-
expect(before).toHaveBeenCalledWith({
|
|
50
|
-
runtime,
|
|
51
|
-
request: expect.any(Request),
|
|
52
|
-
path: "/rpc",
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
await vi.waitFor(() => {
|
|
56
|
-
expect(after).toHaveBeenCalledWith(
|
|
57
|
-
expect.objectContaining({
|
|
58
|
-
runtime,
|
|
59
|
-
response: expect.any(Response),
|
|
60
|
-
path: "/rpc",
|
|
61
|
-
}),
|
|
62
|
-
);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
expect(response.status).toBe(200);
|
|
66
|
-
expect(response.body).toHaveProperty("version");
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it("handles Response error from before middleware", async () => {
|
|
70
|
-
const errorResponse = new Response("Error", { status: 400 });
|
|
71
|
-
const before = vi.fn().mockRejectedValue(errorResponse);
|
|
72
|
-
const after = vi.fn();
|
|
73
|
-
const runtime = dummyRuntime({
|
|
74
|
-
beforeRequestMiddleware: before,
|
|
75
|
-
afterRequestMiddleware: after,
|
|
76
|
-
});
|
|
77
|
-
const logSpy = vi
|
|
78
|
-
.spyOn(logger, "error")
|
|
79
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
80
|
-
|
|
81
|
-
const app = buildApp(runtime);
|
|
82
|
-
const response = await rpcRequest(app, { method: "info" });
|
|
83
|
-
|
|
84
|
-
expect(response.status).toBe(400);
|
|
85
|
-
expect(logSpy).toHaveBeenCalledWith(
|
|
86
|
-
expect.objectContaining({
|
|
87
|
-
err: errorResponse,
|
|
88
|
-
url: expect.stringContaining("/rpc"),
|
|
89
|
-
path: "/rpc",
|
|
90
|
-
}),
|
|
91
|
-
"Error running before request middleware",
|
|
92
|
-
);
|
|
93
|
-
expect(after).not.toHaveBeenCalled();
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it("logs thrown error from before middleware", async () => {
|
|
97
|
-
const error = new Error("before");
|
|
98
|
-
const before = vi.fn().mockRejectedValue(error);
|
|
99
|
-
const after = vi.fn();
|
|
100
|
-
const runtime = dummyRuntime({
|
|
101
|
-
beforeRequestMiddleware: before,
|
|
102
|
-
afterRequestMiddleware: after,
|
|
103
|
-
});
|
|
104
|
-
const logSpy = vi
|
|
105
|
-
.spyOn(logger, "error")
|
|
106
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
107
|
-
|
|
108
|
-
const app = buildApp(runtime);
|
|
109
|
-
const response = await rpcRequest(app, { method: "info" });
|
|
110
|
-
|
|
111
|
-
expect(response.status).toBe(500);
|
|
112
|
-
expect(logSpy).toHaveBeenCalledWith(
|
|
113
|
-
expect.objectContaining({
|
|
114
|
-
err: error,
|
|
115
|
-
url: expect.stringContaining("/rpc"),
|
|
116
|
-
path: "/rpc",
|
|
117
|
-
}),
|
|
118
|
-
"Error running before request middleware",
|
|
119
|
-
);
|
|
120
|
-
expect(after).not.toHaveBeenCalled();
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it("logs handler error", async () => {
|
|
124
|
-
const before = vi.fn();
|
|
125
|
-
const after = vi.fn();
|
|
126
|
-
const errorAgent = {
|
|
127
|
-
clone: () => {
|
|
128
|
-
throw new Error("Agent error");
|
|
129
|
-
},
|
|
130
|
-
} as unknown as AbstractAgent;
|
|
131
|
-
|
|
132
|
-
const runtime = dummyRuntime({
|
|
133
|
-
beforeRequestMiddleware: before,
|
|
134
|
-
afterRequestMiddleware: after,
|
|
135
|
-
agents: { agent: errorAgent },
|
|
136
|
-
});
|
|
137
|
-
const logSpy = vi
|
|
138
|
-
.spyOn(logger, "error")
|
|
139
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
140
|
-
|
|
141
|
-
const app = buildApp(runtime);
|
|
142
|
-
const response = await rpcRequest(app, {
|
|
143
|
-
method: "agent/run",
|
|
144
|
-
params: { agentId: "agent" },
|
|
145
|
-
body: {},
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
expect(response.status).toBe(500);
|
|
149
|
-
expect(logSpy).toHaveBeenCalled();
|
|
150
|
-
await vi.waitFor(() => {
|
|
151
|
-
expect(after).toHaveBeenCalled();
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it("passes parsed messages to afterRequestMiddleware", async () => {
|
|
156
|
-
let receivedParams: Record<string, unknown> = {};
|
|
157
|
-
const after = vi.fn().mockImplementation((params) => {
|
|
158
|
-
receivedParams = params;
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
const runtime = dummyRuntime({
|
|
162
|
-
afterRequestMiddleware: after,
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
const app = buildApp(runtime);
|
|
166
|
-
const response = await rpcRequest(app, { method: "info" });
|
|
167
|
-
|
|
168
|
-
await vi.waitFor(() => {
|
|
169
|
-
expect(after).toHaveBeenCalled();
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
expect(response.status).toBe(200);
|
|
173
|
-
expect(receivedParams).toHaveProperty("messages");
|
|
174
|
-
expect(receivedParams.messages).toEqual([]);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it("logs errors from after middleware", async () => {
|
|
178
|
-
const error = new Error("after");
|
|
179
|
-
const before = vi.fn();
|
|
180
|
-
const after = vi.fn().mockRejectedValue(error);
|
|
181
|
-
const runtime = dummyRuntime({
|
|
182
|
-
beforeRequestMiddleware: before,
|
|
183
|
-
afterRequestMiddleware: after,
|
|
184
|
-
});
|
|
185
|
-
const logSpy = vi
|
|
186
|
-
.spyOn(logger, "error")
|
|
187
|
-
.mockImplementation(() => undefined as unknown as void);
|
|
188
|
-
|
|
189
|
-
const app = buildApp(runtime);
|
|
190
|
-
const response = await rpcRequest(app, { method: "info" });
|
|
191
|
-
|
|
192
|
-
expect(response.status).toBe(200);
|
|
193
|
-
|
|
194
|
-
await vi.waitFor(() => {
|
|
195
|
-
expect(after).toHaveBeenCalledWith(
|
|
196
|
-
expect.objectContaining({
|
|
197
|
-
runtime,
|
|
198
|
-
response: expect.any(Response),
|
|
199
|
-
path: "/rpc",
|
|
200
|
-
}),
|
|
201
|
-
);
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
expect(logSpy).toHaveBeenCalledWith(
|
|
205
|
-
expect.objectContaining({
|
|
206
|
-
err: error,
|
|
207
|
-
url: expect.stringContaining("/rpc"),
|
|
208
|
-
path: "/rpc",
|
|
209
|
-
}),
|
|
210
|
-
"Error running after request middleware",
|
|
211
|
-
);
|
|
212
|
-
});
|
|
213
|
-
});
|