@copilotkit/runtime 1.57.2 → 1.57.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +52 -19
- package/dist/package.mjs +52 -19
- 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 +8 -18
- 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,301 +0,0 @@
|
|
|
1
|
-
import { handleTranscribe } from "../handlers/handle-transcribe";
|
|
2
|
-
import { CopilotRuntime } from "../core/runtime";
|
|
3
|
-
import {
|
|
4
|
-
TranscriptionService,
|
|
5
|
-
TranscribeFileOptions,
|
|
6
|
-
} from "../transcription-service/transcription-service";
|
|
7
|
-
import { describe, it, expect } from "vitest";
|
|
8
|
-
|
|
9
|
-
// Mock TranscriptionService
|
|
10
|
-
class MockTranscriptionService extends TranscriptionService {
|
|
11
|
-
public lastOptions?: TranscribeFileOptions;
|
|
12
|
-
|
|
13
|
-
constructor(
|
|
14
|
-
private shouldThrow = false,
|
|
15
|
-
private returnText = "Mock transcription",
|
|
16
|
-
) {
|
|
17
|
-
super();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async transcribeFile(options: TranscribeFileOptions): Promise<string> {
|
|
21
|
-
this.lastOptions = options;
|
|
22
|
-
if (this.shouldThrow) {
|
|
23
|
-
throw new Error("Transcription service error");
|
|
24
|
-
}
|
|
25
|
-
return this.returnText;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
describe("handleTranscribe", () => {
|
|
30
|
-
const createMockRuntime = (
|
|
31
|
-
transcriptionService?: TranscriptionService,
|
|
32
|
-
): CopilotRuntime => {
|
|
33
|
-
return {
|
|
34
|
-
agents: Promise.resolve({}),
|
|
35
|
-
transcriptionService,
|
|
36
|
-
beforeRequestMiddleware: undefined,
|
|
37
|
-
afterRequestMiddleware: undefined,
|
|
38
|
-
} as CopilotRuntime;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const createMockAudioFile = (
|
|
42
|
-
name = "test.mp3",
|
|
43
|
-
type = "audio/mpeg",
|
|
44
|
-
size = 1024,
|
|
45
|
-
): File => {
|
|
46
|
-
const content = new Uint8Array(size);
|
|
47
|
-
return new File([content], name, { type });
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const createFormDataRequest = (audioFile?: File): Request => {
|
|
51
|
-
const formData = new FormData();
|
|
52
|
-
if (audioFile) {
|
|
53
|
-
formData.append("audio", audioFile);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return new Request("https://example.com/transcribe", {
|
|
57
|
-
method: "POST",
|
|
58
|
-
body: formData,
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const createJsonRequest = (): Request => {
|
|
63
|
-
return new Request("https://example.com/transcribe", {
|
|
64
|
-
method: "POST",
|
|
65
|
-
headers: { "Content-Type": "application/json" },
|
|
66
|
-
body: JSON.stringify({ test: "data" }),
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
it("should successfully transcribe an audio file", async () => {
|
|
71
|
-
const mockService = new MockTranscriptionService(false, "Hello world");
|
|
72
|
-
const runtime = createMockRuntime(mockService);
|
|
73
|
-
const audioFile = createMockAudioFile("test.mp3", "audio/mpeg", 2048);
|
|
74
|
-
const request = createFormDataRequest(audioFile);
|
|
75
|
-
|
|
76
|
-
const response = await handleTranscribe({ runtime, request });
|
|
77
|
-
|
|
78
|
-
expect(response.status).toBe(200);
|
|
79
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
80
|
-
|
|
81
|
-
const body = await response.json();
|
|
82
|
-
expect(body).toEqual({
|
|
83
|
-
text: "Hello world",
|
|
84
|
-
size: 2048,
|
|
85
|
-
type: "audio/mpeg",
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it("should return 503 when transcription service is not configured", async () => {
|
|
90
|
-
const runtime = createMockRuntime(); // No transcription service
|
|
91
|
-
const audioFile = createMockAudioFile();
|
|
92
|
-
const request = createFormDataRequest(audioFile);
|
|
93
|
-
|
|
94
|
-
const response = await handleTranscribe({ runtime, request });
|
|
95
|
-
|
|
96
|
-
expect(response.status).toBe(503);
|
|
97
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
98
|
-
|
|
99
|
-
const body = await response.json();
|
|
100
|
-
expect(body).toEqual({
|
|
101
|
-
error: "service_not_configured",
|
|
102
|
-
message: "Transcription service is not configured",
|
|
103
|
-
retryable: false,
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it("should return 400 when request is not form data", async () => {
|
|
108
|
-
const mockService = new MockTranscriptionService();
|
|
109
|
-
const runtime = createMockRuntime(mockService);
|
|
110
|
-
const request = createJsonRequest();
|
|
111
|
-
|
|
112
|
-
const response = await handleTranscribe({ runtime, request });
|
|
113
|
-
|
|
114
|
-
expect(response.status).toBe(400);
|
|
115
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
116
|
-
|
|
117
|
-
const body = await response.json();
|
|
118
|
-
expect(body).toEqual({
|
|
119
|
-
error: "invalid_request",
|
|
120
|
-
message:
|
|
121
|
-
"Request must include 'audio' field with base64-encoded audio data",
|
|
122
|
-
retryable: false,
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it("should return 400 when no audio file is provided", async () => {
|
|
127
|
-
const mockService = new MockTranscriptionService();
|
|
128
|
-
const runtime = createMockRuntime(mockService);
|
|
129
|
-
const request = createFormDataRequest(); // No audio file
|
|
130
|
-
|
|
131
|
-
const response = await handleTranscribe({ runtime, request });
|
|
132
|
-
|
|
133
|
-
expect(response.status).toBe(400);
|
|
134
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
135
|
-
|
|
136
|
-
const body = await response.json();
|
|
137
|
-
expect(body).toEqual({
|
|
138
|
-
error: "invalid_request",
|
|
139
|
-
message:
|
|
140
|
-
"No audio file found in form data. Please include an 'audio' field.",
|
|
141
|
-
retryable: false,
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it("should accept various valid audio file types", async () => {
|
|
146
|
-
const mockService = new MockTranscriptionService();
|
|
147
|
-
const runtime = createMockRuntime(mockService);
|
|
148
|
-
|
|
149
|
-
const validTypes = [
|
|
150
|
-
"audio/mpeg",
|
|
151
|
-
"audio/mp3",
|
|
152
|
-
"audio/mp4",
|
|
153
|
-
"audio/wav",
|
|
154
|
-
"audio/webm",
|
|
155
|
-
"audio/ogg",
|
|
156
|
-
"audio/flac",
|
|
157
|
-
"audio/aac",
|
|
158
|
-
];
|
|
159
|
-
|
|
160
|
-
for (const type of validTypes) {
|
|
161
|
-
const audioFile = createMockAudioFile(`test.${type.split("/")[1]}`, type);
|
|
162
|
-
const request = createFormDataRequest(audioFile);
|
|
163
|
-
|
|
164
|
-
const response = await handleTranscribe({ runtime, request });
|
|
165
|
-
expect(response.status).toBe(200);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it("should accept files with empty type (some browsers/systems)", async () => {
|
|
170
|
-
const mockService = new MockTranscriptionService();
|
|
171
|
-
const runtime = createMockRuntime(mockService);
|
|
172
|
-
const audioFile = createMockAudioFile("test.mp3", ""); // Empty type
|
|
173
|
-
const request = createFormDataRequest(audioFile);
|
|
174
|
-
|
|
175
|
-
const response = await handleTranscribe({ runtime, request });
|
|
176
|
-
|
|
177
|
-
expect(response.status).toBe(200);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it("should accept files with application/octet-stream type (fallback)", async () => {
|
|
181
|
-
const mockService = new MockTranscriptionService();
|
|
182
|
-
const runtime = createMockRuntime(mockService);
|
|
183
|
-
const audioFile = createMockAudioFile(
|
|
184
|
-
"test.mp3",
|
|
185
|
-
"application/octet-stream",
|
|
186
|
-
);
|
|
187
|
-
const request = createFormDataRequest(audioFile);
|
|
188
|
-
|
|
189
|
-
const response = await handleTranscribe({ runtime, request });
|
|
190
|
-
|
|
191
|
-
expect(response.status).toBe(200);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it("should return 400 for invalid file types", async () => {
|
|
195
|
-
const mockService = new MockTranscriptionService();
|
|
196
|
-
const runtime = createMockRuntime(mockService);
|
|
197
|
-
const audioFile = createMockAudioFile("test.txt", "text/plain");
|
|
198
|
-
const request = createFormDataRequest(audioFile);
|
|
199
|
-
|
|
200
|
-
const response = await handleTranscribe({ runtime, request });
|
|
201
|
-
|
|
202
|
-
expect(response.status).toBe(400);
|
|
203
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
204
|
-
|
|
205
|
-
const body = await response.json();
|
|
206
|
-
expect(body.error).toBe("invalid_audio_format");
|
|
207
|
-
expect(body.message).toContain("Unsupported audio format: text/plain");
|
|
208
|
-
expect(body.retryable).toBe(false);
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it("should return 500 when transcription service throws an error", async () => {
|
|
212
|
-
const mockService = new MockTranscriptionService(true); // Will throw error
|
|
213
|
-
const runtime = createMockRuntime(mockService);
|
|
214
|
-
const audioFile = createMockAudioFile();
|
|
215
|
-
const request = createFormDataRequest(audioFile);
|
|
216
|
-
|
|
217
|
-
const response = await handleTranscribe({ runtime, request });
|
|
218
|
-
|
|
219
|
-
expect(response.status).toBe(500);
|
|
220
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
221
|
-
|
|
222
|
-
const body = await response.json();
|
|
223
|
-
expect(body).toEqual({
|
|
224
|
-
error: "provider_error",
|
|
225
|
-
message: "Transcription service error",
|
|
226
|
-
retryable: true,
|
|
227
|
-
});
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it("should handle form data parsing errors gracefully", async () => {
|
|
231
|
-
const mockService = new MockTranscriptionService();
|
|
232
|
-
const runtime = createMockRuntime(mockService);
|
|
233
|
-
|
|
234
|
-
// Create a request with malformed form data
|
|
235
|
-
const request = new Request("https://example.com/transcribe", {
|
|
236
|
-
method: "POST",
|
|
237
|
-
headers: { "Content-Type": "multipart/form-data; boundary=invalid" },
|
|
238
|
-
body: "invalid form data",
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
const response = await handleTranscribe({ runtime, request });
|
|
242
|
-
|
|
243
|
-
expect(response.status).toBe(500);
|
|
244
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
245
|
-
|
|
246
|
-
const body = await response.json();
|
|
247
|
-
expect(body.error).toBe("provider_error");
|
|
248
|
-
expect(body.retryable).toBe(true);
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
it("should handle non-File objects in form data", async () => {
|
|
252
|
-
const mockService = new MockTranscriptionService();
|
|
253
|
-
const runtime = createMockRuntime(mockService);
|
|
254
|
-
|
|
255
|
-
const formData = new FormData();
|
|
256
|
-
formData.append("audio", "not a file"); // String instead of File
|
|
257
|
-
|
|
258
|
-
const request = new Request("https://example.com/transcribe", {
|
|
259
|
-
method: "POST",
|
|
260
|
-
body: formData,
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
const response = await handleTranscribe({ runtime, request });
|
|
264
|
-
|
|
265
|
-
expect(response.status).toBe(400);
|
|
266
|
-
expect(response.headers.get("Content-Type")).toBe("application/json");
|
|
267
|
-
|
|
268
|
-
const body = await response.json();
|
|
269
|
-
expect(body).toEqual({
|
|
270
|
-
error: "invalid_request",
|
|
271
|
-
message:
|
|
272
|
-
"No audio file found in form data. Please include an 'audio' field.",
|
|
273
|
-
retryable: false,
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
it("should pass file metadata to transcription service", async () => {
|
|
278
|
-
const mockService = new MockTranscriptionService();
|
|
279
|
-
const runtime = createMockRuntime(mockService);
|
|
280
|
-
const audioFile = createMockAudioFile(
|
|
281
|
-
"my-recording.wav",
|
|
282
|
-
"audio/wav",
|
|
283
|
-
2048,
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
const request = createFormDataRequest(audioFile);
|
|
287
|
-
|
|
288
|
-
const response = await handleTranscribe({ runtime, request });
|
|
289
|
-
|
|
290
|
-
expect(response.status).toBe(200);
|
|
291
|
-
expect(mockService.lastOptions).toEqual({
|
|
292
|
-
audioFile: expect.objectContaining({
|
|
293
|
-
name: "my-recording.wav",
|
|
294
|
-
type: "audio/wav",
|
|
295
|
-
size: 2048,
|
|
296
|
-
}),
|
|
297
|
-
mimeType: "audio/wav",
|
|
298
|
-
size: 2048,
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
});
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
shouldForwardHeader,
|
|
4
|
-
extractForwardableHeaders,
|
|
5
|
-
} from "../handlers/header-utils";
|
|
6
|
-
|
|
7
|
-
describe("header-utils", () => {
|
|
8
|
-
describe("shouldForwardHeader", () => {
|
|
9
|
-
it("forwards authorization header (case-insensitive)", () => {
|
|
10
|
-
expect(shouldForwardHeader("authorization")).toBe(true);
|
|
11
|
-
expect(shouldForwardHeader("Authorization")).toBe(true);
|
|
12
|
-
expect(shouldForwardHeader("AUTHORIZATION")).toBe(true);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
it("forwards x-* custom headers", () => {
|
|
16
|
-
expect(shouldForwardHeader("x-custom")).toBe(true);
|
|
17
|
-
expect(shouldForwardHeader("X-Custom")).toBe(true);
|
|
18
|
-
expect(shouldForwardHeader("x-request-id")).toBe(true);
|
|
19
|
-
expect(shouldForwardHeader("X-Forwarded-For")).toBe(true);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("blocks standard headers", () => {
|
|
23
|
-
expect(shouldForwardHeader("content-type")).toBe(false);
|
|
24
|
-
expect(shouldForwardHeader("Content-Type")).toBe(false);
|
|
25
|
-
expect(shouldForwardHeader("origin")).toBe(false);
|
|
26
|
-
expect(shouldForwardHeader("user-agent")).toBe(false);
|
|
27
|
-
expect(shouldForwardHeader("accept")).toBe(false);
|
|
28
|
-
expect(shouldForwardHeader("cookie")).toBe(false);
|
|
29
|
-
expect(shouldForwardHeader("host")).toBe(false);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe("extractForwardableHeaders", () => {
|
|
34
|
-
it("extracts only forwardable headers from request", () => {
|
|
35
|
-
const request = new Request("https://example.com", {
|
|
36
|
-
method: "POST",
|
|
37
|
-
headers: {
|
|
38
|
-
"Content-Type": "application/json",
|
|
39
|
-
"X-Custom": "custom-value",
|
|
40
|
-
"X-Request-ID": "req-123",
|
|
41
|
-
Authorization: "Bearer token",
|
|
42
|
-
Origin: "http://localhost",
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
const result = extractForwardableHeaders(request);
|
|
47
|
-
|
|
48
|
-
expect(result).toEqual({
|
|
49
|
-
"x-custom": "custom-value",
|
|
50
|
-
"x-request-id": "req-123",
|
|
51
|
-
authorization: "Bearer token",
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("returns empty object when no forwardable headers present", () => {
|
|
56
|
-
const request = new Request("https://example.com", {
|
|
57
|
-
method: "POST",
|
|
58
|
-
headers: {
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
Origin: "http://localhost",
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
const result = extractForwardableHeaders(request);
|
|
65
|
-
|
|
66
|
-
expect(result).toEqual({});
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it("preserves header values exactly", () => {
|
|
70
|
-
const request = new Request("https://example.com", {
|
|
71
|
-
method: "POST",
|
|
72
|
-
headers: {
|
|
73
|
-
Authorization: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
|
|
74
|
-
"X-Complex-Value": "value with spaces and special=chars&more",
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
const result = extractForwardableHeaders(request);
|
|
79
|
-
|
|
80
|
-
expect(result.authorization).toBe(
|
|
81
|
-
"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
|
|
82
|
-
);
|
|
83
|
-
expect(result["x-complex-value"]).toBe(
|
|
84
|
-
"value with spaces and special=chars&more",
|
|
85
|
-
);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
});
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
2
|
-
import type { AbstractAgent } from "@ag-ui/client";
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
createCopilotEndpoint,
|
|
6
|
-
createCopilotEndpointSingleRoute,
|
|
7
|
-
} from "../endpoints";
|
|
8
|
-
import { CopilotRuntime } from "../core/runtime";
|
|
9
|
-
|
|
10
|
-
describe("Hono adapter with hooks", () => {
|
|
11
|
-
const createMockAgent = () => {
|
|
12
|
-
const agent: unknown = {
|
|
13
|
-
execute: async () => ({ events: [] }),
|
|
14
|
-
};
|
|
15
|
-
(agent as { clone: () => unknown }).clone = () => createMockAgent();
|
|
16
|
-
return agent as AbstractAgent;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const createMockRuntime = (opts?: Partial<CopilotRuntime>) =>
|
|
20
|
-
new CopilotRuntime({
|
|
21
|
-
agents: {
|
|
22
|
-
default: createMockAgent(),
|
|
23
|
-
myAgent: createMockAgent(),
|
|
24
|
-
testAgent: createMockAgent(),
|
|
25
|
-
},
|
|
26
|
-
...opts,
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe("createCopilotEndpoint", () => {
|
|
30
|
-
const createEndpoint = (
|
|
31
|
-
hooks?: Parameters<typeof createCopilotEndpoint>[0]["hooks"],
|
|
32
|
-
runtimeOpts?: Partial<CopilotRuntime>,
|
|
33
|
-
) => {
|
|
34
|
-
const runtime = createMockRuntime(runtimeOpts);
|
|
35
|
-
const endpoint = createCopilotEndpoint({
|
|
36
|
-
runtime,
|
|
37
|
-
basePath: "/",
|
|
38
|
-
hooks,
|
|
39
|
-
});
|
|
40
|
-
return { endpoint, runtime };
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
it("routes GET /info correctly", async () => {
|
|
44
|
-
const { endpoint } = createEndpoint();
|
|
45
|
-
const response = await endpoint.fetch(
|
|
46
|
-
new Request("https://example.com/info"),
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
expect(response.status).toBe(200);
|
|
50
|
-
const body = await response.json();
|
|
51
|
-
expect(body).toHaveProperty("version");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("routes POST /agent/:id/run correctly", async () => {
|
|
55
|
-
const { endpoint } = createEndpoint();
|
|
56
|
-
const response = await endpoint.fetch(
|
|
57
|
-
new Request("https://example.com/agent/myAgent/run", {
|
|
58
|
-
method: "POST",
|
|
59
|
-
headers: { "Content-Type": "application/json" },
|
|
60
|
-
body: JSON.stringify({
|
|
61
|
-
messages: [],
|
|
62
|
-
state: {},
|
|
63
|
-
threadId: "thread-1",
|
|
64
|
-
}),
|
|
65
|
-
}),
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
expect(response.status).not.toBe(404);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("forwards hooks — onRequest hook is called", async () => {
|
|
72
|
-
const onRequest = vi.fn();
|
|
73
|
-
const { endpoint, runtime } = createEndpoint({ onRequest });
|
|
74
|
-
|
|
75
|
-
await endpoint.fetch(new Request("https://example.com/info"));
|
|
76
|
-
|
|
77
|
-
expect(onRequest).toHaveBeenCalledTimes(1);
|
|
78
|
-
expect(onRequest).toHaveBeenCalledWith(
|
|
79
|
-
expect.objectContaining({
|
|
80
|
-
request: expect.any(Request),
|
|
81
|
-
path: expect.stringContaining("/info"),
|
|
82
|
-
runtime,
|
|
83
|
-
}),
|
|
84
|
-
);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it("hooks can modify response headers via onResponse", async () => {
|
|
88
|
-
const { endpoint } = createEndpoint({
|
|
89
|
-
onResponse: ({ response }) => {
|
|
90
|
-
const headers = new Headers(response.headers);
|
|
91
|
-
headers.set("x-custom-header", "hello-from-hook");
|
|
92
|
-
return new Response(response.body, {
|
|
93
|
-
status: response.status,
|
|
94
|
-
headers,
|
|
95
|
-
});
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
const response = await endpoint.fetch(
|
|
100
|
-
new Request("https://example.com/info"),
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
expect(response.status).toBe(200);
|
|
104
|
-
expect(response.headers.get("x-custom-header")).toBe("hello-from-hook");
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it("Hono CORS headers are present", async () => {
|
|
108
|
-
const { endpoint } = createEndpoint();
|
|
109
|
-
const response = await endpoint.fetch(
|
|
110
|
-
new Request("https://example.com/info", {
|
|
111
|
-
method: "OPTIONS",
|
|
112
|
-
headers: {
|
|
113
|
-
Origin: "https://somesite.com",
|
|
114
|
-
"Access-Control-Request-Method": "GET",
|
|
115
|
-
},
|
|
116
|
-
}),
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
expect(response.headers.get("Access-Control-Allow-Origin")).toBe("*");
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
describe("createCopilotEndpointSingleRoute", () => {
|
|
124
|
-
it("dispatches single-route with method envelope", async () => {
|
|
125
|
-
const runtime = createMockRuntime();
|
|
126
|
-
const endpoint = createCopilotEndpointSingleRoute({
|
|
127
|
-
runtime,
|
|
128
|
-
basePath: "/rpc",
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
const response = await endpoint.fetch(
|
|
132
|
-
new Request("https://example.com/rpc", {
|
|
133
|
-
method: "POST",
|
|
134
|
-
headers: { "Content-Type": "application/json" },
|
|
135
|
-
body: JSON.stringify({
|
|
136
|
-
method: "agent/run",
|
|
137
|
-
params: { agentId: "myAgent" },
|
|
138
|
-
body: {
|
|
139
|
-
messages: [],
|
|
140
|
-
state: {},
|
|
141
|
-
threadId: "thread-1",
|
|
142
|
-
},
|
|
143
|
-
}),
|
|
144
|
-
}),
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
expect(response.status).not.toBe(404);
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
});
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration test: Hono single-route adapter (deprecated path) + telemetry.
|
|
3
|
-
*
|
|
4
|
-
* `createCopilotEndpointSingleRoute` is the legacy direct single-route entry
|
|
5
|
-
* point, superseded by `createCopilotHonoHandler({ mode: "single-route" })`
|
|
6
|
-
* but still exported.
|
|
7
|
-
*/
|
|
8
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
9
|
-
import type { AbstractAgent } from "@ag-ui/client";
|
|
10
|
-
|
|
11
|
-
import { telemetry } from "../telemetry";
|
|
12
|
-
import { createCopilotEndpointSingleRoute } from "../endpoints/hono-single";
|
|
13
|
-
import { CopilotRuntime } from "../core/runtime";
|
|
14
|
-
|
|
15
|
-
function makeAgent(): AbstractAgent {
|
|
16
|
-
const a: unknown = { execute: async () => ({ events: [] }) };
|
|
17
|
-
(a as { clone: () => unknown }).clone = () => makeAgent();
|
|
18
|
-
return a as AbstractAgent;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
describe("Hono single-route adapter — telemetry firing (integration)", () => {
|
|
22
|
-
let captureSpy: ReturnType<typeof vi.spyOn>;
|
|
23
|
-
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
captureSpy = vi.spyOn(telemetry, "capture").mockResolvedValue(undefined);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
afterEach(() => {
|
|
29
|
-
captureSpy.mockRestore();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("fires instance_created on handler creation", async () => {
|
|
33
|
-
const runtime = new CopilotRuntime({ agents: { default: makeAgent() } });
|
|
34
|
-
createCopilotEndpointSingleRoute({ runtime, basePath: "/api/copilotkit" });
|
|
35
|
-
|
|
36
|
-
await vi.waitFor(() => {
|
|
37
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
38
|
-
"oss.runtime.instance_created",
|
|
39
|
-
expect.objectContaining({
|
|
40
|
-
agentsAmount: 1,
|
|
41
|
-
"cloud.api_key_provided": false,
|
|
42
|
-
}),
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
});
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration test: Hono adapter + telemetry.
|
|
3
|
-
*
|
|
4
|
-
* Asserts both ends of the path-to-production chain that the v2 refactor
|
|
5
|
-
* previously broke (2ac4a40b5, 2026-03-29):
|
|
6
|
-
* 1. `oss.runtime.instance_created` fires once per handler factory.
|
|
7
|
-
* 2. `oss.runtime.copilot_request_created` fires when a real HTTP request
|
|
8
|
-
* flows through the handler.
|
|
9
|
-
*
|
|
10
|
-
* If either regresses, this test fails.
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
13
|
-
import type { AbstractAgent } from "@ag-ui/client";
|
|
14
|
-
|
|
15
|
-
import { telemetry } from "../telemetry";
|
|
16
|
-
import { createCopilotHonoHandler } from "../endpoints/hono";
|
|
17
|
-
import { CopilotRuntime } from "../core/runtime";
|
|
18
|
-
|
|
19
|
-
function makeAgent(): AbstractAgent {
|
|
20
|
-
const a: unknown = {
|
|
21
|
-
execute: async () => ({ events: [] }),
|
|
22
|
-
};
|
|
23
|
-
(a as { clone: () => unknown }).clone = () => makeAgent();
|
|
24
|
-
return a as AbstractAgent;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
describe("Hono adapter — telemetry firing (integration)", () => {
|
|
28
|
-
let captureSpy: ReturnType<typeof vi.spyOn>;
|
|
29
|
-
|
|
30
|
-
beforeEach(() => {
|
|
31
|
-
captureSpy = vi.spyOn(telemetry, "capture").mockResolvedValue(undefined);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
afterEach(() => {
|
|
35
|
-
captureSpy.mockRestore();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("fires instance_created on handler creation (multi-route)", async () => {
|
|
39
|
-
const runtime = new CopilotRuntime({ agents: { default: makeAgent() } });
|
|
40
|
-
createCopilotHonoHandler({ runtime, basePath: "/" });
|
|
41
|
-
|
|
42
|
-
await vi.waitFor(() => {
|
|
43
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
44
|
-
"oss.runtime.instance_created",
|
|
45
|
-
expect.objectContaining({
|
|
46
|
-
agentsAmount: 1,
|
|
47
|
-
actionsAmount: 0,
|
|
48
|
-
endpointsAmount: 0,
|
|
49
|
-
"cloud.api_key_provided": false,
|
|
50
|
-
}),
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("fires copilot_request_created when a real HTTP request hits the handler", async () => {
|
|
56
|
-
const runtime = new CopilotRuntime({ agents: { default: makeAgent() } });
|
|
57
|
-
const endpoint = createCopilotHonoHandler({ runtime, basePath: "/" });
|
|
58
|
-
|
|
59
|
-
await endpoint.fetch(
|
|
60
|
-
new Request("https://example.com/agent/default/run", {
|
|
61
|
-
method: "POST",
|
|
62
|
-
headers: { "Content-Type": "application/json" },
|
|
63
|
-
body: JSON.stringify({ messages: [], state: {}, threadId: "t1" }),
|
|
64
|
-
}),
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
68
|
-
"oss.runtime.copilot_request_created",
|
|
69
|
-
expect.objectContaining({
|
|
70
|
-
requestType: "run",
|
|
71
|
-
"cloud.api_key_provided": false,
|
|
72
|
-
}),
|
|
73
|
-
);
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
it("includes cloud.public_api_key on request when header is present", async () => {
|
|
77
|
-
const runtime = new CopilotRuntime({ agents: { default: makeAgent() } });
|
|
78
|
-
const endpoint = createCopilotHonoHandler({ runtime, basePath: "/" });
|
|
79
|
-
|
|
80
|
-
await endpoint.fetch(
|
|
81
|
-
new Request("https://example.com/agent/default/run", {
|
|
82
|
-
method: "POST",
|
|
83
|
-
headers: {
|
|
84
|
-
"Content-Type": "application/json",
|
|
85
|
-
"x-copilotcloud-public-api-key": "ck_pub_test_123",
|
|
86
|
-
},
|
|
87
|
-
body: JSON.stringify({ messages: [], state: {}, threadId: "t1" }),
|
|
88
|
-
}),
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
expect(captureSpy).toHaveBeenCalledWith(
|
|
92
|
-
"oss.runtime.copilot_request_created",
|
|
93
|
-
expect.objectContaining({
|
|
94
|
-
"cloud.api_key_provided": true,
|
|
95
|
-
"cloud.public_api_key": "ck_pub_test_123",
|
|
96
|
-
}),
|
|
97
|
-
);
|
|
98
|
-
});
|
|
99
|
-
});
|