@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,203 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lightweight URL router for framework-agnostic CopilotKit runtime handler.
|
|
3
|
-
*
|
|
4
|
-
* Two strategies:
|
|
5
|
-
* - With `basePath`: strict prefix strip → match remainder
|
|
6
|
-
* - Without `basePath`: suffix matching on known patterns
|
|
7
|
-
*
|
|
8
|
-
* Single-route mode: delegates to `parseMethodCall` for JSON envelope dispatch.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type { RouteInfo } from "./hooks";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Match a request URL against known CopilotKit route patterns.
|
|
15
|
-
*
|
|
16
|
-
* @param pathname - The URL pathname to match
|
|
17
|
-
* @param basePath - Optional base path prefix to strip first
|
|
18
|
-
* @returns RouteInfo if matched, null otherwise
|
|
19
|
-
*/
|
|
20
|
-
export function matchRoute(
|
|
21
|
-
pathname: string,
|
|
22
|
-
basePath?: string,
|
|
23
|
-
): RouteInfo | null {
|
|
24
|
-
let remainder: string;
|
|
25
|
-
|
|
26
|
-
if (basePath) {
|
|
27
|
-
// Normalize: ensure basePath doesn't end with /
|
|
28
|
-
const normalizedBase =
|
|
29
|
-
basePath.length > 1 && basePath.endsWith("/")
|
|
30
|
-
? basePath.slice(0, -1)
|
|
31
|
-
: basePath;
|
|
32
|
-
|
|
33
|
-
// Special case: basePath === "/" matches everything
|
|
34
|
-
if (normalizedBase === "/") {
|
|
35
|
-
remainder = pathname;
|
|
36
|
-
} else {
|
|
37
|
-
if (!pathname.startsWith(normalizedBase)) return null;
|
|
38
|
-
|
|
39
|
-
// The character after basePath must be "/" or end of string
|
|
40
|
-
const afterBase = pathname.slice(normalizedBase.length);
|
|
41
|
-
if (afterBase.length > 0 && !afterBase.startsWith("/")) return null;
|
|
42
|
-
|
|
43
|
-
remainder = afterBase || "/";
|
|
44
|
-
}
|
|
45
|
-
} else {
|
|
46
|
-
// Suffix matching: find known patterns at the end of the pathname
|
|
47
|
-
remainder = pathname;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return matchSegments(remainder);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function safeDecodeURIComponent(value: string): string | null {
|
|
54
|
-
try {
|
|
55
|
-
return decodeURIComponent(value);
|
|
56
|
-
} catch {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function matchSegments(path: string): RouteInfo | null {
|
|
62
|
-
const segments = path.split("/").filter(Boolean);
|
|
63
|
-
const len = segments.length;
|
|
64
|
-
|
|
65
|
-
// Try suffix matching — scan from the end for known patterns
|
|
66
|
-
|
|
67
|
-
// /info (1 segment)
|
|
68
|
-
if (len >= 1 && segments[len - 1] === "info") {
|
|
69
|
-
return { method: "info" };
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// /transcribe (1 segment)
|
|
73
|
-
if (len >= 1 && segments[len - 1] === "transcribe") {
|
|
74
|
-
return { method: "transcribe" };
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// /cpk-debug-events (1 segment)
|
|
78
|
-
// Reserved route name: the `cpk-` prefix makes collision with a
|
|
79
|
-
// user-named agent essentially impossible (the router only treats
|
|
80
|
-
// `agent/:agentId/...` patterns as agent lookups, so a bare
|
|
81
|
-
// `cpk-debug-events` segment would never fall through to one —
|
|
82
|
-
// the prefix is the real guard, not this branch's position).
|
|
83
|
-
// Handler returns 404 in production.
|
|
84
|
-
if (len >= 1 && segments[len - 1] === "cpk-debug-events") {
|
|
85
|
-
return { method: "cpk-debug-events" };
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// /agent/:agentId/run (3 segments)
|
|
89
|
-
if (
|
|
90
|
-
len >= 3 &&
|
|
91
|
-
segments[len - 3] === "agent" &&
|
|
92
|
-
segments[len - 1] === "run"
|
|
93
|
-
) {
|
|
94
|
-
const agentId = safeDecodeURIComponent(segments[len - 2]!);
|
|
95
|
-
if (!agentId) return null;
|
|
96
|
-
return { method: "agent/run", agentId };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// /agent/:agentId/connect (3 segments)
|
|
100
|
-
if (
|
|
101
|
-
len >= 3 &&
|
|
102
|
-
segments[len - 3] === "agent" &&
|
|
103
|
-
segments[len - 1] === "connect"
|
|
104
|
-
) {
|
|
105
|
-
const agentId = safeDecodeURIComponent(segments[len - 2]!);
|
|
106
|
-
if (!agentId) return null;
|
|
107
|
-
return { method: "agent/connect", agentId };
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// /agent/:agentId/stop/:threadId (4 segments)
|
|
111
|
-
if (
|
|
112
|
-
len >= 4 &&
|
|
113
|
-
segments[len - 4] === "agent" &&
|
|
114
|
-
segments[len - 2] === "stop"
|
|
115
|
-
) {
|
|
116
|
-
const agentId = safeDecodeURIComponent(segments[len - 3]!);
|
|
117
|
-
const threadId = safeDecodeURIComponent(segments[len - 1]!);
|
|
118
|
-
if (!agentId || !threadId) return null;
|
|
119
|
-
return { method: "agent/stop", agentId, threadId };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// /threads/subscribe (2 segments)
|
|
123
|
-
if (
|
|
124
|
-
len >= 2 &&
|
|
125
|
-
segments[len - 2] === "threads" &&
|
|
126
|
-
segments[len - 1] === "subscribe"
|
|
127
|
-
) {
|
|
128
|
-
return { method: "threads/subscribe" };
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// /threads/:threadId/messages (3 segments)
|
|
132
|
-
if (
|
|
133
|
-
len >= 3 &&
|
|
134
|
-
segments[len - 3] === "threads" &&
|
|
135
|
-
segments[len - 1] === "messages"
|
|
136
|
-
) {
|
|
137
|
-
const threadId = safeDecodeURIComponent(segments[len - 2]!);
|
|
138
|
-
if (!threadId) return null;
|
|
139
|
-
return { method: "threads/messages", threadId };
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// /threads/:threadId/events (3 segments)
|
|
143
|
-
if (
|
|
144
|
-
len >= 3 &&
|
|
145
|
-
segments[len - 3] === "threads" &&
|
|
146
|
-
segments[len - 1] === "events"
|
|
147
|
-
) {
|
|
148
|
-
const threadId = safeDecodeURIComponent(segments[len - 2]!);
|
|
149
|
-
if (!threadId) return null;
|
|
150
|
-
return { method: "threads/events", threadId };
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// /threads/:threadId/state (3 segments)
|
|
154
|
-
if (
|
|
155
|
-
len >= 3 &&
|
|
156
|
-
segments[len - 3] === "threads" &&
|
|
157
|
-
segments[len - 1] === "state"
|
|
158
|
-
) {
|
|
159
|
-
const threadId = safeDecodeURIComponent(segments[len - 2]!);
|
|
160
|
-
if (!threadId) return null;
|
|
161
|
-
return { method: "threads/state", threadId };
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// /threads/:threadId/archive (3 segments)
|
|
165
|
-
if (
|
|
166
|
-
len >= 3 &&
|
|
167
|
-
segments[len - 3] === "threads" &&
|
|
168
|
-
segments[len - 1] === "archive"
|
|
169
|
-
) {
|
|
170
|
-
const threadId = safeDecodeURIComponent(segments[len - 2]!);
|
|
171
|
-
if (!threadId) return null;
|
|
172
|
-
return { method: "threads/archive", threadId };
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// /threads/clear (2 segments) — wipe in-memory thread history
|
|
176
|
-
if (
|
|
177
|
-
len >= 2 &&
|
|
178
|
-
segments[len - 2] === "threads" &&
|
|
179
|
-
segments[len - 1] === "clear"
|
|
180
|
-
) {
|
|
181
|
-
return { method: "threads/clear" };
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// /threads/:threadId (2 segments) — update or delete
|
|
185
|
-
if (
|
|
186
|
-
len >= 2 &&
|
|
187
|
-
segments[len - 2] === "threads" &&
|
|
188
|
-
segments[len - 1] !== "subscribe" &&
|
|
189
|
-
segments[len - 1] !== "clear"
|
|
190
|
-
) {
|
|
191
|
-
const threadId = safeDecodeURIComponent(segments[len - 1]!);
|
|
192
|
-
if (!threadId) return null;
|
|
193
|
-
// Disambiguated by HTTP method in the handler
|
|
194
|
-
return { method: "threads/update", threadId };
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// /threads (1 segment) — list
|
|
198
|
-
if (len >= 1 && segments[len - 1] === "threads") {
|
|
199
|
-
return { method: "threads/list" };
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
return null;
|
|
203
|
-
}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lifecycle hooks for CopilotKit runtime request processing.
|
|
3
|
-
*
|
|
4
|
-
* Hooks let you intercept requests at various stages of the pipeline:
|
|
5
|
-
* - `onRequest`: Before routing — auth, correlation IDs, header injection
|
|
6
|
-
* - `onBeforeHandler`: After routing — route-specific authorization
|
|
7
|
-
* - `onResponse`: After handler — add headers, log, set cookies
|
|
8
|
-
* - `onError`: On error — custom error responses
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const handler = createCopilotRuntimeHandler({
|
|
13
|
-
* runtime,
|
|
14
|
-
* hooks: {
|
|
15
|
-
* onRequest: async ({ request }) => {
|
|
16
|
-
* const token = request.headers.get("authorization");
|
|
17
|
-
* if (!token) throw new Response("Unauthorized", { status: 401 });
|
|
18
|
-
* },
|
|
19
|
-
* onResponse: async ({ response }) => {
|
|
20
|
-
* const headers = new Headers(response.headers);
|
|
21
|
-
* headers.set("x-copilot-version", "2.0");
|
|
22
|
-
* return new Response(response.body, { ...response, headers });
|
|
23
|
-
* },
|
|
24
|
-
* },
|
|
25
|
-
* });
|
|
26
|
-
* ```
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
import type { MaybePromise } from "@copilotkit/shared";
|
|
30
|
-
import type { CopilotRuntimeLike } from "./runtime";
|
|
31
|
-
|
|
32
|
-
/* ------------------------------------------------------------------------------------------------
|
|
33
|
-
* Route info
|
|
34
|
-
* --------------------------------------------------------------------------------------------- */
|
|
35
|
-
|
|
36
|
-
export type RouteInfo =
|
|
37
|
-
| { method: "agent/run"; agentId: string }
|
|
38
|
-
| { method: "agent/connect"; agentId: string }
|
|
39
|
-
| { method: "agent/stop"; agentId: string; threadId: string }
|
|
40
|
-
| { method: "info" }
|
|
41
|
-
| { method: "transcribe" }
|
|
42
|
-
| { method: "threads/list" }
|
|
43
|
-
| { method: "threads/subscribe" }
|
|
44
|
-
| { method: "threads/update"; threadId: string }
|
|
45
|
-
| { method: "threads/archive"; threadId: string }
|
|
46
|
-
| { method: "threads/messages"; threadId: string }
|
|
47
|
-
| { method: "threads/events"; threadId: string }
|
|
48
|
-
| { method: "threads/state"; threadId: string }
|
|
49
|
-
| { method: "threads/clear" }
|
|
50
|
-
| { method: "cpk-debug-events" };
|
|
51
|
-
|
|
52
|
-
/* ------------------------------------------------------------------------------------------------
|
|
53
|
-
* Hook contexts
|
|
54
|
-
* --------------------------------------------------------------------------------------------- */
|
|
55
|
-
|
|
56
|
-
export interface HookContext {
|
|
57
|
-
/** The incoming Fetch Request (possibly modified by prior hooks). */
|
|
58
|
-
request: Request;
|
|
59
|
-
/** The resolved URL pathname. */
|
|
60
|
-
path: string;
|
|
61
|
-
/** The CopilotRuntimeLike instance. */
|
|
62
|
-
runtime: CopilotRuntimeLike;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface HandlerHookContext extends HookContext {
|
|
66
|
-
/** The resolved route information. */
|
|
67
|
-
route: RouteInfo;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export interface ResponseHookContext extends HookContext {
|
|
71
|
-
/** The Response produced by the handler. */
|
|
72
|
-
response: Response;
|
|
73
|
-
/** The resolved route information. */
|
|
74
|
-
route: RouteInfo;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface ErrorHookContext extends HookContext {
|
|
78
|
-
/** The error that occurred. */
|
|
79
|
-
error: unknown;
|
|
80
|
-
/** The route info, if routing had already succeeded. */
|
|
81
|
-
route?: RouteInfo;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/* ------------------------------------------------------------------------------------------------
|
|
85
|
-
* Hooks interface
|
|
86
|
-
* --------------------------------------------------------------------------------------------- */
|
|
87
|
-
|
|
88
|
-
export interface CopilotRuntimeHooks {
|
|
89
|
-
/**
|
|
90
|
-
* Called at the start of every request, before routing.
|
|
91
|
-
* Use to validate auth, attach headers, initialize correlation IDs, etc.
|
|
92
|
-
*
|
|
93
|
-
* Return a modified Request to replace the original, or void to continue.
|
|
94
|
-
* Throw a Response to short-circuit with an early response.
|
|
95
|
-
*/
|
|
96
|
-
onRequest?: (ctx: HookContext) => MaybePromise<Request | void>;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Called after routing is resolved but before the handler executes.
|
|
100
|
-
* Receives the resolved route info (method, agentId, threadId).
|
|
101
|
-
*
|
|
102
|
-
* Use to do route-specific authorization, attach headers for agent calls, etc.
|
|
103
|
-
* Return a modified Request or void.
|
|
104
|
-
* Throw a Response to short-circuit.
|
|
105
|
-
*/
|
|
106
|
-
onBeforeHandler?: (ctx: HandlerHookContext) => MaybePromise<Request | void>;
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Called after the handler produces a Response, before it's sent to the client.
|
|
110
|
-
* Use to set cookies, add debugging headers, log, etc.
|
|
111
|
-
*
|
|
112
|
-
* Return a modified Response to replace the original, or void.
|
|
113
|
-
*/
|
|
114
|
-
onResponse?: (ctx: ResponseHookContext) => MaybePromise<Response | void>;
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Called when an error occurs during request processing.
|
|
118
|
-
* Return a Response to override the default error response, or void to use the default.
|
|
119
|
-
*/
|
|
120
|
-
onError?: (ctx: ErrorHookContext) => MaybePromise<Response | void>;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/* ------------------------------------------------------------------------------------------------
|
|
124
|
-
* Internal hook runners
|
|
125
|
-
* --------------------------------------------------------------------------------------------- */
|
|
126
|
-
|
|
127
|
-
export async function runOnRequest(
|
|
128
|
-
hooks: CopilotRuntimeHooks | undefined,
|
|
129
|
-
ctx: HookContext,
|
|
130
|
-
): Promise<Request> {
|
|
131
|
-
if (!hooks?.onRequest) return ctx.request;
|
|
132
|
-
const result = await hooks.onRequest(ctx);
|
|
133
|
-
return result instanceof Request ? result : ctx.request;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export async function runOnBeforeHandler(
|
|
137
|
-
hooks: CopilotRuntimeHooks | undefined,
|
|
138
|
-
ctx: HandlerHookContext,
|
|
139
|
-
): Promise<Request> {
|
|
140
|
-
if (!hooks?.onBeforeHandler) return ctx.request;
|
|
141
|
-
const result = await hooks.onBeforeHandler(ctx);
|
|
142
|
-
return result instanceof Request ? result : ctx.request;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export async function runOnResponse(
|
|
146
|
-
hooks: CopilotRuntimeHooks | undefined,
|
|
147
|
-
ctx: ResponseHookContext,
|
|
148
|
-
): Promise<Response> {
|
|
149
|
-
if (!hooks?.onResponse) return ctx.response;
|
|
150
|
-
const result = await hooks.onResponse(ctx);
|
|
151
|
-
return result instanceof Response ? result : ctx.response;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export async function runOnError(
|
|
155
|
-
hooks: CopilotRuntimeHooks | undefined,
|
|
156
|
-
ctx: ErrorHookContext,
|
|
157
|
-
): Promise<Response | void> {
|
|
158
|
-
if (!hooks?.onError) return;
|
|
159
|
-
return hooks.onError(ctx);
|
|
160
|
-
}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { logger } from "@copilotkit/shared";
|
|
2
|
-
|
|
3
|
-
export interface ParsedSSEResult {
|
|
4
|
-
messages: Message[];
|
|
5
|
-
threadId?: string;
|
|
6
|
-
runId?: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/** Minimal message shape reconstructed from AG-UI events. */
|
|
10
|
-
export interface Message {
|
|
11
|
-
id: string;
|
|
12
|
-
role: string;
|
|
13
|
-
content?: string;
|
|
14
|
-
toolCalls?: ToolCall[];
|
|
15
|
-
toolCallId?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface ToolCall {
|
|
19
|
-
id: string;
|
|
20
|
-
name: string;
|
|
21
|
-
args: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Parse a cloned SSE Response body into structured messages.
|
|
26
|
-
* Returns empty results for non-SSE responses.
|
|
27
|
-
*/
|
|
28
|
-
export async function parseSSEResponse(
|
|
29
|
-
response: Response,
|
|
30
|
-
): Promise<ParsedSSEResult> {
|
|
31
|
-
const contentType = response.headers.get("content-type") ?? "";
|
|
32
|
-
if (!contentType.includes("text/event-stream")) {
|
|
33
|
-
return { messages: [] };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
let text: string;
|
|
37
|
-
try {
|
|
38
|
-
text = await response.text();
|
|
39
|
-
} catch {
|
|
40
|
-
logger.warn("Failed to read SSE response body in afterRequestMiddleware");
|
|
41
|
-
return { messages: [] };
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (!text.trim()) {
|
|
45
|
-
return { messages: [] };
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
let threadId: string | undefined;
|
|
49
|
-
let runId: string | undefined;
|
|
50
|
-
const messagesById = new Map<string, Message>();
|
|
51
|
-
const toolCallsById = new Map<string, ToolCall>();
|
|
52
|
-
const toolCallParent = new Map<string, string>(); // toolCallId → messageId
|
|
53
|
-
let snapshotMessages: Message[] | undefined;
|
|
54
|
-
|
|
55
|
-
for (const line of text.split("\n")) {
|
|
56
|
-
const trimmed = line.trim();
|
|
57
|
-
if (!trimmed.startsWith("data:")) continue;
|
|
58
|
-
|
|
59
|
-
let event: Record<string, any>;
|
|
60
|
-
try {
|
|
61
|
-
event = JSON.parse(trimmed.slice(5).trim());
|
|
62
|
-
} catch {
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
switch (event.type) {
|
|
67
|
-
case "RUN_STARTED":
|
|
68
|
-
threadId = event.threadId;
|
|
69
|
-
runId = event.runId;
|
|
70
|
-
break;
|
|
71
|
-
|
|
72
|
-
case "MESSAGES_SNAPSHOT":
|
|
73
|
-
if (Array.isArray(event.messages)) {
|
|
74
|
-
snapshotMessages = event.messages;
|
|
75
|
-
}
|
|
76
|
-
break;
|
|
77
|
-
|
|
78
|
-
case "TEXT_MESSAGE_START":
|
|
79
|
-
messagesById.set(event.messageId, {
|
|
80
|
-
id: event.messageId,
|
|
81
|
-
role: event.role ?? "assistant",
|
|
82
|
-
content: "",
|
|
83
|
-
});
|
|
84
|
-
break;
|
|
85
|
-
|
|
86
|
-
case "TEXT_MESSAGE_CONTENT": {
|
|
87
|
-
const msg = messagesById.get(event.messageId);
|
|
88
|
-
if (msg) {
|
|
89
|
-
msg.content = (msg.content ?? "") + (event.delta ?? "");
|
|
90
|
-
}
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
case "TEXT_MESSAGE_CHUNK": {
|
|
95
|
-
// Chunk format: combined start+content. First chunk creates the
|
|
96
|
-
// message, subsequent chunks append delta to content.
|
|
97
|
-
if (event.messageId) {
|
|
98
|
-
const existing = messagesById.get(event.messageId);
|
|
99
|
-
if (existing) {
|
|
100
|
-
existing.content = (existing.content ?? "") + (event.delta ?? "");
|
|
101
|
-
} else {
|
|
102
|
-
messagesById.set(event.messageId, {
|
|
103
|
-
id: event.messageId,
|
|
104
|
-
role: event.role ?? "assistant",
|
|
105
|
-
content: event.delta ?? "",
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
case "TOOL_CALL_START": {
|
|
113
|
-
const tc: ToolCall = {
|
|
114
|
-
id: event.toolCallId,
|
|
115
|
-
name: event.toolCallName,
|
|
116
|
-
args: "",
|
|
117
|
-
};
|
|
118
|
-
toolCallsById.set(event.toolCallId, tc);
|
|
119
|
-
if (event.parentMessageId) {
|
|
120
|
-
toolCallParent.set(event.toolCallId, event.parentMessageId);
|
|
121
|
-
}
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
case "TOOL_CALL_ARGS": {
|
|
126
|
-
const tc = toolCallsById.get(event.toolCallId);
|
|
127
|
-
if (tc) {
|
|
128
|
-
tc.args += event.delta ?? "";
|
|
129
|
-
}
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
case "TOOL_CALL_CHUNK": {
|
|
134
|
-
// Chunk format: combined start+args. First chunk for a given
|
|
135
|
-
// toolCallId creates the tool call, subsequent chunks append delta.
|
|
136
|
-
if (event.toolCallId) {
|
|
137
|
-
let tc = toolCallsById.get(event.toolCallId);
|
|
138
|
-
if (!tc) {
|
|
139
|
-
tc = {
|
|
140
|
-
id: event.toolCallId,
|
|
141
|
-
name: event.toolCallName ?? "",
|
|
142
|
-
args: "",
|
|
143
|
-
};
|
|
144
|
-
toolCallsById.set(event.toolCallId, tc);
|
|
145
|
-
if (event.parentMessageId) {
|
|
146
|
-
toolCallParent.set(event.toolCallId, event.parentMessageId);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
if (event.toolCallName) {
|
|
150
|
-
tc.name = event.toolCallName;
|
|
151
|
-
}
|
|
152
|
-
tc.args += event.delta ?? "";
|
|
153
|
-
}
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
case "TOOL_CALL_END": {
|
|
158
|
-
const tc = toolCallsById.get(event.toolCallId);
|
|
159
|
-
const parentId = toolCallParent.get(event.toolCallId);
|
|
160
|
-
if (tc && parentId) {
|
|
161
|
-
const parent = messagesById.get(parentId);
|
|
162
|
-
if (parent) {
|
|
163
|
-
parent.toolCalls = parent.toolCalls ?? [];
|
|
164
|
-
parent.toolCalls.push(tc);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
break;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
case "TOOL_CALL_RESULT": {
|
|
171
|
-
// langchain-mcp-adapters may send content as an array of
|
|
172
|
-
// {type:"text", text:string} objects instead of a plain string.
|
|
173
|
-
let resultContent = event.content;
|
|
174
|
-
if (Array.isArray(resultContent)) {
|
|
175
|
-
resultContent = resultContent
|
|
176
|
-
.filter((part: any) => part && typeof part.text === "string")
|
|
177
|
-
.map((part: any) => part.text)
|
|
178
|
-
.join("");
|
|
179
|
-
}
|
|
180
|
-
messagesById.set(event.messageId, {
|
|
181
|
-
id: event.messageId,
|
|
182
|
-
role: "tool",
|
|
183
|
-
content: resultContent,
|
|
184
|
-
toolCallId: event.toolCallId,
|
|
185
|
-
});
|
|
186
|
-
break;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Attach any tool calls not yet linked to their parent message.
|
|
192
|
-
// This handles TOOL_CALL_CHUNK flows which don't emit TOOL_CALL_END.
|
|
193
|
-
for (const [toolCallId, tc] of toolCallsById) {
|
|
194
|
-
const parentId = toolCallParent.get(toolCallId);
|
|
195
|
-
if (!parentId) continue;
|
|
196
|
-
const parent = messagesById.get(parentId);
|
|
197
|
-
if (!parent) continue;
|
|
198
|
-
const alreadyAttached = parent.toolCalls?.some((t) => t.id === tc.id);
|
|
199
|
-
if (!alreadyAttached) {
|
|
200
|
-
parent.toolCalls = parent.toolCalls ?? [];
|
|
201
|
-
parent.toolCalls.push(tc);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Prefer MESSAGES_SNAPSHOT if present (contains full history).
|
|
206
|
-
// Otherwise reconstruct from individual events.
|
|
207
|
-
const messages = snapshotMessages ?? [...messagesById.values()];
|
|
208
|
-
|
|
209
|
-
return { messages, threadId, runId };
|
|
210
|
-
}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Middleware support for CopilotKit Runtime.
|
|
3
|
-
*
|
|
4
|
-
* A middleware hook can be provided as either:
|
|
5
|
-
* 1. A **callback function** executed in-process.
|
|
6
|
-
* 2. A **webhook URL** (http/https). The runtime will `POST` a JSON payload
|
|
7
|
-
* to the URL and, for *before* hooks, accept an optional modified
|
|
8
|
-
* `Request` object in the response body.
|
|
9
|
-
*
|
|
10
|
-
* Two lifecycle hooks are available:
|
|
11
|
-
* • `BEFORE_REQUEST` – runs *before* the request handler.
|
|
12
|
-
* • `AFTER_REQUEST` – runs *after* the handler returns a `Response`.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type { CopilotRuntimeLike } from "./runtime";
|
|
16
|
-
import type { MaybePromise } from "@copilotkit/shared";
|
|
17
|
-
import { logger } from "@copilotkit/shared";
|
|
18
|
-
import { parseSSEResponse } from "./middleware-sse-parser";
|
|
19
|
-
import type { Message } from "./middleware-sse-parser";
|
|
20
|
-
|
|
21
|
-
/* ------------------------------------------------------------------------------------------------
|
|
22
|
-
* Public types
|
|
23
|
-
* --------------------------------------------------------------------------------------------- */
|
|
24
|
-
|
|
25
|
-
export interface BeforeRequestMiddlewareParameters {
|
|
26
|
-
runtime: CopilotRuntimeLike;
|
|
27
|
-
request: Request;
|
|
28
|
-
path: string;
|
|
29
|
-
}
|
|
30
|
-
export interface AfterRequestMiddlewareParameters {
|
|
31
|
-
runtime: CopilotRuntimeLike;
|
|
32
|
-
response: Response;
|
|
33
|
-
path: string;
|
|
34
|
-
/** Reconstructed messages from the SSE stream (empty for non-SSE responses). */
|
|
35
|
-
messages?: Message[];
|
|
36
|
-
/** Thread ID extracted from the RUN_STARTED event. */
|
|
37
|
-
threadId?: string;
|
|
38
|
-
/** Run ID extracted from the RUN_STARTED event. */
|
|
39
|
-
runId?: string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type BeforeRequestMiddlewareFn = (
|
|
43
|
-
params: BeforeRequestMiddlewareParameters,
|
|
44
|
-
) => MaybePromise<Request | void>;
|
|
45
|
-
export type AfterRequestMiddlewareFn = (
|
|
46
|
-
params: AfterRequestMiddlewareParameters,
|
|
47
|
-
) => MaybePromise<void>;
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* A middleware value can be either a callback function or a webhook URL.
|
|
51
|
-
*/
|
|
52
|
-
export type BeforeRequestMiddleware = BeforeRequestMiddlewareFn;
|
|
53
|
-
export type AfterRequestMiddleware = AfterRequestMiddlewareFn;
|
|
54
|
-
|
|
55
|
-
/** Lifecycle events emitted to webhook middleware. */
|
|
56
|
-
export enum CopilotKitMiddlewareEvent {
|
|
57
|
-
BeforeRequest = "BEFORE_REQUEST",
|
|
58
|
-
AfterRequest = "AFTER_REQUEST",
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Stages used by the Middleware Webhook Protocol */
|
|
62
|
-
/** Stages used by the CopilotKit webhook protocol */
|
|
63
|
-
export enum WebhookStage {
|
|
64
|
-
BeforeRequest = "before_request",
|
|
65
|
-
AfterRequest = "after_request",
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/* ------------------------------------------------------------------------------------------------
|
|
69
|
-
* Internal helpers – (de)serialisation
|
|
70
|
-
* --------------------------------------------------------------------------------------------- */
|
|
71
|
-
|
|
72
|
-
export async function callBeforeRequestMiddleware({
|
|
73
|
-
runtime,
|
|
74
|
-
request,
|
|
75
|
-
path,
|
|
76
|
-
}: BeforeRequestMiddlewareParameters): Promise<Request | void> {
|
|
77
|
-
const mw = runtime.beforeRequestMiddleware;
|
|
78
|
-
if (!mw) return;
|
|
79
|
-
|
|
80
|
-
// Function-based middleware (in-process)
|
|
81
|
-
if (typeof mw === "function") {
|
|
82
|
-
return (mw as BeforeRequestMiddlewareFn)({ runtime, request, path });
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
logger.warn({ mw }, "Unsupported beforeRequestMiddleware value – skipped");
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export async function callAfterRequestMiddleware({
|
|
90
|
-
runtime,
|
|
91
|
-
response,
|
|
92
|
-
path,
|
|
93
|
-
}: {
|
|
94
|
-
runtime: CopilotRuntimeLike;
|
|
95
|
-
response: Response;
|
|
96
|
-
path: string;
|
|
97
|
-
}): Promise<void> {
|
|
98
|
-
const mw = runtime.afterRequestMiddleware;
|
|
99
|
-
if (!mw) return;
|
|
100
|
-
|
|
101
|
-
const { messages, threadId, runId } = await parseSSEResponse(response);
|
|
102
|
-
|
|
103
|
-
if (typeof mw === "function") {
|
|
104
|
-
return (mw as AfterRequestMiddlewareFn)({
|
|
105
|
-
runtime,
|
|
106
|
-
response,
|
|
107
|
-
path,
|
|
108
|
-
messages,
|
|
109
|
-
threadId,
|
|
110
|
-
runId,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
logger.warn({ mw }, "Unsupported afterRequestMiddleware value – skipped");
|
|
115
|
-
}
|