dd-trace 6.15.0 → 6.17.0
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/README.md +15 -0
- package/ci/diagnose.js +0 -23
- package/ci/test-optimization-validation/approval-artifacts.js +0 -3
- package/ci/test-optimization-validation/approval.js +0 -6
- package/ci/test-optimization-validation/artifact-id.js +0 -1
- package/ci/test-optimization-validation/bounded-json.js +0 -1
- package/ci/test-optimization-validation/cli.js +0 -12
- package/ci/test-optimization-validation/command-output-policy.js +0 -1
- package/ci/test-optimization-validation/command-runner.js +0 -3
- package/ci/test-optimization-validation/environment.js +0 -4
- package/ci/test-optimization-validation/executable-approval.js +0 -1
- package/ci/test-optimization-validation/executable.js +0 -5
- package/ci/test-optimization-validation/framework-adapters/cucumber.js +4 -8
- package/ci/test-optimization-validation/framework-adapters/cypress.js +0 -3
- package/ci/test-optimization-validation/framework-adapters/playwright.js +0 -6
- package/ci/test-optimization-validation/framework-adapters/vitest.js +0 -4
- package/ci/test-optimization-validation/generated-test-contract.js +0 -5
- package/ci/test-optimization-validation/generated-verifier.js +0 -1
- package/ci/test-optimization-validation/literal-environment.js +0 -1
- package/ci/test-optimization-validation/manifest-scaffold.js +0 -17
- package/ci/test-optimization-validation/manifest-schema.js +0 -21
- package/ci/test-optimization-validation/offline-fixtures.js +0 -4
- package/ci/test-optimization-validation/package-check.js +4 -1
- package/ci/test-optimization-validation/plan-writer.js +0 -11
- package/ci/test-optimization-validation/preflight-runner.js +0 -1
- package/ci/test-optimization-validation/redaction.js +0 -4
- package/ci/test-optimization-validation/report-writer.js +0 -16
- package/ci/test-optimization-validation/runner-command.js +0 -3
- package/ci/test-optimization-validation/runner-contract.js +0 -4
- package/ci/test-optimization-validation/safe-files.js +0 -1
- package/ci/test-optimization-validation/scenarios/basic-reporting.js +0 -1
- package/ci/test-optimization-validation/scenarios/ci-wiring.js +1 -2
- package/ci/test-optimization-validation/source-text.js +0 -3
- package/ci/vitest-no-worker-init-setup.mjs +41 -16
- package/index.d.ts +169 -0
- package/next.d.ts +27 -0
- package/next.js +3 -0
- package/package.json +28 -23
- package/packages/datadog-esbuild/index.js +14 -1
- package/packages/datadog-esbuild/src/resolver.js +284 -0
- package/packages/datadog-esbuild/src/utils.js +162 -120
- package/packages/datadog-instrumentations/src/aerospike.js +28 -6
- package/packages/datadog-instrumentations/src/ai.js +39 -97
- package/packages/datadog-instrumentations/src/anthropic.js +76 -134
- package/packages/datadog-instrumentations/src/aws-durable-execution-sdk-js.js +1 -3
- package/packages/datadog-instrumentations/src/aws-sdk.js +0 -2
- package/packages/datadog-instrumentations/src/azure-cosmos.js +1 -1
- package/packages/datadog-instrumentations/src/azure-durable-functions.js +23 -9
- package/packages/datadog-instrumentations/src/azure-functions.js +48 -0
- package/packages/datadog-instrumentations/src/bullmq.js +1 -1
- package/packages/datadog-instrumentations/src/claude-agent-sdk.js +1 -3
- package/packages/datadog-instrumentations/src/console.js +97 -0
- package/packages/datadog-instrumentations/src/cucumber.js +72 -12
- package/packages/datadog-instrumentations/src/cypress-config.js +0 -23
- package/packages/datadog-instrumentations/src/dd-trace-api.js +2 -2
- package/packages/datadog-instrumentations/src/graphql.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/bundler-register.js +39 -14
- package/packages/datadog-instrumentations/src/helpers/channel.js +0 -2
- package/packages/datadog-instrumentations/src/helpers/graphql-jit-runtime.js +0 -5
- package/packages/datadog-instrumentations/src/helpers/hooks.js +8 -0
- package/packages/datadog-instrumentations/src/helpers/instrument.js +25 -8
- package/packages/datadog-instrumentations/src/helpers/instrumentation-utils.js +69 -0
- package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +0 -6
- package/packages/datadog-instrumentations/src/helpers/register.js +13 -64
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +109 -29
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentation-registry.js +39 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/azure-durable-functions.js +17 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +3 -16
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +12 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/postgres.js +36 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/supabase.js +128 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +6 -7
- package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +17 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms/postgres.js +388 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +99 -75
- package/packages/datadog-instrumentations/src/helpers/router-helper.js +0 -1
- package/packages/datadog-instrumentations/src/jest.js +141 -51
- package/packages/datadog-instrumentations/src/knex.js +0 -1
- package/packages/datadog-instrumentations/src/langchain.js +1 -1
- package/packages/datadog-instrumentations/src/langgraph.js +1 -1
- package/packages/datadog-instrumentations/src/mariadb-bundle.js +0 -24
- package/packages/datadog-instrumentations/src/mariadb.js +0 -2
- package/packages/datadog-instrumentations/src/mercurius.js +1 -1
- package/packages/datadog-instrumentations/src/mocha/common.js +0 -1
- package/packages/datadog-instrumentations/src/mocha/main.js +22 -25
- package/packages/datadog-instrumentations/src/mocha/utils.js +119 -49
- package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +0 -6
- package/packages/datadog-instrumentations/src/mocha/worker.js +14 -17
- package/packages/datadog-instrumentations/src/modelcontextprotocol-sdk.js +1 -1
- package/packages/datadog-instrumentations/src/mysql2.js +0 -2
- package/packages/datadog-instrumentations/src/openai-agents.js +1 -1
- package/packages/datadog-instrumentations/src/openai-realtime/audio-accumulator.js +241 -0
- package/packages/datadog-instrumentations/src/openai-realtime/events.js +76 -0
- package/packages/datadog-instrumentations/src/openai-realtime/index.js +301 -0
- package/packages/datadog-instrumentations/src/openai-realtime/session.js +998 -0
- package/packages/datadog-instrumentations/src/openai-realtime/turns.js +211 -0
- package/packages/datadog-instrumentations/src/openai.js +97 -80
- package/packages/datadog-instrumentations/src/oracledb.js +9 -3
- package/packages/datadog-instrumentations/src/playwright-reporter.js +3 -16
- package/packages/datadog-instrumentations/src/playwright.js +238 -55
- package/packages/datadog-instrumentations/src/postgres.js +7 -0
- package/packages/datadog-instrumentations/src/router.js +0 -2
- package/packages/datadog-instrumentations/src/rum-browser-scripts.js +0 -2
- package/packages/datadog-instrumentations/src/sequelize.js +0 -1
- package/packages/datadog-instrumentations/src/supabase.js +15 -0
- package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +18 -18
- package/packages/datadog-instrumentations/src/vitest-main.js +37 -17
- package/packages/datadog-instrumentations/src/vitest-util.js +7 -1
- package/packages/datadog-instrumentations/src/vitest-worker.js +56 -23
- package/packages/datadog-instrumentations/src/webdriverio.js +23 -42
- package/packages/datadog-instrumentations/src/ws.js +0 -1
- package/packages/datadog-plugin-ai/src/utils.js +0 -2
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/trace-checkpoint.js +0 -1
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +0 -2
- package/packages/datadog-plugin-aws-sdk/src/base.js +0 -1
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +7 -2
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +0 -1
- package/packages/datadog-plugin-aws-sdk/src/util.js +0 -1
- package/packages/datadog-plugin-azure-cosmos/src/index.js +1 -1
- package/packages/datadog-plugin-azure-durable-functions/src/index.js +95 -1
- package/packages/datadog-plugin-cucumber/src/index.js +10 -0
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +171 -75
- package/packages/datadog-plugin-cypress/src/finalization.js +0 -3
- package/packages/datadog-plugin-cypress/src/source-map-utils.js +0 -4
- package/packages/datadog-plugin-cypress/src/support.js +52 -7
- package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -24
- package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +2 -36
- package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-request-context.js +31 -0
- package/packages/datadog-plugin-graphql/src/resolve-error.js +32 -11
- package/packages/datadog-plugin-graphql/src/utils.js +0 -5
- package/packages/datadog-plugin-jest/src/index.js +13 -0
- package/packages/datadog-plugin-kafkajs/src/producer.js +0 -1
- package/packages/datadog-plugin-mocha/src/index.js +39 -11
- package/packages/datadog-plugin-mongodb-core/src/query.js +0 -1
- package/packages/datadog-plugin-openai/src/index.js +16 -1
- package/packages/datadog-plugin-openai/src/realtime.js +144 -0
- package/packages/datadog-plugin-openai-agents/src/integration.js +0 -4
- package/packages/datadog-plugin-openai-agents/src/util.js +0 -1
- package/packages/datadog-plugin-playwright/src/index.js +76 -9
- package/packages/datadog-plugin-postgres/src/index.js +167 -0
- package/packages/datadog-plugin-prisma/src/datadog-tracing-helper.js +0 -1
- package/packages/datadog-plugin-redis/src/index.js +15 -1
- package/packages/datadog-plugin-supabase/src/error.js +18 -0
- package/packages/datadog-plugin-supabase/src/index.js +21 -0
- package/packages/datadog-plugin-supabase/src/supabase-auth-js-gotrueclient-getuser.js +69 -0
- package/packages/datadog-plugin-supabase/src/supabase-functions-js-functionsclient-invoke.js +70 -0
- package/packages/datadog-plugin-supabase/src/supabase-postgrest-js-postgrestbuilder-then.js +122 -0
- package/packages/datadog-plugin-supabase/src/supabase-realtime-js-realtimechannel-send.js +66 -0
- package/packages/datadog-plugin-supabase/src/supabase-storage-js-handle-request.js +93 -0
- package/packages/datadog-plugin-supabase/src/url.js +17 -0
- package/packages/datadog-plugin-vitest/src/index.js +10 -0
- package/packages/datadog-plugin-ws/src/util.js +0 -4
- package/packages/datadog-turbopack/index.js +206 -0
- package/packages/datadog-turbopack/src/constants.js +5 -0
- package/packages/datadog-turbopack/src/loader.js +484 -0
- package/packages/datadog-webpack/src/loader.js +0 -1
- package/packages/dd-trace/src/aiguard/client.js +2 -3
- package/packages/dd-trace/src/aiguard/evaluation.js +6 -12
- package/packages/dd-trace/src/aiguard/index.js +3 -2
- package/packages/dd-trace/src/aiguard/integrations/anthropic.js +53 -25
- package/packages/dd-trace/src/aiguard/integrations/evaluate.js +49 -25
- package/packages/dd-trace/src/aiguard/integrations/index.js +4 -3
- package/packages/dd-trace/src/aiguard/integrations/openai.js +132 -29
- package/packages/dd-trace/src/aiguard/integrations/vercel-ai.js +116 -42
- package/packages/dd-trace/src/aiguard/messages/anthropic.js +0 -2
- package/packages/dd-trace/src/aiguard/messages/openai.js +64 -1
- package/packages/dd-trace/src/aiguard/messages/utils.js +29 -2
- package/packages/dd-trace/src/aiguard/messages/vercel-ai.js +25 -0
- package/packages/dd-trace/src/aiguard/redaction.js +0 -1
- package/packages/dd-trace/src/aiguard/sdk.js +1 -1
- package/packages/dd-trace/src/appsec/activation.js +1 -1
- package/packages/dd-trace/src/appsec/api_security/normalized-route.js +0 -5
- package/packages/dd-trace/src/appsec/api_security/sampler.js +0 -4
- package/packages/dd-trace/src/appsec/blocking/index.js +3 -3
- package/packages/dd-trace/src/appsec/downstream_requests.js +1 -4
- package/packages/dd-trace/src/appsec/iast/index.js +1 -1
- package/packages/dd-trace/src/appsec/iast/overhead-controller.js +5 -5
- package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +3 -3
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +8 -10
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +4 -1
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +7 -7
- package/packages/dd-trace/src/appsec/index.js +2 -2
- package/packages/dd-trace/src/appsec/lambda.js +71 -2
- package/packages/dd-trace/src/appsec/rasp/utils.js +5 -1
- package/packages/dd-trace/src/appsec/remote_config.js +8 -6
- package/packages/dd-trace/src/appsec/reporter.js +10 -6
- package/packages/dd-trace/src/appsec/rule_manager.js +3 -3
- package/packages/dd-trace/src/appsec/sdk/track_event.js +0 -2
- package/packages/dd-trace/src/appsec/telemetry/api_security.js +1 -3
- package/packages/dd-trace/src/appsec/telemetry/common.js +4 -0
- package/packages/dd-trace/src/appsec/telemetry/index.js +23 -5
- package/packages/dd-trace/src/appsec/telemetry/rasp.js +1 -20
- package/packages/dd-trace/src/appsec/telemetry/user.js +1 -3
- package/packages/dd-trace/src/appsec/telemetry/waf.js +1 -20
- package/packages/dd-trace/src/appsec/waf/index.js +2 -2
- package/packages/dd-trace/src/appsec/waf/waf_manager.js +8 -5
- package/packages/dd-trace/src/carrier.js +0 -5
- package/packages/dd-trace/src/ci-visibility/dynamic-atr-retries.js +104 -0
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +0 -2
- package/packages/dd-trace/src/ci-visibility/efd-retry-policy.js +34 -3
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/index.js +0 -4
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/msgpack-to-json.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/sink.js +0 -2
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +37 -15
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +0 -3
- package/packages/dd-trace/src/ci-visibility/exporters/request.js +0 -11
- package/packages/dd-trace/src/ci-visibility/exporters/settings-cache-key.js +0 -1
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +0 -1
- package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +0 -6
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +2 -2
- package/packages/dd-trace/src/ci-visibility/requests/rate-limit.js +0 -1
- package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +0 -5
- package/packages/dd-trace/src/ci-visibility/requests/video-request.js +0 -1
- package/packages/dd-trace/src/ci-visibility/telemetry.js +13 -0
- package/packages/dd-trace/src/ci-visibility/test-optimization-cache.js +0 -1
- package/packages/dd-trace/src/ci-visibility/test-screenshot.js +0 -2
- package/packages/dd-trace/src/ci-visibility/test-video.js +0 -1
- package/packages/dd-trace/src/config/defaults.js +3 -2
- package/packages/dd-trace/src/config/generated-config-types.d.ts +74 -66
- package/packages/dd-trace/src/config/helper.js +9 -2
- package/packages/dd-trace/src/config/index.js +44 -29
- package/packages/dd-trace/src/config/parsers.js +34 -6
- package/packages/dd-trace/src/config/remote_config.js +25 -109
- package/packages/dd-trace/src/config/supported-configurations.json +146 -9
- package/packages/dd-trace/src/datastreams/encoding.js +0 -1
- package/packages/dd-trace/src/datastreams/pathway.js +0 -1
- package/packages/dd-trace/src/debugger/constants.js +10 -0
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +76 -17
- package/packages/dd-trace/src/debugger/devtools_client/config.js +2 -0
- package/packages/dd-trace/src/debugger/devtools_client/guardrail-metrics.js +15 -0
- package/packages/dd-trace/src/debugger/devtools_client/index.js +103 -27
- package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +50 -7
- package/packages/dd-trace/src/debugger/devtools_client/log.js +3 -1
- package/packages/dd-trace/src/debugger/devtools_client/probe_sampler.js +34 -8
- package/packages/dd-trace/src/debugger/devtools_client/send.js +40 -14
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +53 -13
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +118 -71
- package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +0 -3
- package/packages/dd-trace/src/debugger/devtools_client/status.js +20 -6
- package/packages/dd-trace/src/debugger/guardrail-metrics.js +167 -0
- package/packages/dd-trace/src/debugger/index.js +50 -2
- package/packages/dd-trace/src/debugger/inspect-segment.js +0 -3
- package/packages/dd-trace/src/debugger/probe_sampler.js +133 -9
- package/packages/dd-trace/src/debugger/probe_sampler_constants.js +31 -1
- package/packages/dd-trace/src/dogstatsd.js +0 -23
- package/packages/dd-trace/src/encode/0.4-cross-payload.js +0 -3
- package/packages/dd-trace/src/encode/0.4.js +0 -7
- package/packages/dd-trace/src/encode/0.5.js +0 -2
- package/packages/dd-trace/src/encode/tags-processors.js +0 -1
- package/packages/dd-trace/src/evp_proxy/discovery.js +3 -5
- package/packages/dd-trace/src/evp_proxy/path.js +11 -4
- package/packages/dd-trace/src/exporters/agent/writer.js +0 -1
- package/packages/dd-trace/src/exporters/agentless/index.js +0 -1
- package/packages/dd-trace/src/exporters/agentless/intake.js +0 -1
- package/packages/dd-trace/src/exporters/agentless/writer.js +0 -3
- package/packages/dd-trace/src/exporters/common/docker.js +4 -1
- package/packages/dd-trace/src/exporters/common/final-flush-request-tracker.js +0 -6
- package/packages/dd-trace/src/exporters/common/proxy.js +3 -0
- package/packages/dd-trace/src/exporters/common/request.js +1 -0
- package/packages/dd-trace/src/exporters/common/url.js +0 -2
- package/packages/dd-trace/src/exporters/common/writer.js +0 -2
- package/packages/dd-trace/src/id.js +0 -11
- package/packages/dd-trace/src/llmobs/audio-codec.js +192 -0
- package/packages/dd-trace/src/llmobs/audio-utils.js +121 -0
- package/packages/dd-trace/src/llmobs/constants/audio.js +35 -0
- package/packages/dd-trace/src/llmobs/constants/prompts.js +14 -0
- package/packages/dd-trace/src/llmobs/constants/tags.js +17 -0
- package/packages/dd-trace/src/llmobs/eval-metric.js +0 -6
- package/packages/dd-trace/src/llmobs/experiments/dataset.js +0 -4
- package/packages/dd-trace/src/llmobs/experiments/experiment.js +0 -3
- package/packages/dd-trace/src/llmobs/experiments/index.js +7 -6
- package/packages/dd-trace/src/llmobs/experiments/util.js +1 -11
- package/packages/dd-trace/src/llmobs/index.js +1 -3
- package/packages/dd-trace/src/llmobs/noop.js +10 -0
- package/packages/dd-trace/src/llmobs/plugins/ai/util.js +0 -4
- package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +0 -1
- package/packages/dd-trace/src/llmobs/plugins/genai/util.js +0 -4
- package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +0 -2
- package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +0 -2
- package/packages/dd-trace/src/llmobs/plugins/openai/index.js +4 -6
- package/packages/dd-trace/src/llmobs/plugins/openai/realtime.js +285 -0
- package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +16 -3
- package/packages/dd-trace/src/llmobs/prompts/cache.js +272 -0
- package/packages/dd-trace/src/llmobs/prompts/manager.js +639 -0
- package/packages/dd-trace/src/llmobs/prompts/noop.js +29 -0
- package/packages/dd-trace/src/llmobs/prompts/prompt.js +92 -0
- package/packages/dd-trace/src/llmobs/sdk.js +21 -6
- package/packages/dd-trace/src/llmobs/span_processor.js +81 -2
- package/packages/dd-trace/src/llmobs/tagger.js +30 -7
- package/packages/dd-trace/src/llmobs/telemetry.js +36 -4
- package/packages/dd-trace/src/llmobs/util.js +0 -34
- package/packages/dd-trace/src/llmobs/writers/base.js +0 -1
- package/packages/dd-trace/src/llmobs/writers/util.js +1 -2
- package/packages/dd-trace/src/log/channels.js +3 -0
- package/packages/dd-trace/src/log/index.js +23 -5
- package/packages/dd-trace/src/log-submission/log-submission-plugin.js +74 -6
- package/packages/dd-trace/src/msgpack/chunk.js +0 -1
- package/packages/dd-trace/src/openfeature/agentless_configuration_source.js +0 -12
- package/packages/dd-trace/src/openfeature/encoding.js +0 -2
- package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +0 -1
- package/packages/dd-trace/src/openfeature/index.js +0 -4
- package/packages/dd-trace/src/openfeature/span-enrichment-hook.js +0 -1
- package/packages/dd-trace/src/openfeature/span-enrichment.js +0 -4
- package/packages/dd-trace/src/openfeature/writers/base.js +0 -6
- package/packages/dd-trace/src/openfeature/writers/exposures.js +0 -5
- package/packages/dd-trace/src/openfeature/writers/util.js +0 -4
- package/packages/dd-trace/src/opentelemetry/logs/logger.js +0 -1
- package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +0 -1
- package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +0 -1
- package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +0 -2
- package/packages/dd-trace/src/opentelemetry/metrics/index.js +1 -1
- package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +4 -4
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +0 -1
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +0 -1
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +103 -35
- package/packages/dd-trace/src/opentelemetry/metrics/time.js +0 -1
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +36 -13
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +0 -1
- package/packages/dd-trace/src/opentelemetry/span-helpers.js +0 -1
- package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +0 -1
- package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +0 -3
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +0 -6
- package/packages/dd-trace/src/opentracing/span_context.js +0 -1
- package/packages/dd-trace/src/otel-thread-ctx.js +38 -11
- package/packages/dd-trace/src/payload-tagging/tagging.js +15 -3
- package/packages/dd-trace/src/plugin_manager.js +9 -3
- package/packages/dd-trace/src/plugins/ci_plugin.js +0 -1
- package/packages/dd-trace/src/plugins/database.js +2 -6
- package/packages/dd-trace/src/plugins/index.js +8 -0
- package/packages/dd-trace/src/plugins/plugin.js +0 -4
- package/packages/dd-trace/src/plugins/tracing.js +1 -1
- package/packages/dd-trace/src/plugins/util/git.js +1 -3
- package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +0 -1
- package/packages/dd-trace/src/plugins/util/llm.js +0 -2
- package/packages/dd-trace/src/plugins/util/status-validator.js +0 -1
- package/packages/dd-trace/src/plugins/util/test.js +25 -21
- package/packages/dd-trace/src/plugins/util/url.js +0 -5
- package/packages/dd-trace/src/priority_sampler.js +0 -6
- package/packages/dd-trace/src/process-tags/index.js +0 -1
- package/packages/dd-trace/src/profiler.js +132 -35
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +0 -1
- package/packages/dd-trace/src/profiling/profiler.js +101 -41
- package/packages/dd-trace/src/profiling/ssi-heuristics.js +29 -15
- package/packages/dd-trace/src/propagation-hash/index.js +0 -1
- package/packages/dd-trace/src/proxy.js +21 -45
- package/packages/dd-trace/src/random_sampler.js +0 -4
- package/packages/dd-trace/src/rate_limiter.js +0 -4
- package/packages/dd-trace/src/remote_config/capabilities.js +1 -9
- package/packages/dd-trace/src/remote_config/index.js +0 -1
- package/packages/dd-trace/src/runtime_metrics/otlp_runtime_metrics.js +0 -3
- package/packages/dd-trace/src/sampler.js +0 -4
- package/packages/dd-trace/src/sampling_rule.js +0 -7
- package/packages/dd-trace/src/serverless/vercel.js +0 -1
- package/packages/dd-trace/src/serverless.js +0 -1
- package/packages/dd-trace/src/service-naming/index.js +0 -1
- package/packages/dd-trace/src/service-naming/schemas/util.js +0 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +7 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +5 -0
- package/packages/dd-trace/src/span_processor.js +2 -2
- package/packages/dd-trace/src/span_sampler.js +0 -1
- package/packages/dd-trace/src/standalone/product.js +2 -2
- package/packages/dd-trace/src/standalone/tracesource.js +0 -1
- package/packages/dd-trace/src/startup-log.js +1 -1
- package/packages/dd-trace/src/telemetry/endpoints.js +0 -8
- package/packages/dd-trace/src/telemetry/logs/index.js +16 -5
- package/packages/dd-trace/src/telemetry/logs/log-collector.js +16 -6
- package/packages/dd-trace/src/telemetry/metrics.js +0 -2
- package/packages/dd-trace/src/telemetry/telemetry.js +4 -1
- package/packages/dd-trace/src/util.js +13 -1
- package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/claude-agent-sdk/utils.js +0 -10
|
@@ -2,35 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
const { channel } = require('dc-polyfill')
|
|
4
4
|
|
|
5
|
-
const {
|
|
5
|
+
const {
|
|
6
|
+
buildOutputMessages,
|
|
7
|
+
convertVercelPromptToMessages,
|
|
8
|
+
getStreamedContent,
|
|
9
|
+
} = require('../messages/vercel-ai')
|
|
10
|
+
const { decode } = require('../messages/utils')
|
|
6
11
|
const { SOURCE_AUTO } = require('../tags')
|
|
7
|
-
const {
|
|
12
|
+
const { evaluate } = require('./evaluate')
|
|
8
13
|
|
|
9
|
-
const
|
|
10
|
-
const doGenerateAfterChannel = channel('dd-trace:vercel-ai:doGenerate:after')
|
|
11
|
-
const doStreamBeforeChannel = channel('dd-trace:vercel-ai:doStream:before')
|
|
12
|
-
const doStreamAfterChannel = channel('dd-trace:vercel-ai:doStream:after')
|
|
14
|
+
const modelInterceptChannel = channel('dd-trace:vercel-ai:model:intercept')
|
|
13
15
|
|
|
14
16
|
let isEnabled = false
|
|
15
17
|
let aiguard
|
|
16
18
|
let opts
|
|
19
|
+
let analyzeStreamResponses
|
|
17
20
|
|
|
18
21
|
/**
|
|
19
|
-
* Subscribes AI Guard to Vercel AI
|
|
22
|
+
* Subscribes AI Guard to the Vercel AI model call channel.
|
|
20
23
|
*
|
|
21
24
|
* @param {object} aiguardInstance
|
|
22
25
|
* @param {boolean} block
|
|
26
|
+
* @param {boolean} analyzeStreams
|
|
23
27
|
*/
|
|
24
|
-
function enable (aiguardInstance, block) {
|
|
28
|
+
function enable (aiguardInstance, block, analyzeStreams) {
|
|
25
29
|
if (isEnabled) return
|
|
26
30
|
|
|
27
31
|
aiguard = aiguardInstance
|
|
28
32
|
opts = { block, source: SOURCE_AUTO, integration: 'ai' }
|
|
33
|
+
analyzeStreamResponses = analyzeStreams
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
doGenerateAfterChannel.subscribe(onGenerateAfter)
|
|
32
|
-
doStreamBeforeChannel.subscribe(onBefore)
|
|
33
|
-
doStreamAfterChannel.subscribe(onStreamAfter)
|
|
35
|
+
modelInterceptChannel.subscribe(onModelIntercept)
|
|
34
36
|
|
|
35
37
|
isEnabled = true
|
|
36
38
|
}
|
|
@@ -38,54 +40,126 @@ function enable (aiguardInstance, block) {
|
|
|
38
40
|
function disable () {
|
|
39
41
|
if (!isEnabled) return
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
doGenerateAfterChannel.unsubscribe(onGenerateAfter)
|
|
43
|
-
doStreamBeforeChannel.unsubscribe(onBefore)
|
|
44
|
-
doStreamAfterChannel.unsubscribe(onStreamAfter)
|
|
43
|
+
modelInterceptChannel.unsubscribe(onModelIntercept)
|
|
45
44
|
|
|
46
45
|
aiguard = undefined
|
|
47
46
|
opts = undefined
|
|
47
|
+
analyzeStreamResponses = undefined
|
|
48
48
|
isEnabled = false
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
function
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
function onModelIntercept (ctx) {
|
|
52
|
+
const inputMessages = convertVercelPromptToMessages(ctx.arguments?.[0]?.prompt)
|
|
53
|
+
if (!inputMessages.length) return
|
|
54
|
+
|
|
55
|
+
// Called exactly once per model call by the instrumentation, so no memoization needed.
|
|
56
|
+
ctx.beforeResult = () => {
|
|
57
|
+
if (!isEnabled) return
|
|
58
|
+
return evaluate(ctx, aiguard, [inputMessages], opts)
|
|
59
|
+
}
|
|
54
60
|
|
|
55
|
-
|
|
56
|
-
const inputMessages = convertVercelPromptToMessages(ctx.prompt)
|
|
57
|
-
if (!inputMessages.length || !ctx.result?.content?.length) return
|
|
61
|
+
if (ctx.method === 'doStream' && !analyzeStreamResponses) return
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
ctx.onResult = ctx.method === 'doStream'
|
|
64
|
+
? result => {
|
|
65
|
+
if (!isEnabled) return result
|
|
66
|
+
return interceptStreamedResult(ctx, result, inputMessages)
|
|
67
|
+
}
|
|
68
|
+
: result => {
|
|
69
|
+
if (!isEnabled) return result
|
|
70
|
+
|
|
71
|
+
const outputMessages = decode(
|
|
72
|
+
() => buildOutputMessages(inputMessages, result?.content ?? []),
|
|
73
|
+
null,
|
|
74
|
+
'AIGuard: unable to decode the model result: %s'
|
|
75
|
+
)
|
|
76
|
+
if (outputMessages === null) return result
|
|
77
|
+
if (!outputMessages.length) return result
|
|
78
|
+
|
|
79
|
+
return evaluate(ctx, aiguard, [outputMessages], opts).then(() => result)
|
|
80
|
+
}
|
|
60
81
|
}
|
|
61
82
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Judging a streamed response requires the whole output, so the stream is drained and replaced
|
|
85
|
+
* with a replay of the collected chunks. That trades streaming latency for output coverage.
|
|
86
|
+
*
|
|
87
|
+
* @param {object} ctx
|
|
88
|
+
* @param {object} result
|
|
89
|
+
* @param {Array<object>} inputMessages
|
|
90
|
+
* @returns {object|Promise<object>}
|
|
91
|
+
*/
|
|
92
|
+
function interceptStreamedResult (ctx, result, inputMessages) {
|
|
93
|
+
if (!result?.stream) return result
|
|
94
|
+
|
|
95
|
+
let drained
|
|
96
|
+
try {
|
|
97
|
+
drained = drainStream(result.stream)
|
|
98
|
+
} catch {
|
|
99
|
+
// Nothing was consumed, so the caller still has the stream they handed us.
|
|
100
|
+
return result
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return drained.then(({ chunks, error }) => {
|
|
104
|
+
// The original stream is spent from here on, so the caller must get the replay either way.
|
|
105
|
+
const replayed = { ...result, stream: replayChunks(chunks, error) }
|
|
65
106
|
|
|
66
|
-
|
|
107
|
+
// A stream that failed part-way has no complete output to judge; the replay carries the error.
|
|
108
|
+
if (error) return replayed
|
|
109
|
+
|
|
110
|
+
const outputMessages = decode(
|
|
111
|
+
() => buildOutputMessages(inputMessages, getStreamedContent(chunks)),
|
|
112
|
+
null,
|
|
113
|
+
'AIGuard: unable to decode the streamed model result: %s'
|
|
114
|
+
)
|
|
115
|
+
if (outputMessages === null) return replayed
|
|
116
|
+
if (!outputMessages.length) return replayed
|
|
117
|
+
|
|
118
|
+
return evaluate(ctx, aiguard, [outputMessages], opts).then(() => replayed)
|
|
119
|
+
})
|
|
67
120
|
}
|
|
68
121
|
|
|
69
122
|
/**
|
|
70
|
-
*
|
|
123
|
+
* Never rejects: a stream that fails part-way is already consumed, so its chunks and its error
|
|
124
|
+
* are both returned for the replay to hand back to the caller.
|
|
71
125
|
*
|
|
72
|
-
* @param {
|
|
73
|
-
* @returns {Array<object>}
|
|
126
|
+
* @param {ReadableStream} stream
|
|
127
|
+
* @returns {Promise<{ chunks: Array<object>, error?: unknown }>}
|
|
74
128
|
*/
|
|
75
|
-
function
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
129
|
+
function drainStream (stream) {
|
|
130
|
+
const chunks = []
|
|
131
|
+
const reader = stream.getReader()
|
|
132
|
+
|
|
133
|
+
function readAll () {
|
|
134
|
+
return reader.read().then(({ done, value }) => {
|
|
135
|
+
if (done) return { chunks }
|
|
136
|
+
chunks.push(value)
|
|
137
|
+
return readAll()
|
|
138
|
+
}, error => ({ chunks, error }))
|
|
85
139
|
}
|
|
86
140
|
|
|
87
|
-
|
|
88
|
-
|
|
141
|
+
return readAll()
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @param {Array<object>} chunks
|
|
146
|
+
* @param {unknown} [error]
|
|
147
|
+
* @returns {ReadableStream}
|
|
148
|
+
*/
|
|
149
|
+
function replayChunks (chunks, error) {
|
|
150
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
151
|
+
return new ReadableStream({
|
|
152
|
+
start (controller) {
|
|
153
|
+
for (const chunk of chunks) {
|
|
154
|
+
controller.enqueue(chunk)
|
|
155
|
+
}
|
|
156
|
+
if (error) {
|
|
157
|
+
controller.error(error)
|
|
158
|
+
} else {
|
|
159
|
+
controller.close()
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
})
|
|
89
163
|
}
|
|
90
164
|
|
|
91
165
|
module.exports = { enable, disable }
|
|
@@ -220,7 +220,6 @@ function partsToContent (parts, hasImages) {
|
|
|
220
220
|
|
|
221
221
|
/**
|
|
222
222
|
* @param {Array<object>} parts
|
|
223
|
-
* @returns {boolean}
|
|
224
223
|
*/
|
|
225
224
|
function hasImageParts (parts) {
|
|
226
225
|
return parts.some(part => part.type === 'image_url')
|
|
@@ -267,7 +266,6 @@ function convertAnthropicToolResultContent (content) {
|
|
|
267
266
|
|
|
268
267
|
/**
|
|
269
268
|
* @param {unknown} content
|
|
270
|
-
* @returns {string}
|
|
271
269
|
*/
|
|
272
270
|
function convertServerToolResultContent (content) {
|
|
273
271
|
if (typeof content === 'string') return content || '[tool result]'
|
|
@@ -195,6 +195,68 @@ function getResponsesOutputMessages (body) {
|
|
|
195
195
|
return convertOpenAIResponseItemsToMessages(body?.output, 'assistant')
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
+
/**
|
|
199
|
+
* Combines streamed chat completion deltas into regular output messages.
|
|
200
|
+
*
|
|
201
|
+
* @param {Array<object>} chunks
|
|
202
|
+
* @returns {Array<object>}
|
|
203
|
+
*/
|
|
204
|
+
function getStreamedChatCompletionsOutputMessages (chunks) {
|
|
205
|
+
const messages = new Map()
|
|
206
|
+
|
|
207
|
+
for (const chunk of chunks) {
|
|
208
|
+
if (!Array.isArray(chunk?.choices)) continue
|
|
209
|
+
for (const choice of chunk.choices) {
|
|
210
|
+
const delta = choice.delta
|
|
211
|
+
if (!delta) continue
|
|
212
|
+
|
|
213
|
+
const index = choice.index ?? 0
|
|
214
|
+
const message = messages.get(index) ?? { role: 'assistant' }
|
|
215
|
+
messages.set(index, message)
|
|
216
|
+
|
|
217
|
+
if (typeof delta.role === 'string') message.role = delta.role
|
|
218
|
+
if (typeof delta.content === 'string') message.content = (message.content ?? '') + delta.content
|
|
219
|
+
if (typeof delta.refusal === 'string') message.refusal = (message.refusal ?? '') + delta.refusal
|
|
220
|
+
|
|
221
|
+
if (delta.function_call) {
|
|
222
|
+
const functionCall = message.function_call ??= {}
|
|
223
|
+
functionCall.name ??= delta.function_call.name
|
|
224
|
+
if (typeof delta.function_call.arguments === 'string') {
|
|
225
|
+
functionCall.arguments = (functionCall.arguments ?? '') + delta.function_call.arguments
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (!Array.isArray(delta.tool_calls)) continue
|
|
230
|
+
for (const toolCallDelta of delta.tool_calls) {
|
|
231
|
+
const toolCalls = message.tool_calls ??= []
|
|
232
|
+
const toolCall = toolCalls[toolCallDelta.index ?? 0] ??= { function: {} }
|
|
233
|
+
toolCall.id ??= toolCallDelta.id
|
|
234
|
+
toolCall.type ??= toolCallDelta.type
|
|
235
|
+
toolCall.function.name ??= toolCallDelta.function?.name
|
|
236
|
+
if (typeof toolCallDelta.function?.arguments === 'string') {
|
|
237
|
+
toolCall.function.arguments = (toolCall.function.arguments ?? '') + toolCallDelta.function.arguments
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const choices = [...messages.values()].map(message => {
|
|
244
|
+
if (message.tool_calls) message.tool_calls = message.tool_calls.filter(Boolean)
|
|
245
|
+
return { message }
|
|
246
|
+
})
|
|
247
|
+
return getChatCompletionsOutputMessages({ choices })
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Gets output messages from the final response snapshot in a Responses API stream.
|
|
252
|
+
*
|
|
253
|
+
* @param {Array<object>} chunks
|
|
254
|
+
* @returns {Array<object>}
|
|
255
|
+
*/
|
|
256
|
+
function getStreamedResponsesOutputMessages (chunks) {
|
|
257
|
+
return getResponsesOutputMessages(chunks.at(-1)?.response)
|
|
258
|
+
}
|
|
259
|
+
|
|
198
260
|
/**
|
|
199
261
|
* Converts one OpenAI reusable prompt variable value to message content.
|
|
200
262
|
*
|
|
@@ -348,7 +410,6 @@ function openAIResponseImageContentPart (part) {
|
|
|
348
410
|
* Extracts a stable text marker from an OpenAI file content part.
|
|
349
411
|
*
|
|
350
412
|
* @param {{file_id?: string|null, file_url?: string, filename?: string, file_data?: string}} part
|
|
351
|
-
* @returns {string}
|
|
352
413
|
*/
|
|
353
414
|
function openAIResponseFileContentPart (part) {
|
|
354
415
|
return part.file_id ?? part.file_url ?? part.filename ?? FILE_FALLBACK
|
|
@@ -362,5 +423,7 @@ module.exports = {
|
|
|
362
423
|
convertOpenAIResponsePromptToMessages,
|
|
363
424
|
getResponsesInputMessages,
|
|
364
425
|
getResponsesOutputMessages,
|
|
426
|
+
getStreamedChatCompletionsOutputMessages,
|
|
427
|
+
getStreamedResponsesOutputMessages,
|
|
365
428
|
openAIResponseContentToMessageContent,
|
|
366
429
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const log = require('../../log')
|
|
4
|
+
|
|
3
5
|
const FILE_FALLBACK = '[file]'
|
|
4
6
|
const IMAGE_FALLBACK = '[image]'
|
|
5
7
|
|
|
@@ -9,20 +11,45 @@ const IMAGE_FALLBACK = '[image]'
|
|
|
9
11
|
*/
|
|
10
12
|
function stringifyIfNeeded (value) {
|
|
11
13
|
if (value == null) return value
|
|
12
|
-
|
|
14
|
+
if (typeof value === 'string') return value
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
return JSON.stringify(value)
|
|
18
|
+
} catch (error) {
|
|
19
|
+
log.debug('AIGuard: dropping an unserializable message field: %s', error.message)
|
|
20
|
+
}
|
|
13
21
|
}
|
|
14
22
|
|
|
15
23
|
/**
|
|
16
24
|
* @param {unknown} value
|
|
17
|
-
* @returns {string}
|
|
18
25
|
*/
|
|
19
26
|
function stringifyOrEmpty (value) {
|
|
20
27
|
return stringifyIfNeeded(value) ?? ''
|
|
21
28
|
}
|
|
22
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Runs `attempt`, returning its value. On failure, logs and returns `fallback` instead of
|
|
32
|
+
* throwing — this runs inside the caller's promise chain, so a bad payload must not break them.
|
|
33
|
+
*
|
|
34
|
+
* @template T
|
|
35
|
+
* @param {() => T} attempt
|
|
36
|
+
* @param {T} fallback
|
|
37
|
+
* @param {string} logMessage printf-style, with a single %s for the error message
|
|
38
|
+
* @returns {T}
|
|
39
|
+
*/
|
|
40
|
+
function decode (attempt, fallback, logMessage) {
|
|
41
|
+
try {
|
|
42
|
+
return attempt()
|
|
43
|
+
} catch (error) {
|
|
44
|
+
log.error(logMessage, error.message)
|
|
45
|
+
return fallback
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
23
49
|
module.exports = {
|
|
24
50
|
FILE_FALLBACK,
|
|
25
51
|
IMAGE_FALLBACK,
|
|
26
52
|
stringifyIfNeeded,
|
|
27
53
|
stringifyOrEmpty,
|
|
54
|
+
decode,
|
|
28
55
|
}
|
|
@@ -180,7 +180,32 @@ function buildOutputMessages (inputMessages, content) {
|
|
|
180
180
|
return []
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Converts Vercel stream chunks into the content shape a doGenerate result carries.
|
|
185
|
+
*
|
|
186
|
+
* @param {Array<object>} chunks
|
|
187
|
+
* @returns {Array<object>}
|
|
188
|
+
*/
|
|
189
|
+
function getStreamedContent (chunks) {
|
|
190
|
+
const toolCalls = []
|
|
191
|
+
let text = ''
|
|
192
|
+
|
|
193
|
+
for (const chunk of chunks) {
|
|
194
|
+
if (chunk?.type === 'tool-call') {
|
|
195
|
+
toolCalls.push(chunk)
|
|
196
|
+
} else if (chunk?.type === 'text-delta') {
|
|
197
|
+
// AI SDK 6 renamed `textDelta` to `delta`; both shapes are supported. Coalesced with `??`
|
|
198
|
+
// because a missing delta must contribute nothing, not "undefined".
|
|
199
|
+
text += chunk.delta ?? chunk.textDelta ?? ''
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (toolCalls.length) return toolCalls
|
|
204
|
+
return text ? [{ type: 'text', text }] : []
|
|
205
|
+
}
|
|
206
|
+
|
|
183
207
|
module.exports = {
|
|
208
|
+
getStreamedContent,
|
|
184
209
|
convertVercelPromptToMessages,
|
|
185
210
|
convertFilePartToImageUrl,
|
|
186
211
|
buildToolCallOutputMessages,
|
|
@@ -49,7 +49,6 @@ function parsePath (path) {
|
|
|
49
49
|
* Reports whether a parsed path targets an allowed message string.
|
|
50
50
|
*
|
|
51
51
|
* @param {Array<{ name: string, index: number|undefined }>} segments
|
|
52
|
-
* @returns {boolean}
|
|
53
52
|
*/
|
|
54
53
|
function isRedactablePath (segments) {
|
|
55
54
|
const first = segments[0]
|
|
@@ -30,7 +30,7 @@ class AIGuard extends NoopAIGuard {
|
|
|
30
30
|
this.#tracer = tracer
|
|
31
31
|
this.#client = new AIGuardClient(config)
|
|
32
32
|
this.#reporter = new EvaluationReporter(config)
|
|
33
|
-
this.#redactionEnabled = config.
|
|
33
|
+
this.#redactionEnabled = config.aiguard.DD_AI_GUARD_REDACTION_ENABLED
|
|
34
34
|
this.#meta = { service: config.service, env: config.env }
|
|
35
35
|
this.#initialized = true
|
|
36
36
|
}
|
|
@@ -215,7 +215,6 @@ function compileRoute (route, parse, makeMatcher) {
|
|
|
215
215
|
* @param {number} g
|
|
216
216
|
* @param {Map<number, number>} groupParent
|
|
217
217
|
* @param {Set<number>} present
|
|
218
|
-
* @returns {boolean}
|
|
219
218
|
*/
|
|
220
219
|
function groupActive (g, groupParent, present) {
|
|
221
220
|
while (g !== 0) {
|
|
@@ -229,7 +228,6 @@ function groupActive (g, groupParent, present) {
|
|
|
229
228
|
* URL-encode chars outside the RFC-1103 static alphabet [A-Za-z0-9.-~_]. The 'u' flag iterates whole
|
|
230
229
|
* codepoints so surrogate pairs encode as correct multi-byte UTF-8.
|
|
231
230
|
* @param {string} str
|
|
232
|
-
* @returns {string}
|
|
233
231
|
*/
|
|
234
232
|
function encodeStaticSegment (str) {
|
|
235
233
|
return str.replaceAll(/[^A-Za-z0-9.\-~_]/gu, c => {
|
|
@@ -246,7 +244,6 @@ function encodeStaticSegment (str) {
|
|
|
246
244
|
/**
|
|
247
245
|
* URL-encode the 6 characters not allowed in a normalized param name (/?#+{}).
|
|
248
246
|
* @param {string} name
|
|
249
|
-
* @returns {string}
|
|
250
247
|
*/
|
|
251
248
|
function encodeParamName (name) {
|
|
252
249
|
return name.replaceAll(/[/?#+{}]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0'))
|
|
@@ -256,7 +253,6 @@ function encodeParamName (name) {
|
|
|
256
253
|
* Render the normalized route for a given set of present optional groups.
|
|
257
254
|
* @param {CompiledRoute} compiled
|
|
258
255
|
* @param {Set<number>} present
|
|
259
|
-
* @returns {string}
|
|
260
256
|
*/
|
|
261
257
|
function renderRoute (compiled, present) {
|
|
262
258
|
const { segments, groupParent } = compiled
|
|
@@ -367,7 +363,6 @@ function resolvePresence (compiled, params) {
|
|
|
367
363
|
* Stable bitmask key for a present-group set (group ids are small, route-local).
|
|
368
364
|
* @param {number[]} optionalGroups
|
|
369
365
|
* @param {Set<number>} present
|
|
370
|
-
* @returns {number}
|
|
371
366
|
*/
|
|
372
367
|
function presenceBitmask (optionalGroups, present) {
|
|
373
368
|
let mask = 0
|
|
@@ -122,7 +122,6 @@ function sampleRequest (req, res, record = false) {
|
|
|
122
122
|
*
|
|
123
123
|
* @param {string|undefined} route
|
|
124
124
|
* @param {boolean} record
|
|
125
|
-
* @returns {boolean}
|
|
126
125
|
*/
|
|
127
126
|
function isRoutelessRecord (route, record) {
|
|
128
127
|
return record && route === undefined
|
|
@@ -130,7 +129,6 @@ function isRoutelessRecord (route, record) {
|
|
|
130
129
|
|
|
131
130
|
/**
|
|
132
131
|
* @param {number|string} statusCode
|
|
133
|
-
* @returns {boolean}
|
|
134
132
|
*/
|
|
135
133
|
function isNotFound (statusCode) {
|
|
136
134
|
return Number(statusCode) === 404
|
|
@@ -141,7 +139,6 @@ function isNotFound (statusCode) {
|
|
|
141
139
|
* @param {string|undefined} route A route string, an empty string (still a valid route), or
|
|
142
140
|
* `undefined`
|
|
143
141
|
* @param {number|string} statusCode
|
|
144
|
-
* @returns {string}
|
|
145
142
|
*/
|
|
146
143
|
function buildSamplingKey (method, route, statusCode) {
|
|
147
144
|
return method + (route ?? '') + statusCode
|
|
@@ -176,7 +173,6 @@ function getRouteOrEndpoint (context, statusCode) {
|
|
|
176
173
|
* regardless of the APM sampling decision.
|
|
177
174
|
*
|
|
178
175
|
* @param {DatadogSpan} rootSpan
|
|
179
|
-
* @returns {boolean}
|
|
180
176
|
*/
|
|
181
177
|
function isRejected (rootSpan) {
|
|
182
178
|
if (asmStandaloneEnabled) return false
|
|
@@ -204,9 +204,9 @@ function handleResults (actions, req, res, rootSpan, abortController) {
|
|
|
204
204
|
* @param {import('../../config/config-base')} [config] - Tracer configuration
|
|
205
205
|
*/
|
|
206
206
|
function setTemplates (config) {
|
|
207
|
-
templates.html.body = config?.appsec?.
|
|
208
|
-
templates.json.body = config?.appsec?.
|
|
209
|
-
templates.graphqlJson.body = config?.appsec?.
|
|
207
|
+
templates.html.body = config?.appsec?.DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML
|
|
208
|
+
templates.json.body = config?.appsec?.DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
|
|
209
|
+
templates.graphqlJson.body = config?.appsec?.DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON
|
|
210
210
|
|
|
211
211
|
for (const type of Object.keys(templates)) {
|
|
212
212
|
const template = templates[type]
|
|
@@ -102,7 +102,6 @@ function recordResponseBodyIgnored (req, tag) {
|
|
|
102
102
|
/**
|
|
103
103
|
* @param {import('http').IncomingMessage} originatingReq inbound request (for metrics).
|
|
104
104
|
* @param {import('http').IncomingMessage} res downstream response.
|
|
105
|
-
* @returns {boolean} whether downstream response body should be collected for AppSec.
|
|
106
105
|
*/
|
|
107
106
|
function evaluateResponseBodyCollection (originatingReq, res) {
|
|
108
107
|
const maxBytes = config.appsec.DD_API_SECURITY_MAX_DOWNSTREAM_BODY_BYTES
|
|
@@ -131,7 +130,6 @@ function evaluateResponseBodyCollection (originatingReq, res) {
|
|
|
131
130
|
* Probabilistic gate for downstream response body capture (rate + per-request cap).
|
|
132
131
|
* Only used from {@link planResponseBodyCollection}; does not increment {@link bodyAnalysisCount}.
|
|
133
132
|
* @param {import('http').IncomingMessage} req originating server request.
|
|
134
|
-
* @returns {boolean}
|
|
135
133
|
*/
|
|
136
134
|
function shouldSampleBody (req) {
|
|
137
135
|
globalRequestCounter = (globalRequestCounter + 1n) & UINT64_MAX
|
|
@@ -150,7 +148,6 @@ function shouldSampleBody (req) {
|
|
|
150
148
|
|
|
151
149
|
/**
|
|
152
150
|
* @param {import('http').IncomingMessage} res downstream HTTP response.
|
|
153
|
-
* @returns {boolean}
|
|
154
151
|
*/
|
|
155
152
|
function isRedirectResponse (res) {
|
|
156
153
|
const location = res.headers?.location || ''
|
|
@@ -271,7 +268,6 @@ function incrementDownstreamAnalysisCount (req) {
|
|
|
271
268
|
/**
|
|
272
269
|
* Returns the HTTP method to use for a downstream request, defaulting to GET.
|
|
273
270
|
* @param {string} method method supplied in the outgoing request options.
|
|
274
|
-
* @returns {string} validated HTTP method.
|
|
275
271
|
*/
|
|
276
272
|
function getMethod (method) {
|
|
277
273
|
return typeof method === 'string' && method ? method : 'GET'
|
|
@@ -351,6 +347,7 @@ module.exports = {
|
|
|
351
347
|
disable,
|
|
352
348
|
planResponseBodyCollection,
|
|
353
349
|
incrementDownstreamAnalysisCount,
|
|
350
|
+
extractMimeType,
|
|
354
351
|
extractRequestData,
|
|
355
352
|
extractResponseData,
|
|
356
353
|
}
|
|
@@ -31,7 +31,7 @@ let isEnabled = false
|
|
|
31
31
|
function enable (config, _tracer) {
|
|
32
32
|
if (isEnabled) return
|
|
33
33
|
|
|
34
|
-
iastTelemetry.configure(config, config.iast?.
|
|
34
|
+
iastTelemetry.configure(config, config.iast?.DD_IAST_TELEMETRY_VERBOSITY)
|
|
35
35
|
enableFsPlugin(IAST_MODULE)
|
|
36
36
|
enableAllAnalyzers(config)
|
|
37
37
|
enableTaintTracking(config.iast, iastTelemetry.verbosity)
|
|
@@ -73,7 +73,7 @@ const OPERATIONS = {
|
|
|
73
73
|
},
|
|
74
74
|
name: REPORT_VULNERABILITY,
|
|
75
75
|
initialTokenBucketSize () {
|
|
76
|
-
return typeof config.
|
|
76
|
+
return typeof config.DD_IAST_MAX_CONTEXT_OPERATIONS === 'number' ? config.DD_IAST_MAX_CONTEXT_OPERATIONS : 2
|
|
77
77
|
},
|
|
78
78
|
initContext: function (context) {
|
|
79
79
|
context.tokens[REPORT_VULNERABILITY] = this.initialTokenBucketSize()
|
|
@@ -146,8 +146,8 @@ function _resetGlobalContext () {
|
|
|
146
146
|
|
|
147
147
|
function acquireRequest (rootSpan) {
|
|
148
148
|
if (availableRequest > 0 && rootSpan) {
|
|
149
|
-
const sampling = config && typeof config.
|
|
150
|
-
? config.
|
|
149
|
+
const sampling = config && typeof config.DD_IAST_REQUEST_SAMPLING === 'number'
|
|
150
|
+
? config.DD_IAST_REQUEST_SAMPLING
|
|
151
151
|
: 30
|
|
152
152
|
if (rootSpan.context().toSpanId().slice(-2) <= sampling) {
|
|
153
153
|
availableRequest--
|
|
@@ -158,7 +158,7 @@ function acquireRequest (rootSpan) {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
function releaseRequest () {
|
|
161
|
-
if (availableRequest < config.
|
|
161
|
+
if (availableRequest < config.DD_IAST_MAX_CONCURRENT_REQUESTS) {
|
|
162
162
|
availableRequest++
|
|
163
163
|
}
|
|
164
164
|
}
|
|
@@ -174,7 +174,7 @@ function initializeRequestContext (iastContext) {
|
|
|
174
174
|
|
|
175
175
|
function configure (cfg) {
|
|
176
176
|
config = cfg
|
|
177
|
-
availableRequest = config.
|
|
177
|
+
availableRequest = config.DD_IAST_MAX_CONCURRENT_REQUESTS
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
function startGlobalContext () {
|
|
@@ -20,7 +20,7 @@ module.exports = {
|
|
|
20
20
|
kafkaContextPlugin.enable(config)
|
|
21
21
|
kafkaConsumerPlugin.enable(config)
|
|
22
22
|
|
|
23
|
-
setMaxTransactions(config.
|
|
23
|
+
setMaxTransactions(config.DD_IAST_MAX_CONCURRENT_REQUESTS)
|
|
24
24
|
},
|
|
25
25
|
disableTaintTracking () {
|
|
26
26
|
disableTaintOperations()
|
|
@@ -30,7 +30,7 @@ class TaintTrackingPlugin extends SourceIastPlugin {
|
|
|
30
30
|
configure (config) {
|
|
31
31
|
super.configure(config)
|
|
32
32
|
|
|
33
|
-
let rowsToTaint = this.iastConfig?.
|
|
33
|
+
let rowsToTaint = this.iastConfig?.DD_IAST_DB_ROWS_TO_TAINT
|
|
34
34
|
if (typeof rowsToTaint !== 'number') {
|
|
35
35
|
rowsToTaint = 1
|
|
36
36
|
}
|
|
@@ -97,7 +97,7 @@ function getPrepareStackTraceAccessor () {
|
|
|
97
97
|
|
|
98
98
|
function getCompileMethodFn (compileMethod) {
|
|
99
99
|
let delegate = function (content, filename) {
|
|
100
|
-
if (isDdTrace(filename) || !isPrivateModule(filename) || !config.iast?.
|
|
100
|
+
if (isDdTrace(filename) || !isPrivateModule(filename) || !config.iast?.DD_IAST_ENABLED) {
|
|
101
101
|
return compileMethod.apply(this, [content, filename])
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -163,7 +163,7 @@ function shimPrepareStackTrace () {
|
|
|
163
163
|
|
|
164
164
|
function enableRewriter (telemetryVerbosity) {
|
|
165
165
|
try {
|
|
166
|
-
if (config.iast?.
|
|
166
|
+
if (config.iast?.DD_IAST_ENABLED) {
|
|
167
167
|
const rewriter = getRewriter(telemetryVerbosity)
|
|
168
168
|
if (rewriter) {
|
|
169
169
|
shimPrepareStackTrace()
|
|
@@ -218,7 +218,7 @@ let enableEsmRewriter = function (telemetryVerbosity) {
|
|
|
218
218
|
telemetryVerbosity,
|
|
219
219
|
chainSourceMap: isFlagPresent('--enable-source-maps'),
|
|
220
220
|
orchestrionConfig,
|
|
221
|
-
iastEnabled: config?.iast?.
|
|
221
|
+
iastEnabled: config?.iast?.DD_IAST_ENABLED,
|
|
222
222
|
},
|
|
223
223
|
})
|
|
224
224
|
} catch (e) {
|