diff --git a/docs/GRAFANA_DASHBOARD_PROMPT.md b/docs/GRAFANA_DASHBOARD_PROMPT.md new file mode 100644 index 000000000..a05952d6c --- /dev/null +++ b/docs/GRAFANA_DASHBOARD_PROMPT.md @@ -0,0 +1,271 @@ +# Grafana Dashboard Generation Prompt + +Use this prompt with your Grafana agent to automatically generate dashboards based on the Four Golden Signals telemetry data collected from the CUA services. + +## Data Sources + +The metrics are exported to `otel.cua.ai` via OTLP and should be available in your Prometheus/Mimir data source. Traces go to Tempo, and you can correlate with Loki for logs. + +--- + +## Prompt for Grafana Agent + +``` +Create comprehensive Grafana dashboards for the CUA (Computer Use Agent) platform monitoring the Four Golden Signals: Latency, Traffic, Errors, and Saturation. + +## Services to Monitor + +There are three main services exporting OTEL metrics: + +1. **cua-docs** (Next.js documentation site with CopilotKit AI assistant) +2. **cua-mcp-server** (Python MCP server for computer control) +3. **cua-docs-indexer** (Modal-based documentation and code indexing service) + +## Metric Naming Conventions + +All metrics follow the pattern: `{service_prefix}.{signal_category}.{metric_name}` + +### CUA Docs (cua-docs) - Prefix: `cua.docs` + +**Latency Metrics (Histograms):** +- `cua.docs.request.duration` - HTTP request duration (ms), labels: method, route, status_code +- `cua.docs.copilot.response_time` - CopilotKit response time (ms), labels: category, question_type, response_type, has_code_snippet +- `cua.docs.tool.execution_time` - MCP tool execution time (ms), labels: tool_name, success + +**Traffic Metrics (Counters):** +- `cua.docs.requests.total` - Total HTTP requests, labels: method, route, status_code +- `cua.docs.copilot.messages.total` - CopilotKit messages processed, labels: category, question_type, response_type +- `cua.docs.tool.calls.total` - MCP tool calls, labels: tool_name, success + +**Error Metrics (Counters):** +- `cua.docs.errors.total` - Total errors, labels: method, route, error_type +- `cua.docs.copilot.errors.total` - CopilotKit errors, labels: category, error_type +- `cua.docs.tool.errors.total` - Tool errors, labels: tool_name, error_type + +**Saturation Metrics (Gauges):** +- `cua.docs.requests.concurrent` - Current concurrent requests +- `cua.docs.copilot.queue_depth` - CopilotKit message queue depth +- `cua.docs.memory.usage_bytes` - Memory usage in bytes + +### CUA MCP Server (cua-mcp-server) - Prefix: `cua.mcp_server` + +**Latency Metrics (Histograms):** +- `cua.mcp_server.tool.duration` - Tool execution duration (ms), labels: tool_name, success, session_id +- `cua.mcp_server.session.operation_duration` - Session operation duration (ms) +- `cua.mcp_server.task.duration` - CUA task duration (ms), labels: success, session_id, model_name + +**Traffic Metrics (Counters):** +- `cua.mcp_server.tool.calls_total` - Total tool calls, labels: tool_name, success +- `cua.mcp_server.sessions.created_total` - Sessions created +- `cua.mcp_server.tasks.total` - Total CUA tasks, labels: success, model_name +- `cua.mcp_server.messages.processed_total` - Messages processed + +**Error Metrics (Counters):** +- `cua.mcp_server.errors.total` - Total errors, labels: error_type, source +- `cua.mcp_server.tool.errors_total` - Tool errors, labels: tool_name, error_type +- `cua.mcp_server.session.errors_total` - Session errors, labels: session_id, error_type +- `cua.mcp_server.task.errors_total` - Task errors, labels: error_type, model_name + +**Saturation Metrics (UpDownCounters):** +- `cua.mcp_server.sessions.active` - Active sessions +- `cua.mcp_server.tasks.active` - Active tasks +- `cua.mcp_server.tool.concurrent` - Concurrent tool calls +- `cua.mcp_server.computer_pool.size` - Computer pool size + +### CUA Docs Indexer (cua-docs-indexer) - Prefix: `cua.indexer` + +**Latency Metrics (Histograms):** +- `cua.indexer.crawl.duration` - Documentation crawl duration (seconds), labels: job_type +- `cua.indexer.index.duration` - Index generation duration (seconds), labels: job_type, db_type, component +- `cua.indexer.query.duration` - MCP query duration (ms), labels: query_type, success, component + +**Traffic Metrics (Counters):** +- `cua.indexer.pages.crawled_total` - Pages crawled, labels: job_type +- `cua.indexer.chunks.indexed_total` - Chunks indexed, labels: job_type, db_type +- `cua.indexer.files.indexed_total` - Code files indexed, labels: job_type, component +- `cua.indexer.queries.total` - MCP queries, labels: query_type, success +- `cua.indexer.jobs.total` - Indexing jobs, labels: job_type, component + +**Error Metrics (Counters):** +- `cua.indexer.crawl.errors_total` - Crawl errors, labels: job_type +- `cua.indexer.index.errors_total` - Indexing errors, labels: job_type, component +- `cua.indexer.query.errors_total` - Query errors, labels: query_type, error_type + +**Saturation Metrics (UpDownCounters):** +- `cua.indexer.jobs.active` - Active indexing jobs +- `cua.indexer.component.queue_depth` - Components waiting to be indexed + +## Dashboard Requirements + +### Dashboard 1: CUA Platform Overview +Create an executive summary dashboard showing: +- **Row 1: Traffic Overview** + - Total requests across all services (stat panel) + - Requests per second by service (time series) + - CopilotKit messages per minute (time series) + +- **Row 2: Latency Overview** + - P50, P95, P99 latency by service (stat panels) + - Latency distribution heatmap (heatmap panel) + - CopilotKit response time trends (time series) + +- **Row 3: Error Rate Overview** + - Error rate percentage by service (gauge panels with thresholds: green <1%, yellow <5%, red >5%) + - Error timeline (time series with annotations) + - Top error types table + +- **Row 4: Saturation Overview** + - Active sessions/tasks gauge + - Concurrent requests over time + - Memory usage trend + +### Dashboard 2: CopilotKit AI Assistant Deep Dive +- **Row 1: Usage Metrics** + - Messages by category (pie chart) + - Questions by type (bar chart) + - Response types distribution (pie chart) + +- **Row 2: Performance** + - Response time by category (time series) + - Response time histogram + - P99 latency by question type + +- **Row 3: Quality Indicators** + - Code snippet inclusion rate + - Error rate by category + - Conversations with errors + +### Dashboard 3: MCP Server Operations +- **Row 1: Task Execution** + - Tasks per minute (time series) + - Task duration distribution (histogram) + - Active tasks gauge + +- **Row 2: Tool Usage** + - Tool calls by name (bar chart) + - Tool latency comparison (bar chart) + - Tool error rates (table) + +- **Row 3: Session Management** + - Active sessions over time + - Session creation rate + - Session errors + +### Dashboard 4: Indexing Pipeline Health +- **Row 1: Job Status** + - Active jobs indicator + - Last crawl status and duration + - Index generation timeline + +- **Row 2: Crawling Metrics** + - Pages crawled per run (stat) + - Crawl duration trend + - Crawl error rate + +- **Row 3: Code Indexing** + - Files indexed by component (bar chart) + - Index duration by component + - Failed tags count + +- **Row 4: Query Performance** + - Query latency by type (time series) + - Queries per minute + - Query error rate + +### Dashboard 5: SLI/SLO Tracking +Create SLO-focused dashboard with: +- Availability: % of requests without 5xx errors (target: 99.9%) +- Latency: % of requests under 500ms (target: 95%) +- Error Budget: remaining error budget for the month +- Burn rate alerts + +## Alert Rules to Create + +1. **High Error Rate**: Error rate > 5% for 5 minutes +2. **High Latency**: P99 latency > 2s for 5 minutes +3. **Saturation Warning**: Concurrent requests > 80% of limit +4. **Indexing Job Failure**: Job fails or takes > 2x average duration +5. **CopilotKit Degradation**: Response time P95 > 10s + +## Panel Configuration Notes + +- Use `$__rate_interval` for rate calculations +- Set appropriate panel decimals (2 for latency, 0 for counts) +- Include "No Data" states for all panels +- Use consistent color schemes: + - Green: success/good + - Yellow: warning + - Red: error/critical + - Blue: informational +- Add links between dashboards for drill-down + +## Variables to Create + +- `$service`: Multi-select for service names +- `$environment`: Environment filter (production, staging) +- `$time_range`: Standard Grafana time range +- `$component`: Component filter for code indexing metrics + +## Data Source Configuration + +- Prometheus/Mimir: For OTEL metrics +- Tempo: For distributed traces (correlate with TraceID) +- Loki: For logs (correlate with service labels) + +Generate the dashboard JSON that can be imported directly into Grafana. +``` + +--- + +## Quick Setup Commands + +After generating the dashboards, you may need to: + +1. **Configure Prometheus Remote Write** to accept OTEL metrics at `otel.cua.ai` +2. **Set up Tempo** for trace correlation +3. **Configure alerting rules** in Grafana Alerting + +## Environment Variables + +Ensure these are set in your deployment: + +```bash +# For cua-docs (Next.js) +OTEL_EXPORTER_OTLP_ENDPOINT=https://otel.cua.ai + +# For cua-mcp-server (Python) +OTEL_EXPORTER_OTLP_ENDPOINT=https://otel.cua.ai +CUA_ENVIRONMENT=production + +# For Modal indexer +# (Uses hardcoded endpoint in modal_app.py) +``` + +## Verification + +To verify metrics are being exported correctly: + +1. Check the OTEL collector logs at `otel.cua.ai` +2. Query Prometheus for `cua_*` metrics +3. Look for service resources with `service.name` labels + +--- + +## Metric Examples for Testing Queries + +```promql +# Request rate by service +sum(rate(cua_docs_requests_total[5m])) by (service_name) + +# P99 CopilotKit response time +histogram_quantile(0.99, sum(rate(cua_docs_copilot_response_time_bucket[5m])) by (le)) + +# Error rate +sum(rate(cua_docs_errors_total[5m])) / sum(rate(cua_docs_requests_total[5m])) * 100 + +# Active sessions +cua_mcp_server_sessions_active + +# Indexing job duration +cua_indexer_crawl_duration_seconds +``` diff --git a/docs/next.config.mjs b/docs/next.config.mjs index a495960d7..f2d645005 100644 --- a/docs/next.config.mjs +++ b/docs/next.config.mjs @@ -5,7 +5,11 @@ const withMDX = createMDX(); /** @type {import('next').NextConfig} */ const config = { reactStrictMode: true, - serverExternalPackages: ['pino', 'pino-pretty', 'thread-stream'], + // Enable OpenTelemetry instrumentation + experimental: { + instrumentationHook: true, + }, + serverExternalPackages: ['pino', 'pino-pretty', 'thread-stream', '@opentelemetry/sdk-node', '@opentelemetry/auto-instrumentations-node'], trailingSlash: false, basePath: '/docs', assetPrefix: '/docs', diff --git a/docs/package.json b/docs/package.json index fa34dd225..67fe9c9c3 100644 --- a/docs/package.json +++ b/docs/package.json @@ -18,6 +18,15 @@ "@copilotkit/react-core": "1.50.1", "@copilotkit/react-ui": "1.50.1", "@copilotkit/runtime": "1.50.1", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.50.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.53.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.53.0", + "@opentelemetry/resources": "^1.26.0", + "@opentelemetry/sdk-metrics": "^1.26.0", + "@opentelemetry/sdk-node": "^0.53.0", + "@opentelemetry/sdk-trace-node": "^1.26.0", + "@opentelemetry/semantic-conventions": "^1.27.0", "fumadocs-core": "16.0.8", "fumadocs-mdx": "13.0.8", "fumadocs-ui": "16.0.8", diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 2585bd870..8162bef2f 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -25,7 +25,34 @@ importers: version: 1.50.1(@types/mdast@4.0.4)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(graphql@16.12.0)(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@4.1.12) '@copilotkit/runtime': specifier: 1.50.1 - version: 1.50.1(@anthropic-ai/sdk@0.71.2(zod@4.1.12))(@cfworker/json-schema@4.1.1)(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)))(@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.50.1(@anthropic-ai/sdk@0.71.2(zod@4.1.12))(@cfworker/json-schema@4.1.1)(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)))(@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 + '@opentelemetry/auto-instrumentations-node': + specifier: ^0.50.0 + version: 0.50.2(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': + specifier: ^0.53.0 + version: 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.53.0 + version: 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^1.26.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': + specifier: ^1.26.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': + specifier: ^0.53.0 + version: 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': + specifier: ^1.26.0 + version: 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': + specifier: ^1.27.0 + version: 1.39.0 fumadocs-core: specifier: 16.0.8 version: 16.0.8(@types/react@19.1.8)(lucide-react@0.525.0(react@19.2.0))(next@16.0.7(@opentelemetry/api@1.9.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -765,6 +792,15 @@ packages: resolution: {integrity: sha512-ZpJxMqB+Qfe3rp6uszCQoag4nSw42icURnBRfFYSOmTgEeOe4rD0vYlbA8spvCu2TlCesNTlEN9BLWtQqLxabA==} engines: {node: '>=18.0.0'} + '@grpc/grpc-js@1.14.3': + resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + '@headlessui/react@2.2.9': resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} engines: {node: '>=10'} @@ -943,6 +979,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@langchain/core@0.3.80': resolution: {integrity: sha512-vcJDV2vk1AlCwSh3aBm/urQ1ZrlXFFBocv11bz/NBUfLWD5/UDNMzwPdaAd2dKvNmTWa9FM2lirLU3+JCf4cRA==} engines: {node: '>=18'} @@ -1050,275 +1089,553 @@ packages: cpu: [x64] os: [win32] + '@opentelemetry/api-logs@0.53.0': + resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} + engines: {node: '>=14'} + '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@orama/orama@3.1.16': - resolution: {integrity: sha512-scSmQBD8eANlMUOglxHrN1JdSW8tDghsPuS83otqealBiIeMukCQMOf/wc0JJjDXomqwNdEQFLXLGHrU6PGxuA==} - engines: {node: '>= 20.0.0'} + '@opentelemetry/auto-instrumentations-node@0.50.2': + resolution: {integrity: sha512-l1JWvNp5gt5Fze8X68+zjzBqiviB5B8zeepsbfpFgdDxoCVjmixg8gcMt/AmqI9Qntw2qaeXah84V14fCbVuMg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.4.1 - '@pinojs/redact@0.4.0': - resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@opentelemetry/context-async-hooks@1.26.0': + resolution: {integrity: sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@posthog/core@1.3.0': - resolution: {integrity: sha512-hxLL8kZNHH098geedcxCz8y6xojkNYbmJEW+1vFXsmPcExyCXIUUJ/34X6xa9GcprKxd0Wsx3vfJQLQX4iVPhw==} + '@opentelemetry/context-async-hooks@1.30.1': + resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@posthog/core@1.9.1': - resolution: {integrity: sha512-kRb1ch2dhQjsAapZmu6V66551IF2LnCbc1rnrQqnR7ArooVyJN9KOPXre16AJ3ObJz2eTfuP7x25BMyS2Y5Exw==} + '@opentelemetry/core@1.26.0': + resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@protobuf-ts/protoc@2.11.1': - resolution: {integrity: sha512-mUZJaV0daGO6HUX90o/atzQ6A7bbN2RSuHtdwo8SSF2Qoe3zHwa4IHyCN1evftTeHfLmdz+45qo47sL+5P8nyg==} - hasBin: true + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@radix-ui/number@1.1.1': - resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + '@opentelemetry/exporter-logs-otlp-grpc@0.53.0': + resolution: {integrity: sha512-x5ygAQgWAQOI+UOhyV3z9eW7QU2dCfnfOuIBiyYmC2AWr74f6x/3JBnP27IAcEx6aihpqBYWKnpoUTztkVPAZw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@opentelemetry/exporter-logs-otlp-http@0.53.0': + resolution: {integrity: sha512-cSRKgD/n8rb+Yd+Cif6EnHEL/VZg1o8lEcEwFji1lwene6BdH51Zh3feAD9p2TyVoBKrl6Q9Zm2WltSp2k9gWQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + '@opentelemetry/exporter-logs-otlp-proto@0.53.0': + resolution: {integrity: sha512-jhEcVL1deeWNmTUP05UZMriZPSWUBcfg94ng7JuBb1q2NExgnADQFl1VQQ+xo62/JepK+MxQe4xAwlsDQFbISA==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.0.0 - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + '@opentelemetry/exporter-metrics-otlp-http@0.53.0': + resolution: {integrity: sha512-nvZtOk23pZOrTW10Za2WPd9pk4tWDvL6ALlHRFfInpcTjtOgCrv+fQDxpzosa5PeXvYeFFUO5aYCTnwiCX4Dzg==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + '@opentelemetry/exporter-trace-otlp-grpc@0.53.0': + resolution: {integrity: sha512-m6KSh6OBDwfDjpzPVbuJbMgMbkoZfpxYH2r262KckgX9cMYvooWXEKzlJYsNDC6ADr28A1rtRoUVRwNfIN4tUg==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.0.0 - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + '@opentelemetry/exporter-trace-otlp-http@0.53.0': + resolution: {integrity: sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.0.0 - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + '@opentelemetry/exporter-trace-otlp-proto@0.53.0': + resolution: {integrity: sha512-T/bdXslwRKj23S96qbvGtaYOdfyew3TjPEKOk5mHjkCmkVl1O9C/YMdejwSsdLdOq2YW30KjR9kVi0YMxZushQ==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@opentelemetry/api': ^1.0.0 - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + '@opentelemetry/exporter-zipkin@1.26.0': + resolution: {integrity: sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@opentelemetry/api': ^1.0.0 - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + '@opentelemetry/instrumentation-amqplib@0.42.0': + resolution: {integrity: sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + '@opentelemetry/instrumentation-aws-lambda@0.45.0': + resolution: {integrity: sha512-22ZnmYftKjFoiqC1k3tu2AVKiXSZv+ohuHWk4V4MdJpPuNkadY624aDkv5BmwDeavDxVFgqE9nGgDM9s3Q94mg==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + '@opentelemetry/instrumentation-aws-sdk@0.44.0': + resolution: {integrity: sha512-HIWFg4TDQsayceiikOnruMmyQ0SZYW6WiR+wknWwWVLHC3lHTCpAnqzp5V42ckArOdlwHZu2Jvq2GMSM4Myx3w==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-dropdown-menu@2.1.16': - resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + '@opentelemetry/instrumentation-bunyan@0.41.0': + resolution: {integrity: sha512-NoQS+gcwQ7pzb2PZFyra6bAxDAVXBMmpKxBblEuXJWirGrAksQllg9XTdmqhrwT/KxUYrbVca/lMams7e51ysg==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + '@opentelemetry/instrumentation-cassandra-driver@0.41.0': + resolution: {integrity: sha512-hvTNcC8qjCQEHZTLAlTmDptjsEGqCKpN+90hHH8Nn/GwilGr5TMSwGrlfstdJuZWyw8HAnRUed6bcjvmHHk2Xw==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + '@opentelemetry/instrumentation-connect@0.39.0': + resolution: {integrity: sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + '@opentelemetry/instrumentation-cucumber@0.9.0': + resolution: {integrity: sha512-4PQNFnIqnA2WM3ZHpr0xhZpHSqJ5xJ6ppTIzZC7wPqe+ZBpj41vG8B6ieqiPfq+im4QdqbYnzLb3rj48GDEN9g==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true + '@opentelemetry/api': ^1.0.0 - '@radix-ui/react-menu@2.1.16': - resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + '@opentelemetry/instrumentation-dataloader@0.12.0': + resolution: {integrity: sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-navigation-menu@1.2.14': - resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + '@opentelemetry/instrumentation-dns@0.39.0': + resolution: {integrity: sha512-+iPzvXqVdJa67QBuz2tuP0UI3LS1/cMMo6dS7360DDtOQX+sQzkiN+mo3Omn4T6ZRhkTDw6c7uwsHBcmL31+1g==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-popover@1.1.15': - resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + '@opentelemetry/instrumentation-express@0.43.0': + resolution: {integrity: sha512-bxTIlzn9qPXJgrhz8/Do5Q3jIlqfpoJrSUtVGqH+90eM1v2PkPHc+SdE+zSqe4q9Y1UQJosmZ4N4bm7Zj/++MA==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-popper@1.2.8': - resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + '@opentelemetry/instrumentation-fastify@0.40.0': + resolution: {integrity: sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + '@opentelemetry/instrumentation-fs@0.15.0': + resolution: {integrity: sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + '@opentelemetry/instrumentation-generic-pool@0.39.0': + resolution: {integrity: sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + '@opentelemetry/instrumentation-graphql@0.43.0': + resolution: {integrity: sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==} + engines: {node: '>=14'} peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + '@opentelemetry/api': ^1.3.0 - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + '@opentelemetry/instrumentation-grpc@0.53.0': + resolution: {integrity: sha512-Ss338T92yE1UCgr9zXSY3cPuaAy27uQw+wAC5IwsQKCXL5wwkiOgkd+2Ngksa9EGsgUEMwGeHi76bDdHFJ5Rrw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.41.0': + resolution: {integrity: sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.53.0': + resolution: {integrity: sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.43.0': + resolution: {integrity: sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.3.0': + resolution: {integrity: sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.40.0': + resolution: {integrity: sha512-6jka2jfX8+fqjEbCn6hKWHVWe++mHrIkLQtaJqUkBt3ZBs2xn1+y0khxiDS0v/mNb0bIKDJWwtpKFfsQDM1Geg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.43.0': + resolution: {integrity: sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.40.0': + resolution: {integrity: sha512-21xRwZsEdMPnROu/QsaOIODmzw59IYpGFmuC4aFWvMj6stA8+Ei1tX67nkarJttlNjoM94um0N4X26AD7ff54A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-memcached@0.39.0': + resolution: {integrity: sha512-WfwvKAZ9I1qILRP5EUd88HQjwAAL+trXpCpozjBi4U6a0A07gB3fZ5PFAxbXemSjF5tHk9KVoROnqHvQ+zzFSQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.47.0': + resolution: {integrity: sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.42.0': + resolution: {integrity: sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.41.0': + resolution: {integrity: sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.41.0': + resolution: {integrity: sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.40.0': + resolution: {integrity: sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-net@0.39.0': + resolution: {integrity: sha512-rixHoODfI/Cx1B0mH1BpxCT0bRSxktuBDrt9IvpT2KSEutK5hR0RsRdgdz/GKk+BQ4u+IG6godgMSGwNQCueEA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.45.1': + resolution: {integrity: sha512-GHUvPv7CQEK3RKHH3YAj6mjgJ3nZb6wRQS+t0yaRgKZzX2ggGsLN6OhRT04+IjqmMg9aIRUy1CzqwzgqAxjYbw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pino@0.42.0': + resolution: {integrity: sha512-SoX6FzucBfTuFNMZjdurJhcYWq2ve8/LkhmyVLUW31HpIB45RF1JNum0u4MkGisosDmXlK4njomcgUovShI+WA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis-4@0.42.1': + resolution: {integrity: sha512-xm17LJhDfQzQo4wkM/zFwh6wk3SNN/FBFGkscI9Kj4efrb/o5p8Z3yE6ldBPNdIZ6RAwg2p3DL7fvE3DuUDJWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.42.0': + resolution: {integrity: sha512-jZBoqve0rEC51q0HuhjtZVq1DtUvJHzEJ3YKGvzGar2MU1J4Yt5+pQAQYh1W4jSoDyKeaI4hyeUdWM5N0c2lqA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-restify@0.41.0': + resolution: {integrity: sha512-gKEo+X/wVKUBuD2WDDlF7SlDNBHMWjSQoLxFCsGqeKgHR0MGtwMel8uaDGg9LJ83nKqYy+7Vl/cDFxjba6H+/w==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-router@0.40.0': + resolution: {integrity: sha512-bRo4RaclGFiKtmv/N1D0MuzO7DuxbeqMkMCbPPng6mDwzpHAMpHz/K/IxJmF+H1Hi/NYXVjCKvHGClageLe9eA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-socket.io@0.42.0': + resolution: {integrity: sha512-xB5tdsBzuZyicQTO3hDzJIpHQ7V1BYJ6vWPWgl19gWZDBdjEGc3HOupjkd3BUJyDoDhbMEHGk2nNlkUU99EfkA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.14.0': + resolution: {integrity: sha512-ofq7pPhSqvRDvD2FVx3RIWPj76wj4QubfrbqJtEx0A+fWoaYxJOCIQ92tYJh28elAmjMmgF/XaYuJuBhBv5J3A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.6.0': + resolution: {integrity: sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation-winston@0.40.0': + resolution: {integrity: sha512-eMk2tKl86YJ8/yHvtDbyhrE35/R0InhO9zuHTflPx8T0+IvKVUhPV71MsJr32sImftqeOww92QHt4Jd+a5db4g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.53.0': + resolution: {integrity: sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.53.0': + resolution: {integrity: sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.53.0': + resolution: {integrity: sha512-F7RCN8VN+lzSa4fGjewit8Z5fEUpY/lmMVy5EWn2ZpbAabg3EE3sCLuTNfOiooNGnmvzimUPruoeqeko/5/TzQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-transformer@0.53.0': + resolution: {integrity: sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagation-utils@0.30.16': + resolution: {integrity: sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/propagator-aws-xray@1.26.2': + resolution: {integrity: sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-b3@1.26.0': + resolution: {integrity: sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-b3@1.30.1': + resolution: {integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@1.26.0': + resolution: {integrity: sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@1.30.1': + resolution: {integrity: sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} + + '@opentelemetry/resource-detector-alibaba-cloud@0.29.7': + resolution: {integrity: sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-aws@1.12.0': + resolution: {integrity: sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-azure@0.2.12': + resolution: {integrity: sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-container@0.4.4': + resolution: {integrity: sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-gcp@0.29.13': + resolution: {integrity: sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resources@1.26.0': + resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.53.0': + resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.26.0': + resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.30.1': + resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-node@0.53.0': + resolution: {integrity: sha512-0hsxfq3BKy05xGktwG8YdGdxV978++x40EAKyKr1CaHZRh8uqVlXnclnl7OMi9xLMJEcXUw7lGhiRlArFcovyg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.26.0': + resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@1.26.0': + resolution: {integrity: sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@1.30.1': + resolution: {integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.39.0': + resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + + '@orama/orama@3.1.16': + resolution: {integrity: sha512-scSmQBD8eANlMUOglxHrN1JdSW8tDghsPuS83otqealBiIeMukCQMOf/wc0JJjDXomqwNdEQFLXLGHrU6PGxuA==} + engines: {node: '>= 20.0.0'} + + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + + '@posthog/core@1.3.0': + resolution: {integrity: sha512-hxLL8kZNHH098geedcxCz8y6xojkNYbmJEW+1vFXsmPcExyCXIUUJ/34X6xa9GcprKxd0Wsx3vfJQLQX4iVPhw==} + + '@posthog/core@1.9.1': + resolution: {integrity: sha512-kRb1ch2dhQjsAapZmu6V66551IF2LnCbc1rnrQqnR7ArooVyJN9KOPXre16AJ3ObJz2eTfuP7x25BMyS2Y5Exw==} + + '@protobuf-ts/protoc@2.11.1': + resolution: {integrity: sha512-mUZJaV0daGO6HUX90o/atzQ6A7bbN2RSuHtdwo8SSF2Qoe3zHwa4IHyCN1evftTeHfLmdz+45qo47sL+5P8nyg==} + hasBin: true + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-accordion@1.2.12': + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1330,8 +1647,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.2.10': - resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1343,26 +1660,21 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} peerDependencies: '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': + '@types/react-dom': optional: true - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1374,21 +1686,17 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: '@types/react': '*' - '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1396,17 +1704,21 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: '@types/react': '*' + '@types/react-dom': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true + '@types/react-dom': + optional: true - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1414,8 +1726,253 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.14': + resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1682,6 +2239,15 @@ packages: '@tanstack/virtual-core@3.13.18': resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} + '@types/aws-lambda@8.10.143': + resolution: {integrity: sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==} + + '@types/bunyan@1.8.9': + resolution: {integrity: sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==} + + '@types/connect@3.4.36': + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -1808,9 +2374,15 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/memcached@2.2.10': + resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/mysql@2.15.26': + resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} @@ -1820,6 +2392,12 @@ packages: '@types/node@22.15.28': resolution: {integrity: sha512-I0okKVDmyKR281I0UIFV7EWAWRnR0gkuSKob5wVcByyyhr7Px/slhkQapcYX4u00ekzNWaS1gznKZnuzxwo4pw==} + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} @@ -1837,6 +2415,12 @@ packages: '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1898,6 +2482,11 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1908,6 +2497,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + agentkeepalive@4.6.0: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} @@ -1929,6 +2522,10 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1964,6 +2561,9 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + body-parser@1.20.4: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -2038,6 +2638,9 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} @@ -2050,6 +2653,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2395,6 +3002,9 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -2442,6 +3052,10 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -2659,6 +3273,18 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.4.0: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} @@ -2681,6 +3307,10 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -2812,6 +3442,10 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -2835,6 +3469,9 @@ packages: engines: {node: '>=16.x'} hasBin: true + import-in-the-middle@1.15.0: + resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2871,12 +3508,20 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-hexadecimal@1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} @@ -2890,6 +3535,10 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2917,6 +3566,9 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-schema-to-ts@3.1.1: resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} engines: {node: '>=16'} @@ -3051,6 +3703,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -3058,6 +3713,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -3440,6 +4098,9 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -3594,6 +4255,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -3603,6 +4267,17 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.11.0: + resolution: {integrity: sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3649,6 +4324,22 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + posthog-js@1.276.0: resolution: {integrity: sha512-FYZE1037LrAoKKeUU0pUL7u8WwNK2BVeg5TFApwquVPUdj9h7u5Z077A313hPN19Ar+7Y+VHxqYqdHc4VNsVgw==} peerDependencies: @@ -3699,6 +4390,10 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3918,13 +4613,26 @@ packages: remend@1.0.1: resolution: {integrity: sha512-152puVH0qMoRJQFnaMG+rVDdf01Jq/CaED+MBuXExurJgdbkLp0c3TIe4R12o28Klx8uyGsjvFNG05aFG69G9w==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -4010,6 +4718,9 @@ packages: shiki@3.21.0: resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -4059,12 +4770,20 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4098,6 +4817,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + tabbable@6.4.0: resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} @@ -4388,6 +5111,10 @@ packages: wonka@6.3.5: resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -4395,10 +5122,22 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + zod-to-json-schema@3.25.1: resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: @@ -4442,12 +5181,12 @@ snapshots: '@ag-ui/core': 0.0.42 '@ag-ui/proto': 0.0.42 - '@ag-ui/langgraph@0.0.20(@ag-ui/client@0.0.42)(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@ag-ui/langgraph@0.0.20(@ag-ui/client@0.0.42)(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@ag-ui/client': 0.0.42 '@ag-ui/core': 0.0.42 - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)) - '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)) + '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) partial-json: 0.1.7 rxjs: 7.8.1 transitivePeerDependencies: @@ -4636,17 +5375,17 @@ snapshots: - encoding - graphql - '@copilotkit/runtime@1.50.1(@anthropic-ai/sdk@0.71.2(zod@4.1.12))(@cfworker/json-schema@4.1.1)(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)))(@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@copilotkit/runtime@1.50.1(@anthropic-ai/sdk@0.71.2(zod@4.1.12))(@cfworker/json-schema@4.1.1)(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)))(@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@ag-ui/client': 0.0.42 '@ag-ui/core': 0.0.42 - '@ag-ui/langgraph': 0.0.20(@ag-ui/client@0.0.42)(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@ag-ui/langgraph': 0.0.20(@ag-ui/client@0.0.42)(@ag-ui/core@0.0.42)(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@copilotkit/shared': 1.50.1 '@copilotkitnext/agent': 0.0.33(@cfworker/json-schema@4.1.1)(hono@4.11.3) '@copilotkitnext/runtime': 0.0.33(openai@4.104.0(zod@4.1.12)) '@graphql-yoga/plugin-defer-stream': 3.18.0(graphql-yoga@5.18.0(graphql@16.12.0))(graphql@16.12.0) '@hono/node-server': 1.19.7(hono@4.11.3) - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)) + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)) '@scarf/scarf': 1.4.0 class-transformer: 0.5.1 class-validator: 0.14.3 @@ -4663,7 +5402,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@anthropic-ai/sdk': 0.71.2(zod@4.1.12) - '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@langchain/langgraph-sdk': 0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) openai: 4.104.0(zod@4.1.12) transitivePeerDependencies: - '@cfworker/json-schema' @@ -5060,6 +5799,18 @@ snapshots: '@repeaterjs/repeater': 3.0.6 tslib: 2.8.1 + '@grpc/grpc-js@1.14.3': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + '@headlessui/react@2.2.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -5183,161 +5934,855 @@ snapshots: dependencies: minipass: 7.1.2 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + + '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@types/json-schema': 7.0.15 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + optionalDependencies: + '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + '@lit-labs/react@2.1.3(@types/react@19.1.8)': + dependencies: + '@lit/react': 1.0.8(@types/react@19.1.8) + transitivePeerDependencies: + - '@types/react' + + '@lit-labs/ssr-dom-shim@1.5.0': {} + + '@lit/react@1.0.8(@types/react@19.1.8)': + dependencies: + '@types/react': 19.1.8 + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.0 + + '@lukeed/csprng@1.1.0': {} + + '@lukeed/uuid@2.0.1': + dependencies: + '@lukeed/csprng': 1.1.0 + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + acorn: 8.15.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.15.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + + '@modelcontextprotocol/sdk@1.25.2(@cfworker/json-schema@4.1.1)(hono@4.11.3)(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.7(hono@4.11.3) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 7.5.1(express@5.2.1) + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + optionalDependencies: + '@cfworker/json-schema': 4.1.1 + transitivePeerDependencies: + - hono + - supports-color + + '@next/env@16.0.7': {} + + '@next/swc-darwin-arm64@16.0.7': + optional: true + + '@next/swc-darwin-x64@16.0.7': + optional: true + + '@next/swc-linux-arm64-gnu@16.0.7': + optional: true + + '@next/swc-linux-arm64-musl@16.0.7': + optional: true + + '@next/swc-linux-x64-gnu@16.0.7': + optional: true + + '@next/swc-linux-x64-musl@16.0.7': + optional: true + + '@next/swc-win32-arm64-msvc@16.0.7': + optional: true + + '@next/swc-win32-x64-msvc@16.0.7': + optional: true + + '@opentelemetry/api-logs@0.53.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/auto-instrumentations-node@0.50.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-lambda': 0.45.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-sdk': 0.44.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-bunyan': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cassandra-driver': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cucumber': 0.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.12.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dns': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.15.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-grpc': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.3.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-memcached': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-net': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.45.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis-4': 0.42.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-restify': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-router': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-socket.io': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.14.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.6.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-winston': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-alibaba-cloud': 0.29.7(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-aws': 1.12.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-azure': 0.2.12(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-container': 0.4.4(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-gcp': 0.29.13(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - encoding + - supports-color + + '@opentelemetry/context-async-hooks@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-http@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-logs-otlp-proto@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-metrics-otlp-http@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-grpc@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/instrumentation-amqplib@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-lambda@0.45.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-aws-xray': 1.26.2(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/aws-lambda': 8.10.143 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-aws-sdk@0.44.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagation-utils': 0.30.16(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-bunyan@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@types/bunyan': 1.8.9 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cassandra-driver@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/connect': 3.4.36 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-cucumber@0.9.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.12.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dns@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.15.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-grpc@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.3.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-memcached@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/memcached': 2.2.10 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.47.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/mysql': 2.15.26 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-net@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.45.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pino@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis-4@0.42.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-restify@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-router@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-socket.io@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.14.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.6.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-winston@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.15.0 + require-in-the-middle: 7.5.2 + semver: 7.7.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + + '@opentelemetry/propagation-utils@0.30.16(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/propagator-aws-xray@1.26.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/propagator-b3@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@1.26.0(@opentelemetry/api@1.9.0)': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@jridgewell/resolve-uri@3.1.2': {} + '@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@jridgewell/set-array@1.2.1': {} + '@opentelemetry/redis-common@0.36.2': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@opentelemetry/resource-detector-alibaba-cloud@0.29.7(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 - '@jridgewell/trace-mapping@0.3.25': + '@opentelemetry/resource-detector-aws@1.12.0(@opentelemetry/api@1.9.0)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 - '@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12))': + '@opentelemetry/resource-detector-azure@0.2.12(@opentelemetry/api@1.9.0)': dependencies: - '@cfworker/json-schema': 4.1.1 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.21 - langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)) - mustache: 4.2.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 10.0.0 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - transitivePeerDependencies: - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - openai + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 - '@langchain/langgraph-sdk@0.1.10(@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@opentelemetry/resource-detector-container@0.4.4(@opentelemetry/api@1.9.0)': dependencies: - '@types/json-schema': 7.0.15 - p-queue: 6.6.2 - p-retry: 4.6.2 - uuid: 9.0.1 - optionalDependencies: - '@langchain/core': 0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 - '@lit-labs/react@2.1.3(@types/react@19.1.8)': + '@opentelemetry/resource-detector-gcp@0.29.13(@opentelemetry/api@1.9.0)': dependencies: - '@lit/react': 1.0.8(@types/react@19.1.8) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + gcp-metadata: 6.1.1 transitivePeerDependencies: - - '@types/react' - - '@lit-labs/ssr-dom-shim@1.5.0': {} + - encoding + - supports-color - '@lit/react@1.0.8(@types/react@19.1.8)': + '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': dependencies: - '@types/react': 19.1.8 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 - '@lit/reactive-element@2.1.2': + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': dependencies: - '@lit-labs/ssr-dom-shim': 1.5.0 - - '@lukeed/csprng@1.1.0': {} + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 - '@lukeed/uuid@2.0.1': + '@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0)': dependencies: - '@lukeed/csprng': 1.1.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) - '@mdx-js/mdx@3.1.1': + '@opentelemetry/sdk-metrics@1.26.0(@opentelemetry/api@1.9.0)': dependencies: - '@types/estree': 1.0.8 - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 - acorn: 8.15.0 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-util-scope: 1.0.0 - estree-walker: 3.0.3 - hast-util-to-jsx-runtime: 2.3.6 - markdown-extensions: 2.0.0 - recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.15.0) - recma-stringify: 1.0.0 - rehype-recma: 1.0.0 - remark-mdx: 3.1.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - source-map: 0.7.4 - unified: 11.0.5 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) - '@mermaid-js/parser@0.6.3': + '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)': dependencies: - langium: 3.3.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@modelcontextprotocol/sdk@1.25.2(@cfworker/json-schema@4.1.1)(hono@4.11.3)(zod@3.25.76)': + '@opentelemetry/sdk-node@0.53.0(@opentelemetry/api@1.9.0)': dependencies: - '@hono/node-server': 1.19.7(hono@4.11.3) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 7.5.1(express@5.2.1) - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - optionalDependencies: - '@cfworker/json-schema': 4.1.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - - hono - supports-color - '@next/env@16.0.7': {} - - '@next/swc-darwin-arm64@16.0.7': - optional: true - - '@next/swc-darwin-x64@16.0.7': - optional: true + '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 - '@next/swc-linux-arm64-gnu@16.0.7': - optional: true + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 - '@next/swc-linux-arm64-musl@16.0.7': - optional: true + '@opentelemetry/sdk-trace-node@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + semver: 7.7.3 - '@next/swc-linux-x64-gnu@16.0.7': - optional: true + '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + semver: 7.7.3 - '@next/swc-linux-x64-musl@16.0.7': - optional: true + '@opentelemetry/semantic-conventions@1.27.0': {} - '@next/swc-win32-arm64-msvc@16.0.7': - optional: true + '@opentelemetry/semantic-conventions@1.28.0': {} - '@next/swc-win32-x64-msvc@16.0.7': - optional: true + '@opentelemetry/semantic-conventions@1.39.0': {} - '@opentelemetry/api@1.9.0': {} + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@orama/orama@3.1.16': {} @@ -5351,6 +6796,29 @@ snapshots: '@protobuf-ts/protoc@2.11.1': {} + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -6014,6 +7482,16 @@ snapshots: '@tanstack/virtual-core@3.13.18': {} + '@types/aws-lambda@8.10.143': {} + + '@types/bunyan@1.8.9': + dependencies: + '@types/node': 22.15.28 + + '@types/connect@3.4.36': + dependencies: + '@types/node': 22.15.28 + '@types/d3-array@3.2.1': {} '@types/d3-axis@3.0.6': @@ -6165,8 +7643,16 @@ snapshots: '@types/mdx@2.0.13': {} + '@types/memcached@2.2.10': + dependencies: + '@types/node': 22.15.28 + '@types/ms@2.1.0': {} + '@types/mysql@2.15.26': + dependencies: + '@types/node': 22.15.28 + '@types/node-fetch@2.6.13': dependencies: '@types/node': 22.15.28 @@ -6180,6 +7666,16 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.6.1 + + '@types/pg@8.6.1': + dependencies: + '@types/node': 22.15.28 + pg-protocol: 1.11.0 + pg-types: 2.2.0 + '@types/prop-types@15.7.15': {} '@types/react-dom@19.1.6(@types/react@19.1.8)': @@ -6194,6 +7690,12 @@ snapshots: '@types/semver@7.7.1': {} + '@types/shimmer@1.2.0': {} + + '@types/tedious@4.0.14': + dependencies: + '@types/node': 22.15.28 + '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -6262,12 +7764,18 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 acorn@8.15.0: {} + agent-base@7.1.4: {} + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 @@ -6291,6 +7799,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-regex@5.0.1: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -6315,6 +7825,8 @@ snapshots: base64-js@1.5.1: {} + bignumber.js@9.3.1: {} + body-parser@1.20.4: dependencies: bytes: 3.1.2 @@ -6408,6 +7920,8 @@ snapshots: chownr@3.0.0: {} + cjs-module-lexer@1.4.3: {} + class-transformer@0.5.1: {} class-validator@0.14.3: @@ -6422,6 +7936,12 @@ snapshots: client-only@0.0.1: {} + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clsx@2.1.1: {} collapse-white-space@2.1.0: {} @@ -6744,6 +8264,8 @@ snapshots: ee-first@1.1.1: {} + emoji-regex@8.0.0: {} + encodeurl@2.0.0: {} end-of-stream@1.4.5: @@ -6844,6 +8366,8 @@ snapshots: '@esbuild/win32-ia32': 0.27.2 '@esbuild/win32-x64': 0.27.2 + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@5.0.0: {} @@ -7137,6 +8661,28 @@ snapshots: function-bind@1.1.2: {} + gaxios@6.7.1: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.1: + dependencies: + gaxios: 6.7.1 + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} get-intrinsic@1.3.0: @@ -7165,6 +8711,8 @@ snapshots: github-slugger@2.0.0: {} + google-logging-utils@0.0.2: {} + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -7396,6 +8944,13 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -7416,6 +8971,13 @@ snapshots: image-size@2.0.2: {} + import-in-the-middle@1.15.0: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + inherits@2.0.4: {} inline-style-parser@0.1.1: {} @@ -7444,10 +9006,16 @@ snapshots: is-buffer@2.0.5: {} + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + is-decimal@1.0.4: {} is-decimal@2.0.1: {} + is-fullwidth-code-point@3.0.0: {} + is-hexadecimal@1.0.4: {} is-hexadecimal@2.0.1: {} @@ -7456,6 +9024,8 @@ snapshots: is-promise@4.0.0: {} + is-stream@2.0.1: {} + isexe@2.0.0: {} jiti@2.4.2: {} @@ -7476,6 +9046,10 @@ snapshots: dependencies: argparse: 2.0.1 + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + json-schema-to-ts@3.1.1: dependencies: '@babel/runtime': 7.28.4 @@ -7507,7 +9081,7 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - langsmith@0.3.87(@opentelemetry/api@1.9.0)(openai@4.104.0(zod@4.1.12)): + langsmith@0.3.87(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(zod@4.1.12)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -7517,6 +9091,8 @@ snapshots: uuid: 10.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-proto': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) openai: 4.104.0(zod@4.1.12) layout-base@1.0.2: {} @@ -7588,10 +9164,14 @@ snapshots: lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} + lodash.get@4.4.2: {} lodash.merge@4.6.2: {} + long@5.3.2: {} + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -8359,6 +9939,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + module-details-from-path@1.0.4: {} + mri@1.2.0: {} ms@2.0.0: {} @@ -8501,12 +10083,26 @@ snapshots: path-key@3.1.1: {} + path-parse@1.0.7: {} + path-to-regexp@0.1.12: {} path-to-regexp@8.3.0: {} pathe@2.0.3: {} + pg-int8@1.0.1: {} + + pg-protocol@1.11.0: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + picocolors@1.1.1: {} picomatch@4.0.3: {} @@ -8580,6 +10176,16 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.1: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + posthog-js@1.276.0: dependencies: '@posthog/core': 1.3.0 @@ -8618,6 +10224,21 @@ snapshots: property-information@7.1.0: {} + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.15.28 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -8958,10 +10579,26 @@ snapshots: remend@1.0.1: {} + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + resolve-pkg-maps@1.0.0: {} + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + retry@0.13.1: {} robust-predicates@3.0.2: {} @@ -9123,6 +10760,8 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + shimmer@1.2.1: {} + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -9201,6 +10840,12 @@ snapshots: - micromark-util-types - supports-color + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -9210,6 +10855,10 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + strip-json-comments@3.1.1: {} style-to-js@1.1.17: @@ -9235,6 +10884,8 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + tabbable@6.4.0: {} tailwind-merge@3.3.1: {} @@ -9535,12 +11186,32 @@ snapshots: wonka@6.3.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrappy@1.0.2: {} xtend@4.0.2: {} + y18n@5.0.8: {} + yallist@5.0.0: {} + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 diff --git a/docs/scripts/modal_app.py b/docs/scripts/modal_app.py index ed6a24c23..901b5e2d3 100644 --- a/docs/scripts/modal_app.py +++ b/docs/scripts/modal_app.py @@ -45,6 +45,10 @@ "pandas>=2.0.0", "markdown-it-py>=3.0.0", "markitdown>=0.0.1", + # OpenTelemetry for Four Golden Signals + "opentelemetry-api>=1.25.0", + "opentelemetry-sdk>=1.25.0", + "opentelemetry-exporter-otlp-proto-http>=1.25.0", ) .run_commands("playwright install --with-deps chromium") ) @@ -59,6 +63,132 @@ CODE_REPO_PATH = f"{CODE_VOLUME_PATH}/repo" CODE_DB_PATH = f"{CODE_VOLUME_PATH}/code_db" +# OpenTelemetry Configuration +OTEL_ENDPOINT = "https://otel.cua.ai" +OTEL_SERVICE_NAME = "cua-docs-indexer" + + +def init_otel(service_name: str = OTEL_SERVICE_NAME): + """ + Initialize OpenTelemetry for Four Golden Signals monitoring. + + Args: + service_name: Name of the service for OTEL resource + """ + from opentelemetry import metrics + from opentelemetry.exporter.otlp.proto.http.metric_exporter import ( + OTLPMetricExporter, + ) + from opentelemetry.sdk.metrics import MeterProvider + from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader + from opentelemetry.sdk.resources import SERVICE_NAME, SERVICE_VERSION, Resource + + resource = Resource.create({ + SERVICE_NAME: service_name, + SERVICE_VERSION: "1.0.0", + "service.namespace": "cua", + "deployment.environment": "production", + }) + + metric_exporter = OTLPMetricExporter( + endpoint=f"{OTEL_ENDPOINT}/v1/metrics", + ) + metric_reader = PeriodicExportingMetricReader( + metric_exporter, + export_interval_millis=15000, + ) + meter_provider = MeterProvider(resource=resource, metric_readers=[metric_reader]) + metrics.set_meter_provider(meter_provider) + + return metrics.get_meter(service_name, "1.0.0") + + +class IndexerMetrics: + """Four Golden Signals metrics for the docs/code indexer services.""" + + def __init__(self, meter): + prefix = "cua.indexer" + + # LATENCY - Job duration histograms + self.crawl_duration = meter.create_histogram( + f"{prefix}.crawl.duration", + description="Duration of documentation crawl in seconds", + unit="s", + ) + self.index_duration = meter.create_histogram( + f"{prefix}.index.duration", + description="Duration of index generation in seconds", + unit="s", + ) + self.query_duration = meter.create_histogram( + f"{prefix}.query.duration", + description="Duration of MCP queries in milliseconds", + unit="ms", + ) + + # TRAFFIC - Operation counters + self.pages_crawled = meter.create_counter( + f"{prefix}.pages.crawled_total", + description="Total number of pages crawled", + ) + self.chunks_indexed = meter.create_counter( + f"{prefix}.chunks.indexed_total", + description="Total number of chunks indexed", + ) + self.files_indexed = meter.create_counter( + f"{prefix}.files.indexed_total", + description="Total number of code files indexed", + ) + self.queries_total = meter.create_counter( + f"{prefix}.queries.total", + description="Total number of MCP queries", + ) + self.jobs_total = meter.create_counter( + f"{prefix}.jobs.total", + description="Total number of indexing jobs", + ) + + # ERRORS - Error counters + self.crawl_errors = meter.create_counter( + f"{prefix}.crawl.errors_total", + description="Total number of crawl errors", + ) + self.index_errors = meter.create_counter( + f"{prefix}.index.errors_total", + description="Total number of indexing errors", + ) + self.query_errors = meter.create_counter( + f"{prefix}.query.errors_total", + description="Total number of query errors", + ) + + # SATURATION - Resource utilization + self.active_jobs = meter.create_up_down_counter( + f"{prefix}.jobs.active", + description="Number of active indexing jobs", + ) + self.component_queue_depth = meter.create_up_down_counter( + f"{prefix}.component.queue_depth", + description="Number of components waiting to be indexed", + ) + + +# Global metrics instance (initialized per-function) +_metrics: Optional[IndexerMetrics] = None + + +def get_indexer_metrics() -> Optional[IndexerMetrics]: + """Get or initialize the indexer metrics.""" + global _metrics + if _metrics is None: + try: + meter = init_otel() + _metrics = IndexerMetrics(meter) + except Exception as e: + print(f"Warning: Failed to initialize OTEL metrics: {e}") + return None + return _metrics + # ============================================================================= # Helper Functions @@ -122,12 +252,23 @@ async def crawl_docs(): """Crawl CUA documentation and save to volume""" import re import shutil + import time from urllib.parse import urljoin, urlparse from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig print("Starting documentation crawl...") + # OTEL: Initialize metrics and track job + metrics = get_indexer_metrics() + crawl_start_time = time.time() + crawl_success = True + crawl_error_type = None + + if metrics: + metrics.jobs_total.add(1, {"job_type": "crawl_docs"}) + metrics.active_jobs.add(1) + BASE_URL = "https://cua.ai" DOCS_URL = f"{BASE_URL}/docs" OUTPUT_DIR = Path(CRAWLED_DATA_PATH) @@ -316,6 +457,14 @@ def save_page(url: str, data: dict): # Commit changes to volume docs_volume.commit() + # OTEL: Record crawl metrics + if metrics: + crawl_duration = time.time() - crawl_start_time + metrics.crawl_duration.record(crawl_duration, {"job_type": "crawl_docs"}) + metrics.pages_crawled.add(len(all_data), {"job_type": "crawl_docs"}) + metrics.crawl_errors.add(len(failed_urls), {"job_type": "crawl_docs"}) + metrics.active_jobs.add(-1) + print(f"Crawl complete! Crawled {len(all_data)} pages") return summary @@ -407,6 +556,7 @@ async def generate_vector_db(): """Generate LanceDB vector database from crawled data""" import shutil import tempfile + import time import lancedb from lancedb.embeddings import get_registry @@ -414,6 +564,14 @@ async def generate_vector_db(): print("Generating LanceDB vector database...") + # OTEL: Initialize metrics and track job + metrics = get_indexer_metrics() + index_start_time = time.time() + + if metrics: + metrics.jobs_total.add(1, {"job_type": "generate_vector_db"}) + metrics.active_jobs.add(1) + CRAWLED_DIR = Path(CRAWLED_DATA_PATH) DB_DIR = Path(DB_PATH) DB_DIR.mkdir(parents=True, exist_ok=True) @@ -518,6 +676,13 @@ class DocsChunk(LanceModel): # Commit changes to volume docs_volume.commit() + # OTEL: Record indexing metrics + if metrics: + index_duration = time.time() - index_start_time + metrics.index_duration.record(index_duration, {"job_type": "generate_vector_db", "db_type": "lancedb"}) + metrics.chunks_indexed.add(len(all_chunks), {"job_type": "generate_vector_db", "db_type": "lancedb"}) + metrics.active_jobs.add(-1) + print(f"Vector database created with {len(all_chunks)} chunks") return {"chunks": len(all_chunks)} @@ -531,9 +696,18 @@ class DocsChunk(LanceModel): ) async def generate_sqlite_db(): """Generate SQLite FTS5 database from crawled data""" + import time print("Generating SQLite FTS5 database...") + # OTEL: Initialize metrics and track job + metrics = get_indexer_metrics() + index_start_time = time.time() + + if metrics: + metrics.jobs_total.add(1, {"job_type": "generate_sqlite_db"}) + metrics.active_jobs.add(1) + CRAWLED_DIR = Path(CRAWLED_DATA_PATH) DB_DIR = Path(DB_PATH) DB_DIR.mkdir(parents=True, exist_ok=True) @@ -641,6 +815,13 @@ async def generate_sqlite_db(): # Commit changes to volume docs_volume.commit() + # OTEL: Record indexing metrics + if metrics: + index_duration = time.time() - index_start_time + metrics.index_duration.record(index_duration, {"job_type": "generate_sqlite_db", "db_type": "sqlite"}) + metrics.chunks_indexed.add(inserted, {"job_type": "generate_sqlite_db", "db_type": "sqlite"}) + metrics.active_jobs.add(-1) + print(f"SQLite database created with {inserted} pages") return {"pages": inserted} @@ -711,6 +892,7 @@ def index_component(component: str, tags: list[str], repo_path: str) -> dict: import shutil import subprocess import tempfile + import time as time_module import lancedb from lancedb.embeddings import get_registry @@ -718,6 +900,14 @@ def index_component(component: str, tags: list[str], repo_path: str) -> dict: print(f"[{component}] Starting indexing of {len(tags)} tags...") + # OTEL: Initialize metrics and track job + metrics = get_indexer_metrics() + index_start_time = time_module.time() + + if metrics: + metrics.jobs_total.add(1, {"job_type": "index_component", "component": component}) + metrics.active_jobs.add(1) + DB_DIR = Path(CODE_DB_PATH) DB_DIR.mkdir(parents=True, exist_ok=True) @@ -883,6 +1073,14 @@ class CodeFile(LanceModel): del lance_table del lance_db + # OTEL: Record indexing metrics + if metrics: + index_duration = time_module.time() - index_start_time + metrics.index_duration.record(index_duration, {"job_type": "index_component", "component": component}) + metrics.files_indexed.add(total_files, {"job_type": "index_component", "component": component}) + metrics.index_errors.add(len(failed_tags), {"job_type": "index_component", "component": component}) + metrics.active_jobs.add(-1) + print(f"[{component}] Complete: {total_files} files, {total_embedded} embedded") return { "component": component, @@ -1638,6 +1836,9 @@ def get_code_sqlite_conn(): ) return _code_sqlite_conn + # OTEL: Initialize metrics for query tracking + query_metrics = get_indexer_metrics() + # =================== DOCUMENTATION QUERY TOOLS (READ-ONLY) =================== @mcp.tool() @@ -1678,10 +1879,28 @@ def query_docs_db(sql: str) -> list[dict]: Returns: List of dictionaries, one per row, with column names as keys """ - conn = get_sqlite_conn() - cursor = conn.cursor() - cursor.execute(sql) - return [dict(row) for row in cursor.fetchall()] + import time + start_time = time.perf_counter() + success = True + error_type = None + + try: + conn = get_sqlite_conn() + cursor = conn.cursor() + cursor.execute(sql) + return [dict(row) for row in cursor.fetchall()] + except Exception as e: + success = False + error_type = type(e).__name__ + raise + finally: + # OTEL: Record query metrics + if query_metrics: + duration_ms = (time.perf_counter() - start_time) * 1000 + query_metrics.query_duration.record(duration_ms, {"query_type": "docs_db", "success": str(success)}) + query_metrics.queries_total.add(1, {"query_type": "docs_db", "success": str(success)}) + if not success: + query_metrics.query_errors.add(1, {"query_type": "docs_db", "error_type": error_type or "unknown"}) @mcp.tool() def query_docs_vectors( @@ -1710,28 +1929,46 @@ def query_docs_vectors( Returns: List of matching documents with similarity scores (_distance field) """ - limit = min(max(1, limit), 100) - table = get_lance_table() + import time + start_time = time.perf_counter() + success = True + error_type = None - search = table.search(query).limit(limit) + try: + limit = min(max(1, limit), 100) + table = get_lance_table() - if where: - search = search.where(where) - if select: - search = search.select(select) + search = table.search(query).limit(limit) - results = search.to_list() + if where: + search = search.where(where) + if select: + search = search.select(select) - formatted = [] - for r in results: - result = {} - for key, value in r.items(): - if key == "vector": - continue - result[key] = value - formatted.append(result) + results = search.to_list() - return formatted + formatted = [] + for r in results: + result = {} + for key, value in r.items(): + if key == "vector": + continue + result[key] = value + formatted.append(result) + + return formatted + except Exception as e: + success = False + error_type = type(e).__name__ + raise + finally: + # OTEL: Record query metrics + if query_metrics: + duration_ms = (time.perf_counter() - start_time) * 1000 + query_metrics.query_duration.record(duration_ms, {"query_type": "docs_vectors", "success": str(success)}) + query_metrics.queries_total.add(1, {"query_type": "docs_vectors", "success": str(success)}) + if not success: + query_metrics.query_errors.add(1, {"query_type": "docs_vectors", "error_type": error_type or "unknown"}) # =================== CODE QUERY TOOLS (READ-ONLY) =================== @@ -1781,10 +2018,28 @@ def query_code_db(sql: str) -> list[dict]: Returns: List of dictionaries, one per row, with column names as keys """ - conn = get_code_sqlite_conn() - cursor = conn.cursor() - cursor.execute(sql) - return [dict(row) for row in cursor.fetchall()] + import time + start_time = time.perf_counter() + success = True + error_type = None + + try: + conn = get_code_sqlite_conn() + cursor = conn.cursor() + cursor.execute(sql) + return [dict(row) for row in cursor.fetchall()] + except Exception as e: + success = False + error_type = type(e).__name__ + raise + finally: + # OTEL: Record query metrics + if query_metrics: + duration_ms = (time.perf_counter() - start_time) * 1000 + query_metrics.query_duration.record(duration_ms, {"query_type": "code_db", "success": str(success)}) + query_metrics.queries_total.add(1, {"query_type": "code_db", "success": str(success)}) + if not success: + query_metrics.query_errors.add(1, {"query_type": "code_db", "error_type": error_type or "unknown"}) @mcp.tool() def query_code_vectors( @@ -1815,35 +2070,56 @@ def query_code_vectors( Returns: List of matching code files with similarity scores (_distance field) """ - limit = min(max(1, limit), 100) - table = get_code_lance_table() - - search = table.search(query).limit(limit) - - # Build where clause, adding component filter if specified - where_clauses = [] - if component: - where_clauses.append(f"component = '{component}'") - if where: - where_clauses.append(where) - - if where_clauses: - search = search.where(" AND ".join(where_clauses)) - if select: - search = search.select(select) - - results = search.to_list() - - formatted = [] - for r in results: - result = {} - for key, value in r.items(): - if key == "vector": - continue - result[key] = value - formatted.append(result) - - return formatted + import time + start_time = time.perf_counter() + success = True + error_type = None + + try: + limit = min(max(1, limit), 100) + table = get_code_lance_table() + + search = table.search(query).limit(limit) + + # Build where clause, adding component filter if specified + where_clauses = [] + if component: + where_clauses.append(f"component = '{component}'") + if where: + where_clauses.append(where) + + if where_clauses: + search = search.where(" AND ".join(where_clauses)) + if select: + search = search.select(select) + + results = search.to_list() + + formatted = [] + for r in results: + result = {} + for key, value in r.items(): + if key == "vector": + continue + result[key] = value + formatted.append(result) + + return formatted + except Exception as e: + success = False + error_type = type(e).__name__ + raise + finally: + # OTEL: Record query metrics + if query_metrics: + duration_ms = (time.perf_counter() - start_time) * 1000 + attrs = {"query_type": "code_vectors", "success": str(success)} + if component: + attrs["component"] = component + query_metrics.query_duration.record(duration_ms, attrs) + query_metrics.queries_total.add(1, attrs) + if not success: + query_metrics.query_errors.add(1, {"query_type": "code_vectors", "error_type": error_type or "unknown"}) # Create SSE app directly - endpoints at /sse (GET) and /messages (POST) from starlette.middleware import Middleware diff --git a/docs/src/app/api/copilotkit/route.ts b/docs/src/app/api/copilotkit/route.ts index 4124dd540..b5fd73885 100644 --- a/docs/src/app/api/copilotkit/route.ts +++ b/docs/src/app/api/copilotkit/route.ts @@ -7,6 +7,13 @@ import { BuiltInAgent, InMemoryAgentRunner } from '@copilotkit/runtime/v2'; import { randomUUID } from 'crypto'; import { NextRequest } from 'next/server'; import { PostHog } from 'posthog-node'; +import { + getMetrics, + recordCopilotInteraction, + recordToolExecution, + updateSaturation, + type CopilotAttributes, +} from '@/lib/otel'; const posthog = process.env.NEXT_PUBLIC_POSTHOG_API_KEY ? new PostHog(process.env.NEXT_PUBLIC_POSTHOG_API_KEY, { @@ -16,6 +23,10 @@ const posthog = process.env.NEXT_PUBLIC_POSTHOG_API_KEY }) : null; +// Concurrent request tracking for saturation metrics +let concurrentCopilotRequests = 0; +let copilotQueueDepth = 0; + // Prompt categorization types and helpers type PromptCategory = | 'installation' @@ -227,6 +238,13 @@ class AnthropicSafeBuiltInAgent extends BuiltInAgent { const latestUserMessage = userMessages[userMessages.length - 1]; const userPrompt = this.extractMessageContent(latestUserMessage); + // OTEL: Track request start time for latency measurement + const requestStartTime = performance.now(); + + // OTEL: Increment concurrent requests (saturation) + concurrentCopilotRequests++; + updateSaturation(concurrentCopilotRequests, copilotQueueDepth); + if (posthog && userPrompt) { posthog.capture({ distinctId: conversationId, @@ -252,9 +270,30 @@ class AnthropicSafeBuiltInAgent extends BuiltInAgent { if (responseSent) return; responseSent = true; + // OTEL: Calculate latency and decrement concurrent requests + const responseTimeMs = performance.now() - requestStartTime; + concurrentCopilotRequests = Math.max(0, concurrentCopilotRequests - 1); + updateSaturation(concurrentCopilotRequests, copilotQueueDepth); + const fullResponse = responseChunks.join(''); + const category = categorizePrompt(userPrompt); + const questionType = detectQuestionType(userPrompt); + const responseAnalysis = analyzeResponse(fullResponse); + + // OTEL: Record Four Golden Signals for successful response + recordCopilotInteraction( + { + category, + question_type: questionType, + response_type: responseAnalysis.response_type, + has_code_snippet: responseAnalysis.has_code_snippet, + conversation_id: conversationId, + }, + responseTimeMs, + false // not an error + ); + if (posthog && fullResponse) { - const responseAnalysis = analyzeResponse(fullResponse); posthog.capture({ distinctId: conversationId, event: 'copilot_response', @@ -262,8 +301,8 @@ class AnthropicSafeBuiltInAgent extends BuiltInAgent { prompt: userPrompt, response: fullResponse, // Prompt categorization - category: categorizePrompt(userPrompt), - question_type: detectQuestionType(userPrompt), + category, + question_type: questionType, topics: extractTopics(userPrompt), prompt_length: userPrompt.length, // Response analysis @@ -276,6 +315,8 @@ class AnthropicSafeBuiltInAgent extends BuiltInAgent { response_length: fullResponse.length, conversation_id: conversationId, timestamp: new Date().toISOString(), + // OTEL: Include latency for correlation + response_time_ms: responseTimeMs, }, }); await posthog.flush(); @@ -315,17 +356,43 @@ class AnthropicSafeBuiltInAgent extends BuiltInAgent { }, error: (err: any) => { console.error('[CopilotKit] Error:', err?.message || String(err), err?.stack); + + // OTEL: Calculate latency and decrement concurrent requests for error case + const errorTimeMs = performance.now() - requestStartTime; + concurrentCopilotRequests = Math.max(0, concurrentCopilotRequests - 1); + updateSaturation(concurrentCopilotRequests, copilotQueueDepth); + + const category = categorizePrompt(userPrompt); + const questionType = detectQuestionType(userPrompt); + const errorType = err?.code || err?.name || 'unknown_error'; + + // OTEL: Record Four Golden Signals for error + recordCopilotInteraction( + { + category, + question_type: questionType, + response_type: 'error', + has_code_snippet: false, + conversation_id: conversationId, + }, + errorTimeMs, + true, // is error + errorType + ); + if (posthog) { posthog.capture({ distinctId: conversationId, event: 'copilot_error', properties: { error: err?.message || String(err), + error_type: errorType, prompt: userPrompt, - category: categorizePrompt(userPrompt), - question_type: detectQuestionType(userPrompt), + category, + question_type: questionType, conversation_id: conversationId, timestamp: new Date().toISOString(), + response_time_ms: errorTimeMs, }, }); posthog.flush(); diff --git a/docs/src/instrumentation.ts b/docs/src/instrumentation.ts new file mode 100644 index 000000000..13f72fd86 --- /dev/null +++ b/docs/src/instrumentation.ts @@ -0,0 +1,25 @@ +/** + * Next.js Instrumentation Entry Point + * + * This file is automatically loaded by Next.js to set up instrumentation. + * It initializes OpenTelemetry for the Four Golden Signals monitoring. + * + * @see https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation + */ + +export async function register() { + // Only run on server-side + if (process.env.NEXT_RUNTIME === 'nodejs') { + // Dynamically import to avoid issues with edge runtime + const { initializeOtel } = await import('./lib/otel/instrumentation'); + const { initializeMetrics } = await import('./lib/otel'); + + // Initialize OpenTelemetry SDK + initializeOtel(); + + // Initialize Four Golden Signals metrics + initializeMetrics(); + + console.log('[OTEL] OpenTelemetry instrumentation registered for cua-docs'); + } +} diff --git a/docs/src/lib/otel/index.ts b/docs/src/lib/otel/index.ts new file mode 100644 index 000000000..865e23555 --- /dev/null +++ b/docs/src/lib/otel/index.ts @@ -0,0 +1,324 @@ +/** + * OpenTelemetry instrumentation for CUA Docs + * Exports the Four Golden Signals: Latency, Traffic, Errors, Saturation + * + * Exporter endpoint: otel.cua.ai + */ + +import { + Counter, + Histogram, + Gauge, + metrics, + ValueType, +} from '@opentelemetry/api'; + +// OTEL Configuration +const OTEL_SERVICE_NAME = 'cua-docs'; +const OTEL_SERVICE_VERSION = '1.0.0'; + +// Metric names following OpenTelemetry semantic conventions +const METRIC_PREFIX = 'cua.docs'; + +/** + * Four Golden Signals metrics for the CUA Docs service + */ +export interface GoldenSignalsMetrics { + // LATENCY - Request duration histograms + requestDuration: Histogram; + copilotResponseTime: Histogram; + toolExecutionTime: Histogram; + + // TRAFFIC - Request counters + requestsTotal: Counter; + copilotMessagesTotal: Counter; + toolCallsTotal: Counter; + activeConnections: Gauge; + + // ERRORS - Error counters + errorsTotal: Counter; + copilotErrorsTotal: Counter; + toolErrorsTotal: Counter; + + // SATURATION - Resource utilization gauges + concurrentRequests: Gauge; + copilotQueueDepth: Gauge; + memoryUsageBytes: Gauge; +} + +let metricsInstance: GoldenSignalsMetrics | null = null; +let meterInitialized = false; + +/** + * Initialize OpenTelemetry metrics for the Four Golden Signals + */ +export function initializeMetrics(): GoldenSignalsMetrics { + if (metricsInstance) { + return metricsInstance; + } + + const meter = metrics.getMeter(OTEL_SERVICE_NAME, OTEL_SERVICE_VERSION); + + metricsInstance = { + // ============================================ + // LATENCY - Time to service requests + // ============================================ + + // Overall HTTP request duration + requestDuration: meter.createHistogram(`${METRIC_PREFIX}.request.duration`, { + description: 'Duration of HTTP requests in milliseconds', + unit: 'ms', + valueType: ValueType.DOUBLE, + }), + + // CopilotKit response time (including LLM inference) + copilotResponseTime: meter.createHistogram(`${METRIC_PREFIX}.copilot.response_time`, { + description: 'Time to generate CopilotKit responses in milliseconds', + unit: 'ms', + valueType: ValueType.DOUBLE, + }), + + // MCP tool execution time + toolExecutionTime: meter.createHistogram(`${METRIC_PREFIX}.tool.execution_time`, { + description: 'Duration of MCP tool executions in milliseconds', + unit: 'ms', + valueType: ValueType.DOUBLE, + }), + + // ============================================ + // TRAFFIC - Request volume + // ============================================ + + // Total HTTP requests + requestsTotal: meter.createCounter(`${METRIC_PREFIX}.requests.total`, { + description: 'Total number of HTTP requests', + valueType: ValueType.INT, + }), + + // CopilotKit messages processed + copilotMessagesTotal: meter.createCounter(`${METRIC_PREFIX}.copilot.messages.total`, { + description: 'Total number of CopilotKit messages processed', + valueType: ValueType.INT, + }), + + // MCP tool calls + toolCallsTotal: meter.createCounter(`${METRIC_PREFIX}.tool.calls.total`, { + description: 'Total number of MCP tool calls', + valueType: ValueType.INT, + }), + + // Active WebSocket/SSE connections + activeConnections: meter.createGauge(`${METRIC_PREFIX}.connections.active`, { + description: 'Number of active connections', + valueType: ValueType.INT, + }), + + // ============================================ + // ERRORS - Failure rates + // ============================================ + + // Total errors + errorsTotal: meter.createCounter(`${METRIC_PREFIX}.errors.total`, { + description: 'Total number of errors', + valueType: ValueType.INT, + }), + + // CopilotKit-specific errors + copilotErrorsTotal: meter.createCounter(`${METRIC_PREFIX}.copilot.errors.total`, { + description: 'Total number of CopilotKit errors', + valueType: ValueType.INT, + }), + + // Tool execution errors + toolErrorsTotal: meter.createCounter(`${METRIC_PREFIX}.tool.errors.total`, { + description: 'Total number of tool execution errors', + valueType: ValueType.INT, + }), + + // ============================================ + // SATURATION - Resource utilization + // ============================================ + + // Concurrent requests being processed + concurrentRequests: meter.createGauge(`${METRIC_PREFIX}.requests.concurrent`, { + description: 'Number of requests currently being processed', + valueType: ValueType.INT, + }), + + // CopilotKit message queue depth + copilotQueueDepth: meter.createGauge(`${METRIC_PREFIX}.copilot.queue_depth`, { + description: 'Number of CopilotKit messages waiting to be processed', + valueType: ValueType.INT, + }), + + // Memory usage + memoryUsageBytes: meter.createGauge(`${METRIC_PREFIX}.memory.usage_bytes`, { + description: 'Current memory usage in bytes', + unit: 'By', + valueType: ValueType.INT, + }), + }; + + meterInitialized = true; + return metricsInstance; +} + +/** + * Get the metrics instance (initializes if needed) + */ +export function getMetrics(): GoldenSignalsMetrics { + return metricsInstance || initializeMetrics(); +} + +// Attribute types for consistent labeling +export interface RequestAttributes { + method: string; + route: string; + status_code: number; +} + +export interface CopilotAttributes { + category: string; + question_type: string; + response_type: string; + has_code_snippet: boolean; + conversation_id: string; +} + +export interface ToolAttributes { + tool_name: string; + success: boolean; + error_type?: string; +} + +/** + * Record a request with all four golden signals + */ +export function recordRequest( + attributes: RequestAttributes, + durationMs: number, + isError: boolean = false +): void { + const m = getMetrics(); + const labels = { + method: attributes.method, + route: attributes.route, + status_code: String(attributes.status_code), + }; + + // Latency + m.requestDuration.record(durationMs, labels); + + // Traffic + m.requestsTotal.add(1, labels); + + // Errors + if (isError) { + m.errorsTotal.add(1, { + ...labels, + error_type: attributes.status_code >= 500 ? 'server_error' : 'client_error', + }); + } +} + +/** + * Record a CopilotKit interaction with all four golden signals + */ +export function recordCopilotInteraction( + attributes: CopilotAttributes, + responseTimeMs: number, + isError: boolean = false, + errorType?: string +): void { + const m = getMetrics(); + const labels = { + category: attributes.category, + question_type: attributes.question_type, + response_type: attributes.response_type, + has_code_snippet: String(attributes.has_code_snippet), + }; + + // Latency + m.copilotResponseTime.record(responseTimeMs, labels); + + // Traffic + m.copilotMessagesTotal.add(1, labels); + + // Errors + if (isError) { + m.copilotErrorsTotal.add(1, { + ...labels, + error_type: errorType || 'unknown', + }); + } +} + +/** + * Record a tool execution with all four golden signals + */ +export function recordToolExecution( + attributes: ToolAttributes, + durationMs: number +): void { + const m = getMetrics(); + const labels = { + tool_name: attributes.tool_name, + success: String(attributes.success), + }; + + // Latency + m.toolExecutionTime.record(durationMs, labels); + + // Traffic + m.toolCallsTotal.add(1, labels); + + // Errors + if (!attributes.success) { + m.toolErrorsTotal.add(1, { + ...labels, + error_type: attributes.error_type || 'unknown', + }); + } +} + +/** + * Update saturation metrics + */ +export function updateSaturation( + concurrentRequests: number, + queueDepth: number = 0 +): void { + const m = getMetrics(); + m.concurrentRequests.record(concurrentRequests); + m.copilotQueueDepth.record(queueDepth); + + // Record memory usage if available + if (typeof process !== 'undefined' && process.memoryUsage) { + const memUsage = process.memoryUsage(); + m.memoryUsageBytes.record(memUsage.heapUsed); + } +} + +/** + * Helper to create a timed operation that records latency + */ +export async function withTiming( + operation: () => Promise, + recordFn: (durationMs: number, error?: Error) => void +): Promise { + const startTime = performance.now(); + let error: Error | undefined; + + try { + return await operation(); + } catch (e) { + error = e instanceof Error ? e : new Error(String(e)); + throw e; + } finally { + const durationMs = performance.now() - startTime; + recordFn(durationMs, error); + } +} + +// Export types +export type { GoldenSignalsMetrics }; diff --git a/docs/src/lib/otel/instrumentation.ts b/docs/src/lib/otel/instrumentation.ts new file mode 100644 index 000000000..b52e16af1 --- /dev/null +++ b/docs/src/lib/otel/instrumentation.ts @@ -0,0 +1,122 @@ +/** + * OpenTelemetry SDK Configuration for CUA Docs + * This file sets up the OTLP exporter to otel.cua.ai + * + * Import this file early in your application to initialize tracing and metrics. + */ + +import { NodeSDK } from '@opentelemetry/sdk-node'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; +import { Resource } from '@opentelemetry/resources'; +import { + ATTR_SERVICE_NAME, + ATTR_SERVICE_VERSION, + ATTR_DEPLOYMENT_ENVIRONMENT, +} from '@opentelemetry/semantic-conventions'; +import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api'; +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'; + +// Configuration +const OTEL_ENDPOINT = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'https://otel.cua.ai'; +const SERVICE_NAME = 'cua-docs'; +const SERVICE_VERSION = process.env.npm_package_version || '1.0.0'; +const ENVIRONMENT = process.env.NODE_ENV || 'development'; + +// Enable diagnostic logging in development +if (ENVIRONMENT === 'development') { + diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); +} + +// Resource attributes describing this service +const resource = new Resource({ + [ATTR_SERVICE_NAME]: SERVICE_NAME, + [ATTR_SERVICE_VERSION]: SERVICE_VERSION, + [ATTR_DEPLOYMENT_ENVIRONMENT]: ENVIRONMENT, + 'service.namespace': 'cua', + 'service.instance.id': process.env.HOSTNAME || `${SERVICE_NAME}-${Date.now()}`, +}); + +// OTLP Trace Exporter +const traceExporter = new OTLPTraceExporter({ + url: `${OTEL_ENDPOINT}/v1/traces`, + headers: { + 'Content-Type': 'application/json', + }, +}); + +// OTLP Metrics Exporter with periodic export +const metricExporter = new OTLPMetricExporter({ + url: `${OTEL_ENDPOINT}/v1/metrics`, + headers: { + 'Content-Type': 'application/json', + }, +}); + +const metricReader = new PeriodicExportingMetricReader({ + exporter: metricExporter, + exportIntervalMillis: 15000, // Export every 15 seconds + exportTimeoutMillis: 10000, +}); + +// Initialize the SDK +let sdk: NodeSDK | null = null; + +export function initializeOtel(): NodeSDK { + if (sdk) { + return sdk; + } + + sdk = new NodeSDK({ + resource, + traceExporter, + metricReader, + instrumentations: [ + getNodeAutoInstrumentations({ + // Instrument HTTP for request tracing + '@opentelemetry/instrumentation-http': { + enabled: true, + ignoreIncomingPaths: ['/health', '/ready', '/_next'], + }, + // Instrument fetch for outbound calls + '@opentelemetry/instrumentation-fetch': { + enabled: true, + }, + // Disable noisy instrumentations + '@opentelemetry/instrumentation-fs': { + enabled: false, + }, + '@opentelemetry/instrumentation-dns': { + enabled: false, + }, + }), + ], + }); + + // Start the SDK + sdk.start(); + + // Graceful shutdown on process exit + const shutdown = async () => { + try { + await sdk?.shutdown(); + console.log('OpenTelemetry SDK shut down successfully'); + } catch (err) { + console.error('Error shutting down OpenTelemetry SDK:', err); + } + }; + + process.on('SIGTERM', shutdown); + process.on('SIGINT', shutdown); + + console.log(`OpenTelemetry initialized for ${SERVICE_NAME} -> ${OTEL_ENDPOINT}`); + return sdk; +} + +export function getOtelSdk(): NodeSDK | null { + return sdk; +} + +// Export for use in instrumentation.ts file (Next.js convention) +export { sdk }; diff --git a/libs/python/agent/agent/callbacks/__init__.py b/libs/python/agent/agent/callbacks/__init__.py index 8f02f775e..2104cac98 100644 --- a/libs/python/agent/agent/callbacks/__init__.py +++ b/libs/python/agent/agent/callbacks/__init__.py @@ -6,8 +6,8 @@ from .budget_manager import BudgetManagerCallback from .image_retention import ImageRetentionCallback from .logging import LoggingCallback -from .otel import OtelCallback, OtelErrorCallback from .operator_validator import OperatorNormalizerCallback +from .otel import OtelCallback, OtelErrorCallback from .prompt_instructions import PromptInstructionsCallback from .telemetry import TelemetryCallback from .trajectory_saver import TrajectorySaverCallback diff --git a/libs/python/computer-server/computer_server/handlers/macos.py b/libs/python/computer-server/computer_server/handlers/macos.py index c994e38e7..11bff6c32 100644 --- a/libs/python/computer-server/computer_server/handlers/macos.py +++ b/libs/python/computer-server/computer_server/handlers/macos.py @@ -73,7 +73,7 @@ # Trigger screen recording prompt on macOS try: - from PIL import ImageGrab, Image + from PIL import Image, ImageGrab ImageGrab.grab() except Exception as e: diff --git a/libs/python/computer-server/computer_server/mcp_server.py b/libs/python/computer-server/computer_server/mcp_server.py index ea7bbbcf1..7d92af5ad 100644 --- a/libs/python/computer-server/computer_server/mcp_server.py +++ b/libs/python/computer-server/computer_server/mcp_server.py @@ -140,9 +140,10 @@ async def computer_screenshot() -> Image: Returns the current screen state as an image. Always call this first to see what's on screen before performing any actions. """ - from PIL import Image as PILImage from io import BytesIO + from PIL import Image as PILImage + _, automation_handler, _, _, _, _ = _get_handlers() result = await automation_handler.screenshot() image_data = base64.b64decode(result["image_data"]) diff --git a/libs/python/core/core/telemetry/__init__.py b/libs/python/core/core/telemetry/__init__.py index 3b51c5c1a..cc763a141 100644 --- a/libs/python/core/core/telemetry/__init__.py +++ b/libs/python/core/core/telemetry/__init__.py @@ -4,12 +4,6 @@ operational metrics via OpenTelemetry, and error tracking via Sentry. """ -from core.telemetry.posthog import ( - destroy_telemetry_client, - is_telemetry_enabled, - record_event, -) - # OpenTelemetry instrumentation for Four Golden Signals from core.telemetry.otel import ( create_span, @@ -21,6 +15,11 @@ record_tokens, track_concurrent, ) +from core.telemetry.posthog import ( + destroy_telemetry_client, + is_telemetry_enabled, + record_event, +) # Sentry error tracking from core.telemetry.sentry import ( diff --git a/libs/python/mcp-server/mcp_server/otel.py b/libs/python/mcp-server/mcp_server/otel.py new file mode 100644 index 000000000..7feddd083 --- /dev/null +++ b/libs/python/mcp-server/mcp_server/otel.py @@ -0,0 +1,476 @@ +""" +OpenTelemetry instrumentation for CUA MCP Server +Exports the Four Golden Signals: Latency, Traffic, Errors, Saturation + +Exporter endpoint: otel.cua.ai +""" + +import logging +import os +import time +from contextlib import contextmanager +from dataclasses import dataclass, field +from functools import wraps +from typing import Any, Callable, Dict, Optional + +# OpenTelemetry imports +from opentelemetry import metrics, trace +from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter +from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter +from opentelemetry.metrics import Counter, Histogram, UpDownCounter +from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader +from opentelemetry.sdk.resources import SERVICE_NAME, SERVICE_VERSION, Resource +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +logger = logging.getLogger("mcp-server.otel") + +# Configuration +OTEL_ENDPOINT = os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT", "https://otel.cua.ai") +SERVICE_NAME_VALUE = "cua-mcp-server" +SERVICE_VERSION_VALUE = os.getenv("CUA_MCP_SERVER_VERSION", "0.1.16") +METRIC_PREFIX = "cua.mcp_server" + +# Global state +_initialized = False +_meter = None +_tracer = None + + +@dataclass +class GoldenSignalsMetrics: + """Container for the Four Golden Signals metrics.""" + + # LATENCY - Request duration histograms + tool_execution_duration: Histogram = None + session_operation_duration: Histogram = None + task_duration: Histogram = None + + # TRAFFIC - Request counters + tool_calls_total: Counter = None + sessions_created_total: Counter = None + tasks_total: Counter = None + messages_processed_total: Counter = None + + # ERRORS - Error counters + errors_total: Counter = None + tool_errors_total: Counter = None + session_errors_total: Counter = None + task_errors_total: Counter = None + + # SATURATION - Resource utilization gauges (UpDownCounter for concurrent tracking) + active_sessions: UpDownCounter = None + active_tasks: UpDownCounter = None + concurrent_tool_calls: UpDownCounter = None + computer_pool_size: UpDownCounter = None + + +_metrics: Optional[GoldenSignalsMetrics] = None + + +def initialize_otel() -> GoldenSignalsMetrics: + """ + Initialize OpenTelemetry SDK with OTLP exporters for the Four Golden Signals. + + Returns: + GoldenSignalsMetrics instance with all metrics initialized. + """ + global _initialized, _meter, _tracer, _metrics + + if _initialized and _metrics is not None: + return _metrics + + logger.info(f"Initializing OpenTelemetry for {SERVICE_NAME_VALUE} -> {OTEL_ENDPOINT}") + + # Create resource describing this service + resource = Resource.create({ + SERVICE_NAME: SERVICE_NAME_VALUE, + SERVICE_VERSION: SERVICE_VERSION_VALUE, + "service.namespace": "cua", + "deployment.environment": os.getenv("CUA_ENVIRONMENT", "production"), + }) + + # Set up tracing + trace_exporter = OTLPSpanExporter( + endpoint=f"{OTEL_ENDPOINT}/v1/traces", + ) + tracer_provider = TracerProvider(resource=resource) + tracer_provider.add_span_processor(BatchSpanProcessor(trace_exporter)) + trace.set_tracer_provider(tracer_provider) + _tracer = trace.get_tracer(SERVICE_NAME_VALUE, SERVICE_VERSION_VALUE) + + # Set up metrics + metric_exporter = OTLPMetricExporter( + endpoint=f"{OTEL_ENDPOINT}/v1/metrics", + ) + metric_reader = PeriodicExportingMetricReader( + metric_exporter, + export_interval_millis=15000, # Export every 15 seconds + ) + meter_provider = MeterProvider(resource=resource, metric_readers=[metric_reader]) + metrics.set_meter_provider(meter_provider) + _meter = metrics.get_meter(SERVICE_NAME_VALUE, SERVICE_VERSION_VALUE) + + # Initialize the Four Golden Signals metrics + _metrics = GoldenSignalsMetrics( + # ============================================ + # LATENCY - Time to service requests + # ============================================ + tool_execution_duration=_meter.create_histogram( + f"{METRIC_PREFIX}.tool.duration", + description="Duration of tool executions in milliseconds", + unit="ms", + ), + session_operation_duration=_meter.create_histogram( + f"{METRIC_PREFIX}.session.operation_duration", + description="Duration of session operations in milliseconds", + unit="ms", + ), + task_duration=_meter.create_histogram( + f"{METRIC_PREFIX}.task.duration", + description="Duration of CUA tasks in milliseconds", + unit="ms", + ), + + # ============================================ + # TRAFFIC - Request volume + # ============================================ + tool_calls_total=_meter.create_counter( + f"{METRIC_PREFIX}.tool.calls_total", + description="Total number of tool calls", + ), + sessions_created_total=_meter.create_counter( + f"{METRIC_PREFIX}.sessions.created_total", + description="Total number of sessions created", + ), + tasks_total=_meter.create_counter( + f"{METRIC_PREFIX}.tasks.total", + description="Total number of CUA tasks executed", + ), + messages_processed_total=_meter.create_counter( + f"{METRIC_PREFIX}.messages.processed_total", + description="Total number of messages processed", + ), + + # ============================================ + # ERRORS - Failure rates + # ============================================ + errors_total=_meter.create_counter( + f"{METRIC_PREFIX}.errors.total", + description="Total number of errors", + ), + tool_errors_total=_meter.create_counter( + f"{METRIC_PREFIX}.tool.errors_total", + description="Total number of tool execution errors", + ), + session_errors_total=_meter.create_counter( + f"{METRIC_PREFIX}.session.errors_total", + description="Total number of session errors", + ), + task_errors_total=_meter.create_counter( + f"{METRIC_PREFIX}.task.errors_total", + description="Total number of task errors", + ), + + # ============================================ + # SATURATION - Resource utilization + # ============================================ + active_sessions=_meter.create_up_down_counter( + f"{METRIC_PREFIX}.sessions.active", + description="Number of active sessions", + ), + active_tasks=_meter.create_up_down_counter( + f"{METRIC_PREFIX}.tasks.active", + description="Number of active tasks", + ), + concurrent_tool_calls=_meter.create_up_down_counter( + f"{METRIC_PREFIX}.tool.concurrent", + description="Number of concurrent tool calls", + ), + computer_pool_size=_meter.create_up_down_counter( + f"{METRIC_PREFIX}.computer_pool.size", + description="Current size of the computer pool", + ), + ) + + _initialized = True + logger.info("OpenTelemetry initialization complete") + return _metrics + + +def get_metrics() -> GoldenSignalsMetrics: + """Get the metrics instance, initializing if needed.""" + global _metrics + if _metrics is None: + return initialize_otel() + return _metrics + + +def get_tracer(): + """Get the tracer instance, initializing if needed.""" + global _tracer + if _tracer is None: + initialize_otel() + return _tracer + + +# ============================================ +# Recording Functions +# ============================================ + +def record_tool_call( + tool_name: str, + duration_ms: float, + success: bool, + error_type: Optional[str] = None, + session_id: Optional[str] = None, +) -> None: + """ + Record a tool execution with all four golden signals. + + Args: + tool_name: Name of the tool executed + duration_ms: Execution duration in milliseconds + success: Whether the tool execution succeeded + error_type: Type of error if not successful + session_id: Optional session ID for correlation + """ + m = get_metrics() + attributes = { + "tool_name": tool_name, + "success": str(success).lower(), + } + if session_id: + attributes["session_id"] = session_id + + # Latency + m.tool_execution_duration.record(duration_ms, attributes) + + # Traffic + m.tool_calls_total.add(1, attributes) + + # Errors + if not success: + error_attrs = {**attributes, "error_type": error_type or "unknown"} + m.tool_errors_total.add(1, error_attrs) + m.errors_total.add(1, error_attrs) + + +def record_task( + task_id: str, + duration_ms: float, + success: bool, + error_type: Optional[str] = None, + session_id: Optional[str] = None, + model_name: Optional[str] = None, +) -> None: + """ + Record a CUA task execution with all four golden signals. + + Args: + task_id: Unique task identifier + duration_ms: Task duration in milliseconds + success: Whether the task succeeded + error_type: Type of error if not successful + session_id: Optional session ID for correlation + model_name: Name of the model used + """ + m = get_metrics() + attributes = { + "success": str(success).lower(), + } + if session_id: + attributes["session_id"] = session_id + if model_name: + attributes["model_name"] = model_name + + # Latency + m.task_duration.record(duration_ms, attributes) + + # Traffic + m.tasks_total.add(1, attributes) + + # Errors + if not success: + error_attrs = {**attributes, "error_type": error_type or "unknown"} + m.task_errors_total.add(1, error_attrs) + m.errors_total.add(1, error_attrs) + + +def record_session_created(session_id: str) -> None: + """Record a new session being created.""" + m = get_metrics() + m.sessions_created_total.add(1, {"session_id": session_id}) + m.active_sessions.add(1) + + +def record_session_closed(session_id: str) -> None: + """Record a session being closed.""" + m = get_metrics() + m.active_sessions.add(-1) + + +def record_session_error(session_id: str, error_type: str) -> None: + """Record a session error.""" + m = get_metrics() + m.session_errors_total.add(1, {"session_id": session_id, "error_type": error_type}) + m.errors_total.add(1, {"error_type": error_type, "source": "session"}) + + +def update_saturation( + active_tasks_delta: int = 0, + concurrent_tools_delta: int = 0, + pool_size_delta: int = 0, +) -> None: + """ + Update saturation metrics. + + Args: + active_tasks_delta: Change in active tasks (+1 or -1) + concurrent_tools_delta: Change in concurrent tool calls (+1 or -1) + pool_size_delta: Change in computer pool size (+1 or -1) + """ + m = get_metrics() + if active_tasks_delta != 0: + m.active_tasks.add(active_tasks_delta) + if concurrent_tools_delta != 0: + m.concurrent_tool_calls.add(concurrent_tools_delta) + if pool_size_delta != 0: + m.computer_pool_size.add(pool_size_delta) + + +# ============================================ +# Decorators and Context Managers +# ============================================ + +@contextmanager +def timed_tool_execution(tool_name: str, session_id: Optional[str] = None): + """ + Context manager for timing tool executions. + + Usage: + with timed_tool_execution("screenshot_cua", session_id="abc123") as ctx: + # execute tool + ctx["success"] = True # or False on error + ctx["error_type"] = "timeout" # if error + """ + m = get_metrics() + m.concurrent_tool_calls.add(1) + + start_time = time.perf_counter() + context = {"success": True, "error_type": None} + + try: + yield context + except Exception as e: + context["success"] = False + context["error_type"] = type(e).__name__ + raise + finally: + duration_ms = (time.perf_counter() - start_time) * 1000 + m.concurrent_tool_calls.add(-1) + record_tool_call( + tool_name=tool_name, + duration_ms=duration_ms, + success=context["success"], + error_type=context.get("error_type"), + session_id=session_id, + ) + + +@contextmanager +def timed_task(task_id: str, session_id: Optional[str] = None, model_name: Optional[str] = None): + """ + Context manager for timing CUA task executions. + + Usage: + with timed_task("task-123", session_id="abc", model_name="claude") as ctx: + # execute task + ctx["success"] = True + """ + m = get_metrics() + m.active_tasks.add(1) + + start_time = time.perf_counter() + context = {"success": True, "error_type": None} + + try: + yield context + except Exception as e: + context["success"] = False + context["error_type"] = type(e).__name__ + raise + finally: + duration_ms = (time.perf_counter() - start_time) * 1000 + m.active_tasks.add(-1) + record_task( + task_id=task_id, + duration_ms=duration_ms, + success=context["success"], + error_type=context.get("error_type"), + session_id=session_id, + model_name=model_name, + ) + + +def instrument_tool(tool_name: str): + """ + Decorator to instrument a tool function with OTEL metrics. + + Usage: + @instrument_tool("screenshot_cua") + async def screenshot_cua(ctx: Context, session_id: str = None): + ... + """ + def decorator(func: Callable): + @wraps(func) + async def async_wrapper(*args, **kwargs): + session_id = kwargs.get("session_id") + with timed_tool_execution(tool_name, session_id): + return await func(*args, **kwargs) + + @wraps(func) + def sync_wrapper(*args, **kwargs): + session_id = kwargs.get("session_id") + with timed_tool_execution(tool_name, session_id): + return func(*args, **kwargs) + + # Return appropriate wrapper based on function type + import asyncio + if asyncio.iscoroutinefunction(func): + return async_wrapper + return sync_wrapper + + return decorator + + +# ============================================ +# Shutdown +# ============================================ + +def shutdown_otel() -> None: + """Gracefully shutdown OpenTelemetry exporters.""" + global _initialized + + if not _initialized: + return + + logger.info("Shutting down OpenTelemetry...") + + try: + # Flush and shutdown tracer + tracer_provider = trace.get_tracer_provider() + if hasattr(tracer_provider, "shutdown"): + tracer_provider.shutdown() + + # Flush and shutdown metrics + meter_provider = metrics.get_meter_provider() + if hasattr(meter_provider, "shutdown"): + meter_provider.shutdown() + + logger.info("OpenTelemetry shutdown complete") + except Exception as e: + logger.error(f"Error during OpenTelemetry shutdown: {e}") + + _initialized = False diff --git a/libs/python/mcp-server/mcp_server/server.py b/libs/python/mcp-server/mcp_server/server.py index 3aff058ca..c19b00e71 100644 --- a/libs/python/mcp-server/mcp_server/server.py +++ b/libs/python/mcp-server/mcp_server/server.py @@ -5,12 +5,30 @@ import os import signal import sys +import time import traceback import uuid from typing import Any, Dict, List, Optional, Tuple, Union import anyio +# Import OTEL instrumentation +try: + from .otel import ( + get_metrics, + initialize_otel, + record_session_closed, + record_session_created, + record_session_error, + shutdown_otel, + timed_task, + timed_tool_execution, + update_saturation, + ) + OTEL_AVAILABLE = True +except ImportError: + OTEL_AVAILABLE = False + # Configure logging to output to stderr for debug visibility logging.basicConfig( level=logging.DEBUG, # Changed to DEBUG @@ -129,11 +147,31 @@ async def screenshot_cua(ctx: Context, session_id: Optional[str] = None) -> Any: session_id: Optional session ID for multi-client support. If not provided, a new session will be created. """ session_manager = get_session_manager() + start_time = time.perf_counter() + success = True + error_type = None - async with session_manager.get_session(session_id) as session: - screenshot = await session.computer.interface.screenshot() - # Returning Image object is fine when structured_output=False - return Image(format="png", data=screenshot) + try: + async with session_manager.get_session(session_id) as session: + screenshot = await session.computer.interface.screenshot() + # Returning Image object is fine when structured_output=False + return Image(format="png", data=screenshot) + except Exception as e: + success = False + error_type = type(e).__name__ + raise + finally: + # Record OTEL metrics + if OTEL_AVAILABLE: + duration_ms = (time.perf_counter() - start_time) * 1000 + from .otel import record_tool_call + record_tool_call( + tool_name="screenshot_cua", + duration_ms=duration_ms, + success=success, + error_type=error_type, + session_id=session_id, + ) @server.tool(structured_output=False) async def run_cua_task(ctx: Context, task: str, session_id: Optional[str] = None) -> Any: @@ -146,6 +184,14 @@ async def run_cua_task(ctx: Context, task: str, session_id: Optional[str] = None """ session_manager = get_session_manager() task_id = str(uuid.uuid4()) + task_start_time = time.perf_counter() + task_success = True + task_error_type = None + model_name = os.getenv("CUA_MODEL_NAME", "anthropic/claude-sonnet-4-5-20250929") + + # OTEL: Track active tasks (saturation) + if OTEL_AVAILABLE: + update_saturation(active_tasks_delta=1) try: logger.info(f"Starting Cua task: {task} (task_id: {task_id})") @@ -155,8 +201,7 @@ async def run_cua_task(ctx: Context, task: str, session_id: Optional[str] = None await session_manager.register_task(session.session_id, task_id) try: - # Get model name - model_name = os.getenv("CUA_MODEL_NAME", "anthropic/claude-sonnet-4-5-20250929") + # Log model being used logger.info(f"Using model: {model_name}") # Create agent with the new v0.4.x API @@ -252,6 +297,8 @@ async def run_cua_task(ctx: Context, task: str, session_id: Optional[str] = None await session_manager.unregister_task(session.session_id, task_id) except Exception as e: + task_success = False + task_error_type = type(e).__name__ error_msg = f"Error running Cua task: {str(e)}\n{traceback.format_exc()}" logger.error(error_msg) ctx.error(error_msg) @@ -273,6 +320,20 @@ async def run_cua_task(ctx: Context, task: str, session_id: Optional[str] = None f"Error during task execution: {str(e)}", Image(format="png", data=b""), ) + finally: + # OTEL: Record task metrics and update saturation + if OTEL_AVAILABLE: + update_saturation(active_tasks_delta=-1) + duration_ms = (time.perf_counter() - task_start_time) * 1000 + from .otel import record_task + record_task( + task_id=task_id, + duration_ms=duration_ms, + success=task_success, + error_type=task_error_type, + session_id=session_id, + model_name=model_name, + ) @server.tool(structured_output=False) async def run_multi_cua_tasks( @@ -374,6 +435,11 @@ async def run_server(): try: logger.debug("Starting MCP server...") + # Initialize OpenTelemetry for Four Golden Signals + if OTEL_AVAILABLE: + initialize_otel() + logger.info("OpenTelemetry instrumentation initialized") + # Initialize session manager session_manager = await initialize_session_manager() logger.info("Session manager initialized") @@ -402,6 +468,11 @@ def signal_handler(signum, frame): logger.info("Shutting down session manager...") await shutdown_session_manager() + # Shutdown OpenTelemetry + if OTEL_AVAILABLE: + shutdown_otel() + logger.info("OpenTelemetry shutdown complete") + async def graceful_shutdown(): """Gracefully shutdown the server and all sessions.""" diff --git a/libs/python/mcp-server/pyproject.toml b/libs/python/mcp-server/pyproject.toml index 528749285..e4ba51267 100644 --- a/libs/python/mcp-server/pyproject.toml +++ b/libs/python/mcp-server/pyproject.toml @@ -15,6 +15,10 @@ dependencies = [ "mcp>=1.6.0,<2.0.0", "cua-agent[all]>=0.4.0,<0.5.0", "cua-computer>=0.4.0,<0.5.0", + # OpenTelemetry for Four Golden Signals monitoring + "opentelemetry-api>=1.25.0", + "opentelemetry-sdk>=1.25.0", + "opentelemetry-exporter-otlp-proto-http>=1.25.0", ] [project.scripts]