diff --git a/.env.example b/.env.example
index 99674ac..affa9a8 100644
--- a/.env.example
+++ b/.env.example
@@ -79,8 +79,11 @@ VAPID_PUBLIC_KEY=
VAPID_PRIVATE_KEY=
NEXT_PUBLIC_VAPID_PUBLIC_KEY=
-# ---- Email Digest (Resend) ----
-RESEND_API_KEY=
+
+# ---- Email Digest (Brevo) ----
+BREVO_API_KEY=
+BREVO_SENDER_EMAIL=
+BREVO_SENDER_NAME=
DIGEST_EMAIL=
# ---- App URL (for email links) ----
diff --git a/dashboard/app/api/demo/inject/route.js b/dashboard/app/api/demo/inject/route.js
new file mode 100644
index 0000000..8aefbd8
--- /dev/null
+++ b/dashboard/app/api/demo/inject/route.js
@@ -0,0 +1,245 @@
+import { NextResponse } from 'next/server';
+import { randomUUID } from 'node:crypto';
+import { db } from '../../../../lib/firebase-admin.js';
+import { createClient } from '@supabase/supabase-js';
+
+const _supabaseUrl = process.env.SUPABASE_URL || process.env.NEXT_PUBLIC_SUPABASE_URL || '';
+const _supabaseKey = process.env.SUPABASE_SERVICE_ROLE_KEY || '';
+const supabaseAdmin = _supabaseUrl && _supabaseKey ? createClient(_supabaseUrl, _supabaseKey) : null;
+
+async function writeDisruptionToSupabase(disruptionEvent) {
+ if (!supabaseAdmin) return;
+
+ const { error } = await supabaseAdmin.from('disruptions').upsert({
+ id: disruptionEvent.id,
+ trace_id: disruptionEvent.id,
+ type: disruptionEvent.type,
+ severity: disruptionEvent.severity,
+ location: disruptionEvent.location,
+ epicenter_lat: disruptionEvent.epicenterLat,
+ epicenter_lng: disruptionEvent.epicenterLng,
+ affected_zones: disruptionEvent.affectedZones || [],
+ confidence: disruptionEvent.confidence,
+ raw_description: disruptionEvent.rawDescription || disruptionEvent.description || '',
+ published: true,
+ resolved: false,
+ detected_at: disruptionEvent.detectedAt || new Date().toISOString(),
+ }, { onConflict: 'id' });
+ if (error) throw new Error(`Supabase disruption write failed: ${error.message}`);
+}
+
+const INJECT_TIMEOUT_MS = 15_000;
+const EVENT_BUS_TIMEOUT_MS = 5_000;
+
+const configuredDisruptionAgentUrl =
+ process.env.DISRUPTION_AGENT_URL ||
+ process.env.NEXT_PUBLIC_DISRUPTION_AGENT_URL ||
+ '';
+
+const DISRUPTION_AGENT_URL =
+ configuredDisruptionAgentUrl || (process.env.NODE_ENV === 'development' ? 'http://localhost:3001' : '');
+
+const SCENARIOS = {
+ pacific_storm: {
+ label: 'Super Typhoon Mawar',
+ type: 'WEATHER',
+ severity: 8,
+ location: 'Western Pacific Shipping Corridor',
+ epicenterLat: 28.2,
+ epicenterLng: 143.4,
+ confidence: 0.86,
+ affectedZones: ['Western Pacific', 'North Pacific Route'],
+ description:
+ 'Super Typhoon approaching Western Pacific, Category 5. Maximum sustained winds 185 km/h. Direct path over major trans-Pacific shipping corridors. 12 vessels currently in projected storm path between Japan and Los Angeles. Port of Yokohama issuing storm warnings.',
+ },
+ suez_closure: {
+ label: 'Suez Canal Emergency',
+ type: 'GEOPOLITICAL',
+ severity: 9,
+ location: 'Suez Canal / Red Sea',
+ epicenterLat: 29.9668,
+ epicenterLng: 32.5498,
+ confidence: 0.88,
+ affectedZones: ['Red Sea', 'Gulf of Aden', 'Suez Canal'],
+ description:
+ 'The Suez Canal Authority has announced an emergency closure. Houthi missile attacks on Red Sea vessels. Forty-three vessels held. $12B daily trade affected. Minimum 21-day closure expected. All Asia-Europe shipments via southern route ordered to divert via Cape of Good Hope.',
+ },
+ port_strike: {
+ label: 'Mumbai JNPT Strike',
+ type: 'STRIKE',
+ severity: 7,
+ location: 'North Sea Port Cluster',
+ epicenterLat: 51.9225,
+ epicenterLng: 4.4792,
+ confidence: 0.83,
+ affectedZones: ['Rotterdam', 'Hamburg', 'Antwerp'],
+ description:
+ 'International Transport Workers Federation confirms indefinite strike action at Port of Rotterdam, Hamburg, and Antwerp. All container terminal operations suspended. 80+ vessels at anchor awaiting berth. Estimated 2-week minimum disruption to Europe-bound cargo.',
+ },
+};
+
+function isTimeoutError(error) {
+ const name = String(error?.name || '').toLowerCase();
+ const message = String(error?.message || '').toLowerCase();
+ return name.includes('timeout') || name.includes('abort') || message.includes('timeout') || message.includes('aborted');
+}
+
+async function parseUpstreamBody(response) {
+ const contentType = String(response.headers.get('content-type') || '').toLowerCase();
+ if (contentType.includes('application/json')) {
+ return response.json().catch(() => null);
+ }
+
+ const text = await response.text().catch(() => '');
+ if (!text) return null;
+ return { message: text.slice(0, 500) };
+}
+
+function buildSyntheticDisruption(scenarioMeta) {
+ return {
+ id: `disruption-${randomUUID()}`,
+ type: scenarioMeta.type,
+ severity: scenarioMeta.severity,
+ location: scenarioMeta.location,
+ epicenterLat: scenarioMeta.epicenterLat,
+ epicenterLng: scenarioMeta.epicenterLng,
+ confidence: scenarioMeta.confidence,
+ affectedZones: scenarioMeta.affectedZones,
+ rawDescription: scenarioMeta.description,
+ detectedAt: new Date().toISOString(),
+ source: 'dashboard-demo-fallback',
+ unverified: false,
+ corroboratingSources: 1,
+ };
+}
+
+async function publishSyntheticDisruption(disruptionEvent, traceId) {
+ const eventBusUrl = process.env.EVENT_BUS_URL || 'http://localhost:4000';
+ const response = await fetch(`${eventBusUrl}/publish`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ topic: 'disruption-events',
+ payload: {
+ agentId: 'monitor',
+ traceId,
+ timestamp: new Date().toISOString(),
+ payload: disruptionEvent,
+ },
+ }),
+ signal: AbortSignal.timeout(EVENT_BUS_TIMEOUT_MS),
+ });
+
+ if (!response.ok) {
+ const msg = await response.text().catch(() => '');
+ throw new Error(`Event bus publish failed [${response.status}]${msg ? `: ${msg}` : ''}`);
+ }
+}
+
+async function injectSyntheticDisruption(scenario, scenarioMeta, reason = 'upstream unavailable') {
+ const traceId = randomUUID();
+ const disruptionEvent = buildSyntheticDisruption(scenarioMeta);
+ const results = await Promise.allSettled([
+ db.collection('disruptions').doc(disruptionEvent.id).set(disruptionEvent, { merge: true }),
+ publishSyntheticDisruption(disruptionEvent, traceId),
+ writeDisruptionToSupabase(disruptionEvent),
+ ]);
+
+ const persisted = results[0].status === 'fulfilled' || results[2].status === 'fulfilled';
+ const published = results[1].status === 'fulfilled';
+ if (results[2].status === 'rejected') {
+ console.warn('[InjectRoute] Supabase disruption write failed:', results[2].reason?.message);
+ }
+
+ if (!persisted && !published) {
+ const persistErr = results[0].reason?.message || 'persist failed';
+ const publishErr = results[1].reason?.message || 'publish failed';
+ throw new Error(`Synthetic injection failed: ${persistErr}; ${publishErr}`);
+ }
+
+ return NextResponse.json(
+ {
+ ok: true,
+ synthetic: true,
+ scenario,
+ label: scenarioMeta.label,
+ traceId,
+ disruptionId: disruptionEvent.id,
+ persisted,
+ published,
+ warning: reason,
+ },
+ { status: 202 }
+ );
+}
+
+export async function POST(req) {
+ try {
+ const { scenario } = await req.json();
+ const scenarioKey = String(scenario || '').trim().toLowerCase();
+ const scenarioMeta = SCENARIOS[scenarioKey];
+
+ if (!scenarioMeta) {
+ return NextResponse.json(
+ { error: `Unknown scenario. Available: ${Object.keys(SCENARIOS).join(', ')}` },
+ { status: 400 }
+ );
+ }
+
+ if (!DISRUPTION_AGENT_URL) {
+ return injectSyntheticDisruption(
+ scenarioKey,
+ scenarioMeta,
+ 'DISRUPTION_AGENT_URL is not configured; synthetic fallback used'
+ );
+ }
+
+ const headers = { 'Content-Type': 'application/json' };
+ if (process.env.INTERNAL_TOKEN) {
+ headers.Authorization = `Bearer ${process.env.INTERNAL_TOKEN}`;
+ }
+
+ try {
+ const upstream = await fetch(`${DISRUPTION_AGENT_URL}/events`, {
+ method: 'POST',
+ headers,
+ body: JSON.stringify({ description: scenarioMeta.description }),
+ signal: AbortSignal.timeout(INJECT_TIMEOUT_MS),
+ });
+
+ const result = await parseUpstreamBody(upstream);
+ if (!upstream.ok) {
+ return injectSyntheticDisruption(
+ scenarioKey,
+ scenarioMeta,
+ `Disruption agent returned ${upstream.status}; synthetic fallback used`
+ );
+ }
+
+ return NextResponse.json({
+ ok: true,
+ synthetic: false,
+ disruptionId: result?.data?.id || null,
+ traceId: result?.traceId || null,
+ scenario: scenarioKey,
+ label: scenarioMeta.label,
+ published: result?.published ?? false,
+ });
+ } catch (err) {
+ if (isTimeoutError(err)) {
+ return injectSyntheticDisruption(
+ scenarioKey,
+ scenarioMeta,
+ `Disruption agent timed out after ${Math.floor(INJECT_TIMEOUT_MS / 1000)} seconds; synthetic fallback used`
+ );
+ }
+ return injectSyntheticDisruption(
+ scenarioKey,
+ scenarioMeta,
+ `Disruption agent unavailable (${err.message}); synthetic fallback used`
+ );
+ }
+ } catch (err) {
+ return NextResponse.json({ error: err.message || 'Inject failed' }, { status: 500 });
+ }
+}
diff --git a/dashboard/app/api/webhooks/disruption/route.js b/dashboard/app/api/webhooks/disruption/route.js
index 43ab6d8..f57a0f8 100644
--- a/dashboard/app/api/webhooks/disruption/route.js
+++ b/dashboard/app/api/webhooks/disruption/route.js
@@ -1,13 +1,131 @@
import { NextResponse } from 'next/server';
+import { randomUUID } from 'node:crypto';
import { db } from '../../../../lib/firebase-admin.js'; // server-side admin import
import { verifyInternalToken } from '../../_internal-auth.js';
+const INJECT_TIMEOUT_MS = 15_000;
+const EVENT_BUS_TIMEOUT_MS = 5_000;
+
const SCENARIO_MAP = {
- suez_closure: 'The Suez Canal Authority has announced an emergency closure. Houthi missile attacks on Red Sea vessels. Forty-three vessels held. $12B daily trade affected. Minimum 21-day closure expected. All Asia-Europe shipments via southern route ordered to divert via Cape of Good Hope.',
- pacific_storm: 'Super Typhoon approaching Western Pacific, Category 5. Maximum sustained winds 185 km/h. Direct path over major trans-Pacific shipping corridors. 12 vessels currently in projected storm path between Japan and Los Angeles. Port of Yokohama issuing storm warnings.',
- port_strike: 'International Transport Workers Federation confirms indefinite strike action at Port of Rotterdam, Hamburg, and Antwerp. All container terminal operations suspended. 80+ vessels at anchor awaiting berth. Estimated 2-week minimum disruption to Europe-bound cargo.',
+ suez_closure: {
+ description: 'The Suez Canal Authority has announced an emergency closure. Houthi missile attacks on Red Sea vessels. Forty-three vessels held. $12B daily trade affected. Minimum 21-day closure expected. All Asia-Europe shipments via southern route ordered to divert via Cape of Good Hope.',
+ type: 'GEOPOLITICAL',
+ severity: 9,
+ location: 'Suez Canal / Red Sea',
+ epicenterLat: 29.9668,
+ epicenterLng: 32.5498,
+ affectedZones: ['Red Sea', 'Gulf of Aden', 'Suez Canal'],
+ confidence: 0.88,
+ },
+ pacific_storm: {
+ description: 'Super Typhoon approaching Western Pacific, Category 5. Maximum sustained winds 185 km/h. Direct path over major trans-Pacific shipping corridors. 12 vessels currently in projected storm path between Japan and Los Angeles. Port of Yokohama issuing storm warnings.',
+ type: 'WEATHER',
+ severity: 8,
+ location: 'Western Pacific Shipping Corridor',
+ epicenterLat: 28.2,
+ epicenterLng: 143.4,
+ affectedZones: ['Western Pacific', 'North Pacific Route'],
+ confidence: 0.86,
+ },
+ port_strike: {
+ description: 'International Transport Workers Federation confirms indefinite strike action at Port of Rotterdam, Hamburg, and Antwerp. All container terminal operations suspended. 80+ vessels at anchor awaiting berth. Estimated 2-week minimum disruption to Europe-bound cargo.',
+ type: 'STRIKE',
+ severity: 7,
+ location: 'North Sea Port Cluster',
+ epicenterLat: 51.9225,
+ epicenterLng: 4.4792,
+ affectedZones: ['Rotterdam', 'Hamburg', 'Antwerp'],
+ confidence: 0.83,
+ },
};
+function isTimeoutError(error) {
+ const name = String(error?.name || '').toLowerCase();
+ const message = String(error?.message || '').toLowerCase();
+ return name.includes('timeout') || name.includes('abort') || message.includes('timeout') || message.includes('aborted');
+}
+
+async function parseUpstreamBody(response) {
+ const contentType = String(response.headers.get('content-type') || '').toLowerCase();
+ if (contentType.includes('application/json')) {
+ return response.json().catch(() => null);
+ }
+
+ const text = await response.text().catch(() => '');
+ if (!text) return null;
+ return { message: text.slice(0, 500) };
+}
+
+function buildSyntheticDisruption(scenarioMeta) {
+ return {
+ id: `disruption-${randomUUID()}`,
+ type: scenarioMeta.type,
+ severity: scenarioMeta.severity,
+ location: scenarioMeta.location,
+ epicenterLat: scenarioMeta.epicenterLat,
+ epicenterLng: scenarioMeta.epicenterLng,
+ confidence: scenarioMeta.confidence,
+ affectedZones: scenarioMeta.affectedZones,
+ rawDescription: scenarioMeta.description,
+ detectedAt: new Date().toISOString(),
+ source: 'dashboard-webhook-fallback',
+ unverified: false,
+ corroboratingSources: 1,
+ };
+}
+
+async function publishSyntheticDisruption(disruptionEvent, traceId) {
+ const eventBusUrl = process.env.EVENT_BUS_URL || 'http://localhost:4000';
+ const response = await fetch(`${eventBusUrl}/publish`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ topic: 'disruption-events',
+ payload: {
+ agentId: 'monitor',
+ traceId,
+ timestamp: new Date().toISOString(),
+ payload: disruptionEvent,
+ },
+ }),
+ signal: AbortSignal.timeout(EVENT_BUS_TIMEOUT_MS),
+ });
+ if (!response.ok) {
+ const msg = await response.text().catch(() => '');
+ throw new Error(`Event bus publish failed [${response.status}]${msg ? `: ${msg}` : ''}`);
+ }
+}
+
+async function injectSyntheticDisruption(scenario, scenarioMeta, reason) {
+ const traceId = randomUUID();
+ const disruptionEvent = buildSyntheticDisruption(scenarioMeta);
+ const results = await Promise.allSettled([
+ db.collection('disruptions').doc(disruptionEvent.id).set(disruptionEvent, { merge: true }),
+ publishSyntheticDisruption(disruptionEvent, traceId),
+ ]);
+ const persisted = results[0].status === 'fulfilled';
+ const published = results[1].status === 'fulfilled';
+ if (!persisted && !published) {
+ const persistErr = results[0].reason?.message || 'persist failed';
+ const publishErr = results[1].reason?.message || 'publish failed';
+ throw new Error(`Synthetic injection failed: ${persistErr}; ${publishErr}`);
+ }
+
+ return NextResponse.json(
+ {
+ ok: true,
+ synthetic: true,
+ scenario,
+ traceId,
+ disruptionId: disruptionEvent.id,
+ persisted,
+ published,
+ warning: reason,
+ },
+ { status: 202 }
+ );
+}
+
/**
* POST /api/webhooks/disruption
* Receives pushes from the event bus and writes them to Firestore.
@@ -32,24 +150,53 @@ export async function POST(req) {
}
if (body.scenario) {
- const description = SCENARIO_MAP[body.scenario];
- if (!description) {
+ const scenarioMeta = SCENARIO_MAP[body.scenario];
+ if (!scenarioMeta) {
return NextResponse.json({ error: `Unknown scenario: ${body.scenario}` }, { status: 400 });
}
- const disruptionUrl = process.env.DISRUPTION_AGENT_URL || 'http://localhost:3001';
- const upstream = await fetch(`${disruptionUrl}/events`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- ...(process.env.INTERNAL_TOKEN ? { Authorization: `Bearer ${process.env.INTERNAL_TOKEN}` } : {}),
- },
- body: JSON.stringify({ description }),
- signal: AbortSignal.timeout(15_000),
- });
+ try {
+ const disruptionUrl = process.env.DISRUPTION_AGENT_URL || 'http://localhost:3001';
+ const upstream = await fetch(`${disruptionUrl}/events`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ ...(process.env.INTERNAL_TOKEN ? { Authorization: `Bearer ${process.env.INTERNAL_TOKEN}` } : {}),
+ },
+ body: JSON.stringify({ description: scenarioMeta.description }),
+ signal: AbortSignal.timeout(INJECT_TIMEOUT_MS),
+ });
- const result = await upstream.json().catch(() => ({}));
- return NextResponse.json({ ok: upstream.ok, scenario: body.scenario, ...result }, { status: upstream.status });
+ const upstreamBody = await parseUpstreamBody(upstream);
+ if (!upstream.ok) {
+ return injectSyntheticDisruption(
+ body.scenario,
+ scenarioMeta,
+ `Disruption agent returned ${upstream.status}; synthetic fallback used`
+ );
+ }
+ return NextResponse.json(
+ {
+ ok: upstream.ok,
+ scenario: body.scenario,
+ ...(upstreamBody && typeof upstreamBody === 'object' ? upstreamBody : {}),
+ },
+ { status: upstream.status }
+ );
+ } catch (err) {
+ if (isTimeoutError(err)) {
+ return injectSyntheticDisruption(
+ body.scenario,
+ scenarioMeta,
+ `Disruption agent timed out after ${Math.floor(INJECT_TIMEOUT_MS / 1000)} seconds; synthetic fallback used`
+ );
+ }
+ return injectSyntheticDisruption(
+ body.scenario,
+ scenarioMeta,
+ `Disruption agent unavailable (${err.message}); synthetic fallback used`
+ );
+ }
}
const { agentId, traceId, timestamp, payload } = body;
diff --git a/dashboard/app/components/NavBar.jsx b/dashboard/app/components/NavBar.jsx
index 42959b6..1e8c2e3 100644
--- a/dashboard/app/components/NavBar.jsx
+++ b/dashboard/app/components/NavBar.jsx
@@ -3,7 +3,7 @@
import Link from 'next/link';
import { usePathname, useRouter } from 'next/navigation';
import { useEffect } from 'react';
-import { Activity, BarChart3, Globe, Package, RotateCcw, Settings, Moon, Sun, Workflow, AlertCircle, Code2 } from 'lucide-react';
+import { Activity, BarChart3, Globe, Package, RotateCcw, Settings, Moon, Sun, Workflow, AlertCircle, Code2, Zap } from 'lucide-react';
import { useAlertStore } from '../store/alertStore.js';
import { useTheme } from '../providers/ThemeProvider.jsx';
import { motion } from 'framer-motion';
@@ -12,23 +12,25 @@ const NAV_ITEMS = [
{ href: '/', label: 'Globe', icon: Globe, section: 'live' },
{ href: '/shipments', label: 'Shipments', icon: Package, section: 'live' },
{ href: '/analytics', label: 'Analytics', icon: BarChart3, section: 'live' },
+ { href: '/demo', label: 'Demo', icon: Zap, section: 'live' },
{ href: '/replay', label: 'Replay', icon: RotateCcw, section: 'analysis' },
{ href: '/visualize', label: 'Visualize', icon: Workflow, section: 'analysis' },
{ href: '/developers', label: 'API', icon: Code2, section: 'analysis' },
{ href: '/health', label: 'System', icon: Activity, section: 'analysis' },
];
-function ThemeToggleButton({ theme, onToggle }) {
+function ThemeToggleButton({ onToggle }) {
return (
);
}
@@ -36,7 +38,7 @@ function ThemeToggleButton({ theme, onToggle }) {
export default function NavBar() {
const pathname = usePathname();
const router = useRouter();
- const { theme, toggleTheme } = useTheme();
+ const { toggleTheme } = useTheme();
const isGlobePage = pathname === '/';
const hasActiveDisruption = useAlertStore((s) => Boolean(s.activeDisruptionId));
@@ -122,7 +124,7 @@ export default function NavBar() {
{/* Right actions */}
{!isGlobePage && (
-
+
)}
s.shipments);
const handleFilter = (filter) => {
@@ -54,17 +56,9 @@ export default function GlobeControls({ onFilterChange, showSimulationControls =
return () => window.removeEventListener('keydown', handleKeyDown);
}, [onFilterChange]);
- async function injectScenario(name) {
- setInjecting(name);
- try {
- await fetch('/api/webhooks/disruption', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ scenario: name.toLowerCase().replace(/ /g, '_') }),
- });
- } finally {
- setInjecting(null);
- }
+ function injectScenario(name) {
+ const scenarioId = name.toLowerCase().replace(/ /g, '_');
+ router.push(`/demo?scenario=${scenarioId}`);
}
return (
@@ -118,11 +112,7 @@ export default function GlobeControls({ onFilterChange, showSimulationControls =
className="text-[11px] font-bold uppercase tracking-wider px-3 py-2 rounded-xl border border-[var(--border-subtle)] bg-[var(--bg-elevated)]/50 text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:border-[var(--accent-cyan)]/40 transition-all flex items-center justify-between group"
>
{name}
- {injecting === name ? (
-
- ) : (
-
- )}
+
))}
diff --git a/dashboard/app/demo/page.js b/dashboard/app/demo/page.js
new file mode 100644
index 0000000..82781d9
--- /dev/null
+++ b/dashboard/app/demo/page.js
@@ -0,0 +1,1258 @@
+'use client';
+
+import { useCallback, useEffect, useRef, useState } from 'react';
+import {
+ collection,
+ getDocs,
+ limit,
+ onSnapshot,
+ orderBy,
+ query,
+ where,
+} from 'firebase/firestore';
+import { db, isFirebaseConfigured } from '../lib/firebase.js';
+import { watchDisruptionSupabase, watchImpactSupabase, watchResolutionSupabase } from '../lib/supabaseWatcher.js';
+import NavBar from '../components/NavBar.jsx';
+
+const SCENARIOS = [
+ {
+ id: 'pacific_storm',
+ label: 'Super Typhoon Mawar',
+ region: 'Western Pacific',
+ severity: 9,
+ icon: '🌀',
+ tag: 'CAT 5 STORM',
+ tagColor: 'var(--accent-red)',
+ preview: 'Shanghai → LA corridor at risk. Manila, Kaohsiung, HK vessel advisories active.',
+ },
+ {
+ id: 'suez_closure',
+ label: 'Suez Canal Emergency',
+ region: 'Red Sea / Egypt',
+ severity: 10,
+ icon: '⚓',
+ tag: 'CANAL BLOCKED',
+ tagColor: 'var(--accent-amber)',
+ preview: "$12B daily trade halted. 43 vessels held. Lloyd's suspended war-risk coverage.",
+ },
+ {
+ id: 'port_strike',
+ label: 'Mumbai JNPT Strike',
+ region: 'South Asia',
+ severity: 7,
+ icon: '🏗',
+ tag: 'PORT STRIKE',
+ tagColor: 'var(--accent-blue)',
+ preview: '4,800 dockworkers AWOL. 5M TEU/yr port offline. Mundra at 85% capacity.',
+ },
+];
+
+const STAGES = [
+ { id: 'idle', label: 'Ready', icon: '◎', color: 'var(--text-muted)' },
+ { id: 'injected', label: 'Disruption Injected',icon: '⚡', color: 'var(--accent-amber)' },
+ { id: 'monitoring',label: 'Monitor Agent', icon: '📡', color: 'var(--accent-blue)' },
+ { id: 'impact', label: 'Impact Analysis', icon: '📊', color: 'var(--accent-red)' },
+ { id: 'resolution',label: 'AI Resolution', icon: '🤖', color: 'var(--accent-cyan)' },
+ { id: 'decision', label: 'Human Decision', icon: '⚖️', color: 'var(--accent-amber)' },
+ { id: 'applied', label: 'Protocol Applied', icon: '✓', color: 'var(--accent-green)' },
+ { id: 'report', label: 'Report Ready', icon: '📄', color: 'var(--accent-cyan)' },
+];
+
+const STAGE_INDEX = Object.fromEntries(STAGES.map((s, i) => [s.id, i]));
+
+const OPTION_CFG = {
+ 1: { label: 'Recommended', accent: 'var(--accent-cyan)', border: 'rgba(34,211,238,0.35)' },
+ 2: { label: 'Fastest Path', accent: 'var(--accent-blue)', border: 'rgba(59,130,246,0.35)' },
+ 3: { label: 'Cost Efficient',accent: 'var(--accent-amber)', border: 'rgba(245,158,11,0.35)' },
+};
+
+function fmt$(v) { return `$${Number(v || 0).toLocaleString()}`; }
+function fmtD(v) { return v >= 0 ? `+${v}d` : `${v}d`; }
+function fmtCO2(v){ return `${Math.round(Number(v || 0) / 1000)}t CO₂`; }
+
+function Pulse({ color = 'var(--accent-cyan)' }) {
+ return (
+
+ );
+}
+
+function StageNode({ stage, index, currentIndex }) {
+ const done = index < currentIndex;
+ const active = index === currentIndex;
+ const pending = index > currentIndex;
+ const color = active ? stage.color : done ? 'var(--accent-green)' : 'var(--text-muted)';
+
+ return (
+
+
+ {done ? '✓' : stage.icon}
+
+
+ {stage.label}
+
+
+ );
+}
+
+function PipelineBar({ currentStage }) {
+ const currentIndex = STAGE_INDEX[currentStage] ?? 0;
+ const pct = currentIndex > 0 ? ((currentIndex) / (STAGES.length - 1)) * 100 : 0;
+
+ return (
+
+
+
+
+ {STAGES.map((stage, i) => (
+
+
+
+ ))}
+
+
+ );
+}
+
+function LogLine({ line }) {
+ const colors = {
+ info: 'var(--accent-cyan)',
+ success: 'var(--accent-green)',
+ warn: 'var(--accent-amber)',
+ error: 'var(--accent-red)',
+ };
+ return (
+
+ {line.ts}
+ [{line.type.toUpperCase()}]
+ {line.msg}
+
+ );
+}
+
+function SeverityBar({ value }) {
+ const pct = (value / 10) * 100;
+ const color = value >= 8 ? 'var(--accent-red)' : value >= 5 ? 'var(--accent-amber)' : 'var(--accent-green)';
+ return (
+
+ );
+}
+
+function Chip({ label, value, accent }) {
+ return (
+
+
+ {label}
+
+ {value}
+
+ );
+}
+
+function OptionCardInline({ option, onApprove, isApproving, approvedRank }) {
+ const cfg = OPTION_CFG[option.rank] || OPTION_CFG[3];
+ const disabled = isApproving || approvedRank !== null;
+ const selected = option.rank === approvedRank;
+
+ return (
+
+
+
+ {cfg.label}
+
+
+ Option {option.rank}
+
+
+
+
+
+ {option.title || option.name || `Resolution Strategy ${option.rank}`}
+
+
+ {option.description || option.summary || '—'}
+
+
+
+
+
+
+
+
+
+ {option.confidence != null && (
+
+
+ AI Confidence
+
+
+
+
{option.confidence}%
+
+
+ )}
+
+ {selected ? (
+
+ ✓ Protocol Deployed
+
+ ) : (
+
+ )}
+
+ );
+}
+
+export default function DemoPage() {
+ const [selectedScenario, setSelectedScenario] = useState(() => {
+ if (typeof window === 'undefined') return null;
+ const scenarioParam = new URLSearchParams(window.location.search).get('scenario');
+ const match = SCENARIOS.find((s) => s.id === scenarioParam);
+ return match ? match.id : null;
+ });
+ const [stage, setStage] = useState('idle');
+ const [disruptionId, setDisruptionId] = useState(null);
+ const [traceId, setTraceId] = useState(null);
+ const [disruption, setDisruption] = useState(null);
+ const [impactReport, setImpactReport] = useState(null);
+ const [resolution, setResolution] = useState(null);
+ const [options, setOptions] = useState([]);
+ const [approvedRank, setApprovedRank] = useState(null);
+ const [isApproving, setIsApproving] = useState(false);
+ const [isGeneratingReport, setIsGeneratingReport] = useState(false);
+ const [reportReady, setReportReady] = useState(false);
+ const [reportData, setReportData] = useState(null);
+ const [logs, setLogs] = useState([]);
+ const [launching, setLaunching] = useState(false);
+ const [error, setError] = useState(null);
+ const unsubsRef = useRef([]);
+ const logEndRef = useRef(null);
+
+ const log = useCallback((msg, type = 'info') => {
+ const ts = new Date().toLocaleTimeString('en-US', { hour12: false });
+ setLogs((prev) => [...prev.slice(-60), { ts, msg, type }]);
+ }, []);
+
+ useEffect(() => {
+ logEndRef.current?.scrollIntoView({ behavior: 'smooth' });
+ }, [logs]);
+
+ useEffect(() => {
+ return () => unsubsRef.current.forEach((u) => u?.());
+ }, []);
+
+ const watchResolutionRef = useRef(null);
+ const watchImpactRef = useRef(null);
+
+ const watchResolution = useCallback(
+ (dId) => {
+ log('Impact complete — AI resolution agent active…', 'info');
+ const unsub = watchResolutionSupabase(dId, ({ resolution: res, options: opts }) => {
+ setResolution(res);
+ setOptions(opts);
+ setStage('resolution');
+ log(`✓ AI generated ${opts.length} resolution strategies`, 'success');
+ setTimeout(() => setStage('decision'), 1200);
+ });
+ unsubsRef.current.push(unsub);
+ },
+ [log]
+ );
+
+ const watchImpact = useCallback(
+ (dId) => {
+ log('Monitor agent processing… watching impact_reports…', 'info');
+ const unsub = watchImpactSupabase(dId, (data) => {
+ setImpactReport(data);
+ setStage('impact');
+ log(
+ `✓ Impact scored: $${Number(data.totalCargoAtRiskUSD || 0).toLocaleString()} at risk across ${(data.affectedShipments || []).length} shipments`,
+ 'success'
+ );
+ if (watchResolutionRef.current) watchResolutionRef.current(dId);
+ });
+ unsubsRef.current.push(unsub);
+ },
+ [log]
+ );
+
+ useEffect(() => {
+ watchResolutionRef.current = watchResolution;
+ watchImpactRef.current = watchImpact;
+ }, [watchResolution, watchImpact]);
+
+ const watchDisruption = useCallback(
+ (dId) => {
+ log(`Listening for disruption ${dId} in Supabase…`, 'info');
+ const unsub = watchDisruptionSupabase(dId, (data) => {
+ setDisruption(data);
+ setStage('monitoring');
+ log(`✓ Disruption confirmed: ${data.title || data.type || dId}`, 'success');
+ if (watchImpactRef.current) watchImpactRef.current(dId);
+ });
+ unsubsRef.current.push(unsub);
+ },
+ [log]
+ );
+
+ const handleLaunch = useCallback(async () => {
+ if (!selectedScenario) return;
+ setError(null);
+ setLaunching(true);
+ setLogs([]);
+ setDisruption(null);
+ setImpactReport(null);
+ setResolution(null);
+ setOptions([]);
+ setApprovedRank(null);
+ setReportReady(false);
+ setReportData(null);
+ unsubsRef.current.forEach((u) => u?.());
+ unsubsRef.current = [];
+
+ log(`Injecting scenario: ${selectedScenario}…`, 'info');
+ setStage('injected');
+
+ try {
+ const res = await fetch('/api/demo/inject', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ scenario: selectedScenario }),
+ });
+
+ const data = await res.json();
+
+ if (!res.ok) {
+ throw new Error(data.error || `HTTP ${res.status}`);
+ }
+
+ const dId = data.disruptionId;
+ const tId = data.traceId;
+ setDisruptionId(dId);
+ setTraceId(tId);
+
+ log(`✓ Disruption published — ID: ${dId}`, 'success');
+ log(` TraceId: ${tId}`, 'info');
+ log('Event bus fan-out complete. Agent pipeline starting…', 'info');
+
+ watchDisruption(dId);
+ } catch (err) {
+ setError(err.message);
+ setStage('idle');
+ log(`✗ Injection failed: ${err.message}`, 'error');
+ } finally {
+ setLaunching(false);
+ }
+ }, [selectedScenario, log, watchDisruption]);
+
+ // Auto-launch once scenario is pre-selected from URL
+ useEffect(() => {
+ const scenarioParam = typeof window === 'undefined'
+ ? null
+ : new URLSearchParams(window.location.search).get('scenario');
+ if (!scenarioParam || !selectedScenario) return;
+ if (selectedScenario === scenarioParam) {
+ // Small delay to let UI render before launch
+ const t = setTimeout(() => handleLaunch(), 300);
+ return () => clearTimeout(t);
+ }
+ }, [selectedScenario, handleLaunch]);
+
+ const handleApprove = async (rank) => {
+ if (!resolution || !options.length) return;
+ setIsApproving(true);
+ setStage('applied');
+
+ const selected = options.find((o) => o.rank === rank);
+ log(`Deploying protocol: Option ${rank} — ${selected?.title || ''}`, 'info');
+
+ try {
+ const res = await fetch('/api/execute', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ traceId: resolution.id,
+ rank,
+ disruptionId,
+ }),
+ });
+
+ const data = await res.json().catch(() => ({}));
+
+ if (!res.ok) {
+ log(`Execute warning (${res.status}): ${data.error || 'Non-fatal'}`, 'warn');
+ } else {
+ log(`✓ Protocol ${rank} deployed — shipments rerouting`, 'success');
+ }
+ } catch (err) {
+ log(`Execute error: ${err.message}`, 'warn');
+ }
+
+ setApprovedRank(rank);
+ setIsApproving(false);
+ log('Generating executive incident report…', 'info');
+
+ setIsGeneratingReport(true);
+ try {
+ const reportRes = await fetch('/api/generate-report', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ disruption,
+ resolution,
+ options,
+ impactReport,
+ }),
+ });
+ const payload = await reportRes.json();
+ if (payload.report) {
+ setReportData(payload.report);
+ setReportReady(true);
+ setStage('report');
+ log('✓ Executive report ready — click Download to save PDF', 'success');
+ } else {
+ log(`Report gen warning: ${payload.error || 'No report text'}`, 'warn');
+ setStage('report');
+ }
+ } catch (err) {
+ log(`Report error: ${err.message}`, 'warn');
+ setStage('report');
+ } finally {
+ setIsGeneratingReport(false);
+ }
+ };
+
+ const handleDownload = async () => {
+ if (!reportData) return;
+ try {
+ const { generateReportPdf } = await import('../lib/generateReportPdf.js');
+ const doc = generateReportPdf({ reportText: reportData, disruption, traceId });
+ doc.save(`opentrade-incident-${traceId || Date.now()}.pdf`);
+ log('✓ PDF downloaded', 'success');
+ } catch (err) {
+ log(`PDF error: ${err.message}`, 'error');
+ }
+ };
+
+ const handleReset = () => {
+ unsubsRef.current.forEach((u) => u?.());
+ unsubsRef.current = [];
+ setStage('idle');
+ setSelectedScenario(null);
+ setDisruptionId(null);
+ setTraceId(null);
+ setDisruption(null);
+ setImpactReport(null);
+ setResolution(null);
+ setOptions([]);
+ setApprovedRank(null);
+ setReportReady(false);
+ setReportData(null);
+ setLogs([]);
+ setError(null);
+ };
+
+ const currentStageIndex = STAGE_INDEX[stage] ?? 0;
+ const activeScenario = SCENARIOS.find((s) => s.id === selectedScenario);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+ Live Pipeline Demo
+
+ {stage !== 'idle' && stage !== 'injected' &&
}
+
+
+ OpenTrade Command Demo
+
+
+ End-to-end pipeline: Disruption Injection → AI resolution → Human Decision → Protocol Deployment → PDF Report
+
+
+
+
+
+ {error && (
+
+ ⚠
+ Error: {error} — Check that all agents are running and env vars are set.
+
+ )}
+
+
+
+
+
+ {stage === 'idle' && (
+
+
+
+ Choose Scenario
+
+
+ {SCENARIOS.map((sc) => (
+
+ ))}
+
+
+
+
+
+ )}
+
+ {stage === 'injected' && (
+
+
+
+ Disruption published to Event Bus
+
+
+ Waiting for Monitor Agent to confirm detection…
+
+
+
+ )}
+
+ {stage === 'monitoring' && disruption && (
+
+
+
+
+ Monitor Agent — Disruption Confirmed
+
+
+
+ {disruption.title || activeScenario?.label || 'Disruption Detected'}
+
+
+ {disruption.summary || disruption.description || '—'}
+
+ {disruption.severity != null && (
+
+ )}
+
+ Running impact analysis across all active shipments…
+
+
+
+ )}
+
+ {stage === 'impact' && impactReport && (
+
+
+
+
+
+ Impact Analysis Complete
+
+
+
+
+
+
+
+
+ Resolution agent generating strategic options…
+
+
+
+
+ )}
+
+ {(stage === 'resolution' || stage === 'decision' || stage === 'applied' || stage === 'report') && options.length > 0 && (
+
+
+ {stage === 'decision' &&
}
+ {stage === 'resolution' &&
}
+
+ {stage === 'report'
+ ? '✓ Protocol Applied — Report Ready'
+ : stage === 'applied'
+ ? '⚡ Executing Protocol…'
+ : stage === 'decision'
+ ? 'Human Decision Required'
+ : 'AI Generated 3 Resolution Strategies'}
+
+
+
+ {impactReport && (
+
+
+
+
+ )}
+
+
+ {options.map((opt) => (
+
+ ))}
+
+
+ {stage === 'decision' && approvedRank === null && (
+
+ ↑ Select a protocol to deploy. Keyboard shortcuts: press{' '}
+
+ 1
+ {' '}
+
+ 2
+ {' '}
+
+ 3
+
+
+ )}
+
+ )}
+
+ {stage === 'report' && (
+
+
+
+ ✓ Pipeline Complete
+
+
+ Executive incident report generated. Download the PDF or run another scenario.
+
+
+
+ {reportReady && (
+
+ )}
+
+
+
+ )}
+
+
+
+
+ {(disruptionId || stage !== 'idle') && (
+
+
+ Session
+
+ {activeScenario && (
+
+
Scenario
+
+ {activeScenario.icon} {activeScenario.label}
+
+
+ )}
+ {disruptionId && (
+
+
Disruption ID
+
+ {disruptionId}
+
+
+ )}
+ {traceId && (
+
+
Trace ID
+
+ {traceId}
+
+
+ )}
+
+
Stage
+
+ {STAGES[currentStageIndex]?.icon} {STAGES[currentStageIndex]?.label}
+
+
+
+ )}
+
+
+
+
+ Agent Console
+
+ {stage !== 'idle' && stage !== 'report' &&
}
+
+
+ {logs.length === 0 ? (
+
+ Awaiting launch…
+
+ ) : (
+ logs.map((line, i) =>
)
+ )}
+
+
+
+
+ {stage !== 'idle' && stage !== 'report' && (
+
+ )}
+
+
+
+
+
+ >
+ );
+}
\ No newline at end of file
diff --git a/dashboard/app/globals.css b/dashboard/app/globals.css
index d03ee9b..1515af6 100644
--- a/dashboard/app/globals.css
+++ b/dashboard/app/globals.css
@@ -199,6 +199,22 @@ body {
}
@layer utilities {
+ .theme-toggle-light-icon {
+ display: none;
+ }
+
+ .theme-toggle-dark-icon {
+ display: inline-block;
+ }
+
+ [data-theme="light"] .theme-toggle-light-icon {
+ display: inline-block;
+ }
+
+ [data-theme="light"] .theme-toggle-dark-icon {
+ display: none;
+ }
+
/* Pure Glass Panel */
.glass-panel {
background: var(--glass-bg);
diff --git a/dashboard/app/layout.js b/dashboard/app/layout.js
index 97edca0..e86960f 100644
--- a/dashboard/app/layout.js
+++ b/dashboard/app/layout.js
@@ -39,26 +39,7 @@ export default function RootLayout({ children }) {
return (
-
+
diff --git a/dashboard/app/lib/generateReportPdf.js b/dashboard/app/lib/generateReportPdf.js
index e52bd8b..a8bd900 100644
--- a/dashboard/app/lib/generateReportPdf.js
+++ b/dashboard/app/lib/generateReportPdf.js
@@ -40,7 +40,7 @@ export function generateReportPdf({ reportText, disruption, traceId }) {
const now = new Date();
doc.text(`Generated: ${now.toLocaleString()}`, width - margin, 14, { align: 'right' });
doc.text(`Trace ID: ${traceId || 'N/A'}`, width - margin, 21, { align: 'right' });
- doc.text(`Severity: ${(disruption?.severity || 'HIGH').toUpperCase()}`, width - margin, 28, { align: 'right' });
+ doc.text(`Severity: ${disruption?.severity != null ? `${disruption.severity}/10` : 'HIGH'}`, width - margin, 28, { align: 'right' });
let y = 50;
const lines = String(reportText || '').split('\n');
diff --git a/dashboard/app/lib/supabaseWatcher.js b/dashboard/app/lib/supabaseWatcher.js
new file mode 100644
index 0000000..c01c73c
--- /dev/null
+++ b/dashboard/app/lib/supabaseWatcher.js
@@ -0,0 +1,137 @@
+'use client';
+import { createClient } from '@supabase/supabase-js';
+
+const url = process.env.NEXT_PUBLIC_SUPABASE_URL;
+const key = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
+
+if (!url || !key) {
+ console.error('[SupabaseWatcher] NEXT_PUBLIC_SUPABASE_URL or NEXT_PUBLIC_SUPABASE_ANON_KEY is not set. Stage polling will not work.');
+}
+
+const supabase = createClient(url ?? '', key ?? '');
+
+const POLL_MS = 2000;
+
+function poll(queryFn, onFound) {
+ let stopped = false;
+ let found = false;
+
+ async function tick() {
+ if (stopped) return;
+ try {
+ const result = await queryFn();
+ if (result && !found) {
+ found = true;
+ onFound(result);
+ }
+ } catch (err) {
+ console.warn('[SupabaseWatcher]', err.message);
+ }
+ if (!stopped && !found) setTimeout(tick, POLL_MS);
+ }
+
+ tick();
+ return () => { stopped = true; };
+}
+
+export function watchDisruptionSupabase(dId, onFound) {
+ return poll(async () => {
+ const { data, error } = await supabase
+ .from('disruptions')
+ .select('id,type,severity,location,epicenter_lat,epicenter_lng,affected_zones,confidence,raw_description,detected_at')
+ .eq('id', dId)
+ .limit(1);
+ if (error) throw new Error(error.message);
+ const row = data?.[0];
+ if (!row) return null;
+ return {
+ id: row.id,
+ type: row.type,
+ severity: row.severity,
+ location: row.location,
+ epicenterLat: row.epicenter_lat,
+ epicenterLng: row.epicenter_lng,
+ affectedZones: row.affected_zones || [],
+ confidence: row.confidence,
+ rawDescription: row.raw_description,
+ detectedAt: row.detected_at,
+ title: row.location || row.type,
+ };
+ }, onFound);
+}
+
+export function watchImpactSupabase(dId, onFound) {
+ return poll(async () => {
+ const { data, error } = await supabase
+ .from('impact_reports')
+ .select('id,disruption_id,cascade_risk,urgency,total_cargo_at_risk_usd,analysis_text,shipment_count,created_at')
+ .eq('disruption_id', dId)
+ .order('created_at', { ascending: false })
+ .limit(1);
+ if (error) throw new Error(error.message);
+ const row = data?.[0];
+ if (!row) return null;
+ return {
+ id: row.id,
+ disruptionId: row.disruption_id,
+ cascadeRisk: row.cascade_risk,
+ urgency: row.urgency,
+ totalCargoAtRiskUSD: row.total_cargo_at_risk_usd,
+ analysisText: row.analysis_text,
+ shipmentCount: row.shipment_count,
+ affectedShipments: Array.from({ length: row.shipment_count || 0 }),
+ createdAt: row.created_at,
+ };
+ }, onFound);
+}
+
+export function watchResolutionSupabase(dId, onFound) {
+ return poll(async () => {
+ const { data: resRows, error: resErr } = await supabase
+ .from('resolutions')
+ .select('id,disruption_id,impact_report_id,cascade_risk,urgency,total_cargo_at_risk_usd,analysis_text,option_count,status,created_at')
+ .eq('disruption_id', dId)
+ .order('created_at', { ascending: false })
+ .limit(1);
+ if (resErr) throw new Error(resErr.message);
+ if (!resRows?.[0]) return null;
+
+ const resRow = resRows[0];
+ const { data: optRows, error: optErr } = await supabase
+ .from('resolution_options')
+ .select('id,rank,title,description,cost_delta,time_delta,supplier_name,confidence,route_geojson,transport_mode,selected')
+ .eq('resolution_id', resRow.id)
+ .order('rank', { ascending: true });
+ if (optErr) throw new Error(optErr.message);
+ if (!optRows?.length) return null;
+
+ return {
+ resolution: {
+ id: resRow.id,
+ disruptionId: resRow.disruption_id,
+ impactReportId: resRow.impact_report_id,
+ cascadeRisk: resRow.cascade_risk,
+ urgency: resRow.urgency,
+ totalCargoAtRiskUSD: resRow.total_cargo_at_risk_usd,
+ analysisText: resRow.analysis_text,
+ optionCount: resRow.option_count,
+ status: resRow.status,
+ createdAt: resRow.created_at,
+ },
+ options: optRows.map((row) => ({
+ id: row.id,
+ rank: row.rank,
+ title: row.title,
+ description: row.description,
+ costDelta: row.cost_delta,
+ timeDelta: row.time_delta,
+ supplierName: row.supplier_name,
+ confidence: Math.round((row.confidence || 0) * 100),
+ route: row.route_geojson,
+ transportMode: row.transport_mode,
+ selected: row.selected,
+ carbonDeltaKg: row.route_geojson?.properties?.carbonDeltaKg || 0,
+ })),
+ };
+ }, onFound);
+}
diff --git a/dashboard/next.config.mjs b/dashboard/next.config.mjs
index de50340..cd164bc 100644
--- a/dashboard/next.config.mjs
+++ b/dashboard/next.config.mjs
@@ -9,10 +9,10 @@ const require = createRequire(import.meta.url);
const cesiumRoot = dirname(require.resolve('cesium/package.json'));
const cspHeader = `
default-src 'self';
- script-src 'self' 'unsafe-eval' 'unsafe-inline' https://cesium.com;
+ script-src 'self' 'unsafe-eval' 'unsafe-inline' https://cesium.com https://vercel.live;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
img-src 'self' data: blob: https://*.tile.openstreetmap.org https://ion.cesium.com https://dev.virtualearth.net https://*.virtualearth.net;
- connect-src 'self' https://*.supabase.co https://firestore.googleapis.com https://*.googleapis.com https://api.cesium.com https://ion.cesium.com https://assets.ion.cesium.com https://dev.virtualearth.net https://*.virtualearth.net https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://aisstream.io wss://stream.aisstream.io https://*.onrender.com wss: ws: http://localhost:*;
+ connect-src 'self' https://*.supabase.co https://firestore.googleapis.com https://*.googleapis.com https://api.cesium.com https://ion.cesium.com https://assets.ion.cesium.com https://dev.virtualearth.net https://*.virtualearth.net https://*.tile.openstreetmap.org https://tile.openstreetmap.org https://aisstream.io wss://stream.aisstream.io https://*.onrender.com https://vercel.live wss: ws: http://localhost:*;
font-src 'self' https://fonts.gstatic.com;
worker-src 'self' blob:;
frame-src 'none';
@@ -66,4 +66,4 @@ const nextConfig = {
},
};
-export default nextConfig;
\ No newline at end of file
+export default nextConfig;
diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json
index 2654f76..6ff55f1 100644
--- a/dashboard/package-lock.json
+++ b/dashboard/package-lock.json
@@ -8,6 +8,7 @@
"name": "dashboard",
"version": "0.1.0",
"dependencies": {
+ "@getbrevo/brevo": "^5.0.3",
"@radix-ui/react-tooltip": "^1.2.8",
"@supabase/supabase-js": "^2.49.8",
"cesium": "^1.140.0",
@@ -1139,6 +1140,14 @@
"integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
"license": "MIT"
},
+ "node_modules/@getbrevo/brevo": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@getbrevo/brevo/-/brevo-5.0.4.tgz",
+ "integrity": "sha512-wN4mHE6O0Pb/d/Dh3E4MAm2zCHbLLUcFF8/wgwTeMPy9KzHBYLu7S/nsJbzd0AWL09MHn8vwue8ULL9YOzluOQ==",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@google-cloud/firestore": {
"version": "7.11.6",
"resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz",
@@ -1157,23 +1166,23 @@
}
},
"node_modules/@google-cloud/firestore/node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"optional": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -1246,6 +1255,7 @@
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"license": "MIT",
"optional": true,
"bin": {
@@ -1284,22 +1294,22 @@
}
},
"node_modules/@grpc/proto-loader/node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -2208,9 +2218,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
@@ -2236,9 +2246,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
+ "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/path": {
@@ -2254,9 +2264,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
+ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause"
},
"node_modules/@radix-ui/primitive": {
@@ -2697,9 +2707,9 @@
}
},
"node_modules/@supabase/auth-js": {
- "version": "2.104.1",
- "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.104.1.tgz",
- "integrity": "sha512-pqFnDKekq1isqlqnzqzyJ3mzmho+o+FjfVTqhKY3PFlwj2anx3OPznO1kbo1ZEwD8zg1r4EAFf/7pplLyX0ocQ==",
+ "version": "2.105.1",
+ "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.105.1.tgz",
+ "integrity": "sha512-zc4s8Xg4truwE1Q4Q8M8oUVDARMd05pKh73NyQsMbYU1HDdDN2iiKzena/yu+yJze3WrD4c092FdckPiK1rLQw==",
"license": "MIT",
"dependencies": {
"tslib": "2.8.1"
@@ -2709,9 +2719,9 @@
}
},
"node_modules/@supabase/functions-js": {
- "version": "2.104.1",
- "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.104.1.tgz",
- "integrity": "sha512-JjAH4JN9rZzxh4plQnILPrQZXAG6ccoRS6z9hQAGmXpRSwJA+7CWbsDV2R82I8MROlGDsjqj1Ot/cWpTfdf6xg==",
+ "version": "2.105.1",
+ "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.105.1.tgz",
+ "integrity": "sha512-dTk1e7oE51VGc1lS2S0J0NLo0Wp4JYChj74ArJKbIWgoWuFwO0wcJYjeyOV3AAEpKst8/LQWUZOUKO1tRXBrpA==",
"license": "MIT",
"dependencies": {
"tslib": "2.8.1"
@@ -2721,15 +2731,15 @@
}
},
"node_modules/@supabase/phoenix": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.0.tgz",
- "integrity": "sha512-RHSx8bHS02xwfHdAbX5Lpbo6PXbgyf7lTaXTlwtFDPwOIw64NnVRwFAXGojHhjtVYI+PEPNSWwkL90f4agN3bw==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.1.tgz",
+ "integrity": "sha512-hWGJkDAfWUNY8k0C080u3sGNFd2ncl9erhKgP7hnGkgJWEfT5Pd/SXal4QmWXBECVlZrannMAc9sBaaRyWpiUA==",
"license": "MIT"
},
"node_modules/@supabase/postgrest-js": {
- "version": "2.104.1",
- "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.104.1.tgz",
- "integrity": "sha512-RqlLpvgXsjcc27fLyHNGm3zN0KDWXbkdTdaFtaEdX83RsTEqH7BAmshH7zoUMml5lL04naUeRjS3B81O6jZcJw==",
+ "version": "2.105.1",
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.105.1.tgz",
+ "integrity": "sha512-6SbtsoWC55xfsm7gbfLqvF+yIwTQEbjt+jFGf4klDpwSnUy17Hv5x0Dq52oqwTQlw6Ta0h1D5gTP0/pApqNojA==",
"license": "MIT",
"dependencies": {
"tslib": "2.8.1"
@@ -2739,12 +2749,12 @@
}
},
"node_modules/@supabase/realtime-js": {
- "version": "2.104.1",
- "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.104.1.tgz",
- "integrity": "sha512-dVJHhFB2ErBd0/2qE9G8CedCrGoAtBfL9Q4zbSMXO7b1Cpld916ljSiX21mURUqijPf1WoPQG4Bp/averUzk/g==",
+ "version": "2.105.1",
+ "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.105.1.tgz",
+ "integrity": "sha512-3X3cUEl5cJ4lRQHr1hXHx0b98OaL97RRO2vrRZ98FD91JV/MquZHhrGJSv/+IkOnjF6E2e0RUOxE8P3Zi035ow==",
"license": "MIT",
"dependencies": {
- "@supabase/phoenix": "^0.4.0",
+ "@supabase/phoenix": "^0.4.1",
"@types/ws": "^8.18.1",
"tslib": "2.8.1",
"ws": "^8.18.2"
@@ -2754,9 +2764,9 @@
}
},
"node_modules/@supabase/storage-js": {
- "version": "2.104.1",
- "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.104.1.tgz",
- "integrity": "sha512-2bQaLbkRshctkUVuqamwYZDEd+0cGSc9DY9sjh92DcA5hu1F/1AP8p6gxGr76sgdK9Ngi0rh+2Kdh+uC4hcnGA==",
+ "version": "2.105.1",
+ "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.105.1.tgz",
+ "integrity": "sha512-owfdCNH5ikXXDusjzsgU6LavEBqGUoueOnL/9XIucld70/WJ/rbqp89K//c9QPICDNuegsmpoeasydDAiucLKQ==",
"license": "MIT",
"dependencies": {
"iceberg-js": "^0.8.1",
@@ -2767,16 +2777,16 @@
}
},
"node_modules/@supabase/supabase-js": {
- "version": "2.104.1",
- "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.104.1.tgz",
- "integrity": "sha512-E0H/CtVmaGjiAy+ieZ5ZB/1EqxXcGdaFaAc23AE5zaYfz6NtCNDcmaEdoGPYMPFH5pE6drGG6e3ljPmkFoGVxQ==",
+ "version": "2.105.1",
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.105.1.tgz",
+ "integrity": "sha512-4gn6HmsAkCCVU7p8JmgKGhHJ5Btod4ZzSp8qKZf4JHaTxbhaIK86/usHzeLxWv7EJJDhBmILDmJOSOf9iF4CLA==",
"license": "MIT",
"dependencies": {
- "@supabase/auth-js": "2.104.1",
- "@supabase/functions-js": "2.104.1",
- "@supabase/postgrest-js": "2.104.1",
- "@supabase/realtime-js": "2.104.1",
- "@supabase/storage-js": "2.104.1"
+ "@supabase/auth-js": "2.105.1",
+ "@supabase/functions-js": "2.105.1",
+ "@supabase/postgrest-js": "2.105.1",
+ "@supabase/realtime-js": "2.105.1",
+ "@supabase/storage-js": "2.105.1"
},
"engines": {
"node": ">=20.0.0"
@@ -3359,17 +3369,17 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz",
- "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz",
+ "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.59.0",
- "@typescript-eslint/type-utils": "8.59.0",
- "@typescript-eslint/utils": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0",
+ "@typescript-eslint/scope-manager": "8.59.1",
+ "@typescript-eslint/type-utils": "8.59.1",
+ "@typescript-eslint/utils": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0"
@@ -3382,7 +3392,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.59.0",
+ "@typescript-eslint/parser": "^8.59.1",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
@@ -3398,16 +3408,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz",
- "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz",
+ "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.59.0",
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0",
+ "@typescript-eslint/scope-manager": "8.59.1",
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1",
"debug": "^4.4.3"
},
"engines": {
@@ -3423,14 +3433,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz",
- "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz",
+ "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.59.0",
- "@typescript-eslint/types": "^8.59.0",
+ "@typescript-eslint/tsconfig-utils": "^8.59.1",
+ "@typescript-eslint/types": "^8.59.1",
"debug": "^4.4.3"
},
"engines": {
@@ -3445,14 +3455,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz",
- "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz",
+ "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0"
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3463,9 +3473,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz",
- "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz",
+ "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3480,15 +3490,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz",
- "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz",
+ "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0",
- "@typescript-eslint/utils": "8.59.0",
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1",
+ "@typescript-eslint/utils": "8.59.1",
"debug": "^4.4.3",
"ts-api-utils": "^2.5.0"
},
@@ -3505,9 +3515,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz",
- "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz",
+ "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3519,16 +3529,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz",
- "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz",
+ "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.59.0",
- "@typescript-eslint/tsconfig-utils": "8.59.0",
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0",
+ "@typescript-eslint/project-service": "8.59.1",
+ "@typescript-eslint/tsconfig-utils": "8.59.1",
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
@@ -3599,16 +3609,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz",
- "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz",
+ "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.59.0",
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0"
+ "@typescript-eslint/scope-manager": "8.59.1",
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3623,13 +3633,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz",
- "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz",
+ "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.0",
+ "@typescript-eslint/types": "8.59.1",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -4546,9 +4556,9 @@
}
},
"node_modules/axe-core": {
- "version": "4.11.3",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.3.tgz",
- "integrity": "sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg==",
+ "version": "4.11.4",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz",
+ "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==",
"dev": true,
"license": "MPL-2.0",
"engines": {
@@ -4614,9 +4624,9 @@
"optional": true
},
"node_modules/baseline-browser-mapping": {
- "version": "2.10.22",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.22.tgz",
- "integrity": "sha512-6qruVrb5rse6WylFkU0FhBKKGuecWseqdpQfhkawn6ztyk2QlfwSRjsDxMCLJrkfmfN21qvhl9ABgaMeRkuwww==",
+ "version": "2.10.24",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz",
+ "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==",
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.cjs"
@@ -5500,9 +5510,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.344",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz",
- "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==",
+ "version": "1.5.345",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.345.tgz",
+ "integrity": "sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@@ -6470,6 +6480,7 @@
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -6639,6 +6650,7 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -6888,23 +6900,23 @@
}
},
"node_modules/google-gax/node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"optional": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -6916,6 +6928,7 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -8588,9 +8601,9 @@
"license": "ISC"
},
"node_modules/lucide-react": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.11.0.tgz",
- "integrity": "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==",
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.14.0.tgz",
+ "integrity": "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA==",
"license": "ISC",
"peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
@@ -10132,9 +10145,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.10",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz",
- "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",
+ "version": "8.5.12",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz",
+ "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==",
"dev": true,
"funding": [
{
@@ -10219,23 +10232,23 @@
}
},
"node_modules/proto3-json-serializer/node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"optional": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -10244,22 +10257,12 @@
}
},
"node_modules/protobufjs": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.1.tgz",
- "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.3.tgz",
+ "integrity": "sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"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": ">=13.7.0",
"long": "^5.0.0"
},
@@ -11566,6 +11569,7 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -11896,16 +11900,16 @@
}
},
"node_modules/typescript-eslint": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz",
- "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==",
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.1.tgz",
+ "integrity": "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.59.0",
- "@typescript-eslint/parser": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0",
- "@typescript-eslint/utils": "8.59.0"
+ "@typescript-eslint/eslint-plugin": "8.59.1",
+ "@typescript-eslint/parser": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1",
+ "@typescript-eslint/utils": "8.59.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -12160,7 +12164,9 @@
}
},
"node_modules/uuid": {
- "version": "11.1.0",
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz",
+ "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -12309,9 +12315,9 @@
}
},
"node_modules/webpack-sources": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.0.tgz",
- "integrity": "sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==",
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz",
+ "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==",
"license": "MIT",
"peer": true,
"engines": {
@@ -12642,9 +12648,9 @@
}
},
"node_modules/zod": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
- "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.1.tgz",
+ "integrity": "sha512-a6ENMBBGZBsnlSebQ/eKCguSBeGKSf4O7BPnqVPmYGtpBYI7VSqoVqw+QcB7kPRjbqPwhYTpFbVj/RqNz/CT0Q==",
"dev": true,
"license": "MIT",
"funding": {
diff --git a/dashboard/package.json b/dashboard/package.json
index a6984d3..c6c27e2 100644
--- a/dashboard/package.json
+++ b/dashboard/package.json
@@ -9,6 +9,7 @@
"lint": "eslint"
},
"dependencies": {
+ "@getbrevo/brevo": "^5.0.3",
"@radix-ui/react-tooltip": "^1.2.8",
"@supabase/supabase-js": "^2.49.8",
"cesium": "^1.140.0",
diff --git a/dashboard/public/theme-init.js b/dashboard/public/theme-init.js
new file mode 100644
index 0000000..be11b36
--- /dev/null
+++ b/dashboard/public/theme-init.js
@@ -0,0 +1,12 @@
+(function() {
+ try {
+ var t = localStorage.getItem('gdg_theme');
+ if (t === 'light' || t === 'dark') {
+ document.documentElement.setAttribute('data-theme', t);
+ } else {
+ document.documentElement.setAttribute('data-theme', 'dark');
+ }
+ } catch(e) {
+ document.documentElement.setAttribute('data-theme', 'dark');
+ }
+})();
diff --git a/disruption/api/events.service.js b/disruption/api/events.service.js
index 3e64352..82ec538 100644
--- a/disruption/api/events.service.js
+++ b/disruption/api/events.service.js
@@ -249,7 +249,7 @@ export async function classifyAndPublish(rawDescription, traceId = null) {
: nonParseErrors;
const disruptionEvent = createDisruptionEvent({ ...parsed, rawDescription });
validateDisruptionEvent(disruptionEvent);
- await db.collection('disruptions').doc(disruptionEvent.id).set({
+ db.collection('disruptions').doc(disruptionEvent.id).set({
...disruptionEvent,
systemPromptSnapshot: SYSTEM_PROMPT.slice(0, 2000),
inputPayloadSnapshot: rawDescription.slice(0, 3000),
@@ -261,6 +261,8 @@ export async function classifyAndPublish(rawDescription, traceId = null) {
parseRetries: retriesUsed,
corroboratingSources,
},
+ }).catch((err) => {
+ console.warn('[DisruptionService] Firestore write failed (non-fatal):', err.message);
});
const { queued } = await resilientUpsert('disruptions', {
id: disruptionEvent.id,
diff --git a/disruption/package-lock.json b/disruption/package-lock.json
index 933f60c..5c6fb2f 100644
--- a/disruption/package-lock.json
+++ b/disruption/package-lock.json
@@ -18,7 +18,9 @@
"eventsource": "^2.0.2",
"fastify": "^5.0.0",
"firebase-admin": "^12.0.0",
+ "playwright-core": "^1.40.0",
"puppeteer": "^21.0.0",
+ "resend": "^1.0.0",
"uuid": "^9.0.0",
"ws": "^8.17.1"
},
@@ -353,6 +355,7 @@
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"license": "MIT",
"optional": true,
"bin": {
@@ -381,7 +384,7 @@
"node": ">=12.10.0"
}
},
- "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": {
+ "node_modules/@grpc/proto-loader": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz",
"integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==",
@@ -399,23 +402,21 @@
"node": ">=6"
}
},
- "node_modules/@grpc/proto-loader": {
- "version": "0.7.15",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
- "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
- "license": "Apache-2.0",
- "optional": true,
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
"dependencies": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.2.5",
- "yargs": "^17.7.2"
- },
- "bin": {
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=12"
}
},
"node_modules/@js-sdsl/ordered-map": {
@@ -441,6 +442,12 @@
"license": "MIT",
"optional": true
},
+ "node_modules/@one-ini/wasm": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
+ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
+ "license": "MIT"
+ },
"node_modules/@opentelemetry/api": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz",
@@ -541,6 +548,21 @@
"@opentelemetry/api": "^1.9.0"
}
},
+ "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/context-async-hooks": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.7.0.tgz",
@@ -554,9 +576,9 @@
}
},
"node_modules/@opentelemetry/core": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
- "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz",
+ "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -588,6 +610,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.215.0.tgz",
@@ -607,6 +644,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.215.0.tgz",
@@ -628,6 +680,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.215.0.tgz",
@@ -650,6 +733,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.215.0.tgz",
@@ -669,6 +783,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.215.0.tgz",
@@ -689,6 +834,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-prometheus": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.215.0.tgz",
@@ -707,6 +883,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.215.0.tgz",
@@ -728,6 +935,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.215.0.tgz",
@@ -747,6 +985,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.215.0.tgz",
@@ -766,6 +1035,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-zipkin": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.0.tgz",
@@ -784,6 +1084,37 @@
"@opentelemetry/api": "^1.0.0"
}
},
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/instrumentation": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.215.0.tgz",
@@ -1060,7 +1391,22 @@
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
"node_modules/@opentelemetry/instrumentation-ioredis": {
@@ -1477,6 +1823,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-grpc-exporter-base": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.215.0.tgz",
@@ -1495,6 +1856,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.215.0.tgz",
@@ -1516,23 +1892,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer/node_modules/protobufjs": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.1.tgz",
- "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.3.tgz",
+ "integrity": "sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"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": ">=13.7.0",
"long": "^5.0.0"
},
@@ -1555,6 +1952,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/propagator-jaeger": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.7.0.tgz",
@@ -1570,6 +1982,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/redis-common": {
"version": "0.38.3",
"resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz",
@@ -1580,9 +2007,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.5.tgz",
- "integrity": "sha512-KtbVu0Q+I+yg2/fL0pINxekNrejmxw9gpXB8rc3L8WAA0BXnKEp6KEe/glHyzyXOD8V2eZ+AfaoZixFp76ZJDw==",
+ "version": "0.33.6",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.6.tgz",
+ "integrity": "sha512-ESA169b7uRy7RWoAb59CRRXLCr6mlEvhoZDEJkAASWYc/udCNaMv7T4vvObgjXEkCUDqCNlibvtLwKkEozGsrA==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1596,9 +2023,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-aws": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.15.0.tgz",
- "integrity": "sha512-+aiEkI+JA94XVIJtltt3XKYbLSaHRqHFdvGOwulBpfNKtEIWDEkKm3qfTl7Q0q9gY9621oXMU1sT5MM7koCnyA==",
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.16.0.tgz",
+ "integrity": "sha512-vD9bb47DJvwn2btrWLFR9GGz5wxejqntZLuyrDJ0l48NMdErrJxWa/+IScaLj8hDe0iyZs/TY1MZRbFX+EUlrg==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1630,9 +2057,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-container": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.6.tgz",
- "integrity": "sha512-b3/SzjmbANgZYfQn40+Mx5Bl0f4IIRTrCRSTN3FQ7j1KB8h3jl+JeJpFZZFY1OU5BtDFXI7VQ334SbKi5Z2R1A==",
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.7.tgz",
+ "integrity": "sha512-Yv66OD7DeN6OaMVSslcdffjNXJ6NEB08Pz98a06wrNH3F/SCzY5xUBPesYNH9fjhom6u9/wblz6ocxW/fhneow==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1662,71 +2089,56 @@
"@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/data-uri-to-buffer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
- "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
- "license": "MIT",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gaxios": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
- "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
+ "node_modules/@opentelemetry/resources": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz",
+ "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==",
"license": "Apache-2.0",
"dependencies": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "node-fetch": "^3.3.2"
+ "@opentelemetry/core": "2.7.1",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
- "node": ">=18"
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gcp-metadata": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
- "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
+ "node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.215.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.215.0.tgz",
+ "integrity": "sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==",
"license": "Apache-2.0",
"dependencies": {
- "gaxios": "^7.0.0",
- "google-logging-utils": "^1.0.0",
- "json-bigint": "^1.0.0"
+ "@opentelemetry/api-logs": "0.215.0",
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
- "node": ">=18"
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/google-logging-utils": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
- "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
"license": "Apache-2.0",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/node-fetch": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
- "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
- "license": "MIT",
"dependencies": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": "^18.19.0 || >=20.6.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/node-fetch"
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resources": {
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
"integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
@@ -1742,38 +2154,51 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/sdk-logs": {
- "version": "0.215.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.215.0.tgz",
- "integrity": "sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==",
+ "node_modules/@opentelemetry/sdk-metrics": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
+ "integrity": "sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==",
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/api-logs": "0.215.0",
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/resources": "2.7.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.9.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/sdk-metrics": {
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
- "integrity": "sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0"
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.9.0 <1.10.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
"node_modules/@opentelemetry/sdk-node": {
@@ -1815,6 +2240,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-base": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.0.tgz",
@@ -1832,6 +2288,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-node": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.7.0.tgz",
@@ -1849,6 +2336,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/semantic-conventions": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
@@ -1879,6 +2381,16 @@
"integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==",
"license": "MIT"
},
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
@@ -1892,9 +2404,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
@@ -1920,9 +2432,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
+ "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/path": {
@@ -1938,9 +2450,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
+ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause"
},
"node_modules/@puppeteer/browsers": {
@@ -1987,6 +2499,34 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"license": "MIT"
},
+ "node_modules/@react-email/render": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.7.tgz",
+ "integrity": "sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==",
+ "license": "MIT",
+ "dependencies": {
+ "html-to-text": "9.0.3",
+ "pretty": "2.0.0",
+ "react": "18.2.0",
+ "react-dom": "18.2.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@selderee/plugin-htmlparser2": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.10.0.tgz",
+ "integrity": "sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "selderee": "^0.10.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/killymxi"
+ }
+ },
"node_modules/@supabase/auth-js": {
"version": "2.105.1",
"resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.105.1.tgz",
@@ -2247,6 +2787,15 @@
"@types/node": "*"
}
},
+ "node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -2330,24 +2879,24 @@
}
},
"node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
"engines": {
- "node": ">=8"
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
@@ -2441,20 +2990,6 @@
"fastq": "^1.17.1"
}
},
- "node_modules/b4a": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
- "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
- "license": "Apache-2.0",
- "peerDependencies": {
- "react-native-b4a": "*"
- },
- "peerDependenciesMeta": {
- "react-native-b4a": {
- "optional": true
- }
- }
- },
"node_modules/balanced-match": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
@@ -2522,9 +3057,9 @@
}
},
"node_modules/bare-stream": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz",
- "integrity": "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==",
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz",
+ "integrity": "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==",
"license": "Apache-2.0",
"dependencies": {
"streamx": "^2.25.0",
@@ -2577,9 +3112,9 @@
"license": "MIT"
},
"node_modules/basic-ftp": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.0.tgz",
- "integrity": "sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz",
+ "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -2801,6 +3336,79 @@
"node": ">=12"
}
},
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -2832,6 +3440,39 @@
"node": ">= 0.8"
}
},
+ "node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/condense-newlines": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz",
+ "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==",
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-whitespace": "^0.3.0",
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
"node_modules/cookie": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
@@ -2880,6 +3521,20 @@
"node-fetch": "^2.6.12"
}
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/css-select": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
@@ -2934,6 +3589,15 @@
}
}
},
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/degenerator": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
@@ -3068,6 +3732,12 @@
"stream-shift": "^1.0.2"
}
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -3077,10 +3747,58 @@
"safe-buffer": "^5.0.1"
}
},
+ "node_modules/editorconfig": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz",
+ "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@one-ini/wasm": "0.1.1",
+ "commander": "^10.0.0",
+ "minimatch": "^9.0.1",
+ "semver": "^7.5.3"
+ },
+ "bin": {
+ "editorconfig": "bin/editorconfig"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/editorconfig/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/editorconfig/node_modules/brace-expansion": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/editorconfig/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"license": "MIT"
},
"node_modules/encoding-sniffer": {
@@ -3279,6 +3997,18 @@
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"license": "MIT"
},
+ "node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
@@ -3585,6 +4315,7 @@
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -3594,6 +4325,22 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/form-data": {
"version": "2.5.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz",
@@ -3660,38 +4407,78 @@
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
"license": "MIT",
- "optional": true
+ "optional": true
+ },
+ "node_modules/gaxios": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
+ "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.6.9",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/gcp-metadata": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
+ "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "gaxios": "^7.0.0",
+ "google-logging-utils": "^1.0.0",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/data-uri-to-buffer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
},
- "node_modules/gaxios": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz",
- "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==",
+ "node_modules/gcp-metadata/node_modules/gaxios": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
+ "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
"license": "Apache-2.0",
- "optional": true,
"dependencies": {
"extend": "^3.0.2",
"https-proxy-agent": "^7.0.1",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.9",
- "uuid": "^9.0.1"
+ "node-fetch": "^3.3.2"
},
"engines": {
- "node": ">=14"
+ "node": ">=18"
}
},
- "node_modules/gcp-metadata": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
- "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
- "license": "Apache-2.0",
- "optional": true,
+ "node_modules/gcp-metadata/node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "license": "MIT",
"dependencies": {
- "gaxios": "^6.1.1",
- "google-logging-utils": "^0.0.2",
- "json-bigint": "^1.0.0"
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
},
"engines": {
- "node": ">=14"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
}
},
"node_modules/get-caller-file": {
@@ -3771,6 +4558,27 @@
"node": ">= 14"
}
},
+ "node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -3784,6 +4592,36 @@
"node": ">= 6"
}
},
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/google-auth-library": {
"version": "9.15.1",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz",
@@ -3802,6 +4640,31 @@
"node": ">=14"
}
},
+ "node_modules/google-auth-library/node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/google-gax": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz",
@@ -3826,12 +4689,30 @@
"node": ">=14"
}
},
- "node_modules/google-logging-utils": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
- "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "node_modules/google-gax/node_modules/@grpc/proto-loader": {
+ "version": "0.7.15",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
+ "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
"license": "Apache-2.0",
"optional": true,
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.2.5",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/google-logging-utils": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=14"
}
@@ -3932,6 +4813,41 @@
"license": "MIT",
"optional": true
},
+ "node_modules/html-to-text": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.3.tgz",
+ "integrity": "sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==",
+ "license": "MIT",
+ "dependencies": {
+ "@selderee/plugin-htmlparser2": "^0.10.0",
+ "deepmerge": "^4.2.2",
+ "dom-serializer": "^2.0.0",
+ "htmlparser2": "^8.0.1",
+ "selderee": "^0.10.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/html-to-text/node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
"node_modules/htmlparser2": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
@@ -4081,10 +4997,16 @@
"license": "ISC",
"optional": true
},
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
"node_modules/ip-address": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
- "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.1.tgz",
+ "integrity": "sha512-1FMu8/N15Ck1BL551Jf42NYIoin2unWjLQ2Fze/DXryJRl5twqtwNHlO39qERGbIOcKYWHdgRryhOC+NG4eaLw==",
"license": "MIT",
"engines": {
"node": ">= 12"
@@ -4118,6 +5040,21 @@
"node": ">=8"
}
},
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "license": "MIT"
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -4173,6 +5110,36 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-whitespace": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz",
+ "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jose": {
"version": "4.15.9",
"resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz",
@@ -4182,6 +5149,36 @@
"url": "https://github.com/sponsors/panva"
}
},
+ "node_modules/js-beautify": {
+ "version": "1.15.4",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz",
+ "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==",
+ "license": "MIT",
+ "dependencies": {
+ "config-chain": "^1.1.13",
+ "editorconfig": "^1.0.4",
+ "glob": "^10.4.2",
+ "js-cookie": "^3.0.5",
+ "nopt": "^7.2.1"
+ },
+ "bin": {
+ "css-beautify": "js/bin/css-beautify.js",
+ "html-beautify": "js/bin/html-beautify.js",
+ "js-beautify": "js/bin/js-beautify.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
+ "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -4299,6 +5296,27 @@
"safe-buffer": "^5.0.1"
}
},
+ "node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/leac": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz",
+ "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://ko-fi.com/killymxi"
+ }
+ },
"node_modules/light-my-request": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz",
@@ -4407,6 +5425,18 @@
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
"license": "Apache-2.0"
},
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -4491,6 +5521,15 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
@@ -4602,6 +5641,21 @@
"url": "https://opencollective.com/nodemon"
}
},
+ "node_modules/nopt": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -4700,6 +5754,12 @@
"node": ">= 14"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -4779,6 +5839,19 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
+ "node_modules/parseley": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.11.0.tgz",
+ "integrity": "sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "leac": "^0.6.0",
+ "peberminta": "^0.8.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/killymxi"
+ }
+ },
"node_modules/path-expression-matcher": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz",
@@ -4795,6 +5868,46 @@
"node": ">=14.0.0"
}
},
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/peberminta": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz",
+ "integrity": "sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://ko-fi.com/killymxi"
+ }
+ },
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -4888,6 +6001,18 @@
"integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==",
"license": "MIT"
},
+ "node_modules/playwright-core": {
+ "version": "1.59.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz",
+ "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==",
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/postgres-array": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
@@ -4921,7 +6046,21 @@
"integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
"license": "MIT",
"dependencies": {
- "xtend": "^4.0.0"
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pretty": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz",
+ "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==",
+ "license": "MIT",
+ "dependencies": {
+ "condense-newlines": "^0.2.1",
+ "extend-shallow": "^2.0.1",
+ "js-beautify": "^1.6.12"
},
"engines": {
"node": ">=0.10.0"
@@ -4952,6 +6091,12 @@
"node": ">=0.4.0"
}
},
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "license": "ISC"
+ },
"node_modules/proto3-json-serializer": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz",
@@ -4966,22 +6111,22 @@
}
},
"node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -5126,6 +6271,31 @@
"integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==",
"license": "MIT"
},
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -5194,6 +6364,19 @@
"node": ">=9.3.0 || >=8.10.0 <9.0.0"
}
},
+ "node_modules/resend": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/resend/-/resend-1.1.0.tgz",
+ "integrity": "sha512-it8TIDVT+/gAiJsUlv2tdHuvzwCCv4Zwu+udDqIm/dIuByQwe68TtFDcPccxqpSVVrNCBxxXLzsdT1tsV+P3GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-email/render": "0.0.7",
+ "type-fest": "3.13.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -5310,6 +6493,15 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"license": "MIT"
},
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
"node_modules/secure-json-parse": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz",
@@ -5326,6 +6518,18 @@
],
"license": "BSD-3-Clause"
},
+ "node_modules/selderee": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.10.0.tgz",
+ "integrity": "sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==",
+ "license": "MIT",
+ "dependencies": {
+ "parseley": "^0.11.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/killymxi"
+ }
+ },
"node_modules/semver": {
"version": "7.7.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
@@ -5344,6 +6548,39 @@
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/simple-update-notifier": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
@@ -5368,12 +6605,12 @@
}
},
"node_modules/socks": {
- "version": "2.8.7",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
- "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.8.tgz",
+ "integrity": "sha512-NlGELfPrgX2f1TAAcz0WawlLn+0r3FyhhCRpFFK2CemXenPYvzMWWZINv3eDNo9ucdwme7oCHRY0Jnbs4aIkog==",
"license": "MIT",
"dependencies": {
- "ip-address": "^10.0.1",
+ "ip-address": "^10.1.1",
"smart-buffer": "^4.2.0"
},
"engines": {
@@ -5462,6 +6699,24 @@
}
},
"node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
@@ -5475,7 +6730,50 @@
"node": ">=8"
}
},
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
@@ -5487,6 +6785,15 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strnum": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz",
@@ -5532,9 +6839,9 @@
}
},
"node_modules/tar-stream": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz",
- "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz",
+ "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==",
"license": "MIT",
"dependencies": {
"b4a": "^1.6.4",
@@ -5543,6 +6850,20 @@
"streamx": "^2.15.0"
}
},
+ "node_modules/tar-stream/node_modules/b4a": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
+ "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
"node_modules/teeny-request": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
@@ -5620,6 +6941,20 @@
"b4a": "^1.6.4"
}
},
+ "node_modules/text-decoder/node_modules/b4a": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
+ "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
"node_modules/thread-stream": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz",
@@ -5682,6 +7017,18 @@
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
+ "node_modules/type-fest": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.0.tgz",
+ "integrity": "sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/unbzip2-stream": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -5731,6 +7078,7 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -5810,7 +7158,40 @@
"webidl-conversions": "^3.0.0"
}
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
@@ -5827,6 +7208,62 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -5920,6 +7357,47 @@
"node": ">=12"
}
},
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
diff --git a/disruption/tools/aisStreamTool.js b/disruption/tools/aisStreamTool.js
index 8c4b992..fcd8368 100644
--- a/disruption/tools/aisStreamTool.js
+++ b/disruption/tools/aisStreamTool.js
@@ -1,13 +1,9 @@
import WebSocket from 'ws';
-import { db } from '../shared/db/firebase.js';
import { resilientUpsert } from '../shared/db/supabase.js';
const AIS_WS_URL = 'wss://stream.aisstream.io/v0/stream';
let ws = null;
-const pendingVesselWrites = new Map();
-let vesselFlushTimer = null;
let reconnectTimer = null;
-const MAX_PENDING_VESSEL_WRITES = Number.parseInt(process.env.AIS_MAX_PENDING_WRITES ?? '5000', 10);
function scheduleReconnect(connect) {
if (reconnectTimer) return;
@@ -17,28 +13,6 @@ function scheduleReconnect(connect) {
}, 10000);
}
-function scheduleVesselFlush() {
- if (vesselFlushTimer) return;
- vesselFlushTimer = setTimeout(async () => {
- vesselFlushTimer = null;
- if (!pendingVesselWrites.size) return;
-
- const entries = [...pendingVesselWrites.entries()];
- pendingVesselWrites.clear();
-
- try {
- const batch = db.batch();
- for (const [mmsi, position] of entries) {
- batch.set(db.collection('vesselPositions').doc(mmsi), position, { merge: true });
- }
- await batch.commit();
- } catch (err) {
- console.warn('[AIS] Batch flush failed:', err.message);
- }
- }, 5000);
- vesselFlushTimer.unref?.();
-}
-
export const MAJOR_CORRIDORS = [
[[20, 25], [32, 45]],
[[-5, 99], [5, 105]],
@@ -70,21 +44,6 @@ export function startAISStream(boundingBoxes = MAJOR_CORRIDORS) {
if (!pos) return;
const mmsi = String(pos.UserID || '');
if (!mmsi) return;
- const position = {
- mmsi,
- lat: Number(pos.Latitude),
- lng: Number(pos.Longitude),
- speed: Number(pos.Sog || 0),
- heading: Number(pos.TrueHeading || 0),
- status: Number(pos.NavigationalStatus || 0),
- updatedAt: new Date().toISOString(),
- };
- if (pendingVesselWrites.size >= MAX_PENDING_VESSEL_WRITES) {
- const oldestKey = pendingVesselWrites.keys().next().value;
- if (oldestKey) pendingVesselWrites.delete(oldestKey);
- }
- pendingVesselWrites.set(mmsi, position);
- scheduleVesselFlush();
await resilientUpsert('vessel_positions', {
mmsi,
lat: Number(pos.Latitude),
diff --git a/docs/smoketest/smoke-20260429-013958.json b/docs/smoketest/smoke-20260429-013958.json
new file mode 100644
index 0000000..21955a7
--- /dev/null
+++ b/docs/smoketest/smoke-20260429-013958.json
@@ -0,0 +1,120 @@
+{
+ "timestamp": "2026-04-28T20:09:58.438Z",
+ "traceId": "smoke-20260429-013958",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260429-013958.log",
+ "jsonPath": "docs/smoketest/smoke-20260429-013958.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 169,
+ "error": "fetch failed"
+ },
+ "metrics": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 4,
+ "error": "fetch failed"
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 8,
+ "error": "fetch failed"
+ },
+ "metrics": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 4,
+ "error": "fetch failed"
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 11,
+ "error": "fetch failed"
+ },
+ "metrics": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 3,
+ "error": "fetch failed"
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 19,
+ "error": "fetch failed"
+ },
+ "metrics": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 9,
+ "error": "fetch failed"
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 16,
+ "error": "fetch failed"
+ },
+ "metrics": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 7,
+ "error": "fetch failed"
+ }
+ }
+ ],
+ "baselineMessageCounts": {},
+ "postDisruption": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 16,
+ "error": "fetch failed"
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {},
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 0,
+ "resolution-options": 0,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 0,
+ "elapsedMs": 15,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": "fetch failed"
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260429-013958.log b/docs/smoketest/smoke-20260429-013958.log
new file mode 100644
index 0000000..75e6a1d
--- /dev/null
+++ b/docs/smoketest/smoke-20260429-013958.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-28T20:09:58.438Z
+Trace ID: smoke-20260429-013958
+[event-bus] /health -> 0 (169ms)
+[event-bus] /metrics -> 0 (4ms)
+[disruption] /health -> 0 (8ms)
+[disruption] /metrics -> 0 (4ms)
+[impact] /health -> 0 (11ms)
+[impact] /metrics -> 0 (3ms)
+[resolution] /health -> 0 (19ms)
+[resolution] /metrics -> 0 (9ms)
+[news-intel] /health -> 0 (16ms)
+[news-intel] /metrics -> 0 (7ms)
+Baseline counts: {}
+POST /events -> 0 (16ms)
+Post counts: {}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260429-013958 -> 0 (15ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (2.6028ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (182.356ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (175.2069ms)
+ ✔ fetchFlexportTracking maps scraper output (4.8798ms)
+ ✔ syncFlexportShipments updates active shipments (5.2135ms)
+ ✔ fetchVesselDetails parses public vessel metadata (183.4763ms)
+ ✔ fetchVesselsInPort parses vessel table rows (24.2269ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (164.9806ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 3744.8651
+ -> exit 0
diff --git a/docs/smoketest/smoke-20260430-095044.json b/docs/smoketest/smoke-20260430-095044.json
new file mode 100644
index 0000000..369ffa0
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-095044.json
@@ -0,0 +1,130 @@
+{
+ "timestamp": "2026-04-30T04:20:44.881Z",
+ "traceId": "smoke-20260430-095044",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260430-095044.log",
+ "jsonPath": "docs/smoketest/smoke-20260430-095044.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 105,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 12,
+ "error": null
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 11,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 53,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 22,
+ "error": null
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 31,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 13,
+ "error": null
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 26,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ }
+ }
+ ],
+ "baselineMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "postDisruption": {
+ "ok": true,
+ "status": 201,
+ "elapsedMs": 178,
+ "error": null
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 0,
+ "resolution-options": 0,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 404,
+ "elapsedMs": 145,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": null
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260430-095044.log b/docs/smoketest/smoke-20260430-095044.log
new file mode 100644
index 0000000..8e100cc
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-095044.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-30T04:20:44.881Z
+Trace ID: smoke-20260430-095044
+[event-bus] /health -> 200 (105ms)
+[event-bus] /metrics -> 200 (12ms)
+[disruption] /health -> 200 (11ms)
+[disruption] /metrics -> 200 (8ms)
+[impact] /health -> 200 (53ms)
+[impact] /metrics -> 200 (22ms)
+[resolution] /health -> 200 (31ms)
+[resolution] /metrics -> 200 (13ms)
+[news-intel] /health -> 200 (26ms)
+[news-intel] /metrics -> 200 (10ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (178ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-095044 -> 404 (145ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.2856ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (160.1512ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (128.751ms)
+ ✔ fetchFlexportTracking maps scraper output (12.4274ms)
+ ✔ syncFlexportShipments updates active shipments (1.9974ms)
+ ✔ fetchVesselDetails parses public vessel metadata (70.5352ms)
+ ✔ fetchVesselsInPort parses vessel table rows (21.2153ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (171.3425ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2854.1775
+ -> exit 0
diff --git a/docs/smoketest/smoke-20260430-095210.json b/docs/smoketest/smoke-20260430-095210.json
new file mode 100644
index 0000000..c56dc9f
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-095210.json
@@ -0,0 +1,130 @@
+{
+ "timestamp": "2026-04-30T04:22:10.567Z",
+ "traceId": "smoke-20260430-095210",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260430-095210.log",
+ "jsonPath": "docs/smoketest/smoke-20260430-095210.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 150,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 11,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 15,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 12,
+ "error": null
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 38,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ }
+ }
+ ],
+ "baselineMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "postDisruption": {
+ "ok": true,
+ "status": 201,
+ "elapsedMs": 182,
+ "error": null
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 0,
+ "resolution-options": 0,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 404,
+ "elapsedMs": 61,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": null
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260430-095210.log b/docs/smoketest/smoke-20260430-095210.log
new file mode 100644
index 0000000..692e4d8
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-095210.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-30T04:22:10.567Z
+Trace ID: smoke-20260430-095210
+[event-bus] /health -> 200 (150ms)
+[event-bus] /metrics -> 200 (8ms)
+[disruption] /health -> 200 (11ms)
+[disruption] /metrics -> 200 (8ms)
+[impact] /health -> 200 (15ms)
+[impact] /metrics -> 200 (12ms)
+[resolution] /health -> 200 (10ms)
+[resolution] /metrics -> 200 (8ms)
+[news-intel] /health -> 200 (38ms)
+[news-intel] /metrics -> 200 (10ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (182ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-095210 -> 404 (61ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.6289ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (128.9232ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (160.479ms)
+ ✔ fetchFlexportTracking maps scraper output (8.2625ms)
+ ✔ syncFlexportShipments updates active shipments (1.6428ms)
+ ✔ fetchVesselDetails parses public vessel metadata (212.4411ms)
+ ✔ fetchVesselsInPort parses vessel table rows (50.1144ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (271.1517ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2544.9513
+ -> exit 0
diff --git a/docs/smoketest/smoke-20260430-095920.json b/docs/smoketest/smoke-20260430-095920.json
new file mode 100644
index 0000000..58d852e
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-095920.json
@@ -0,0 +1,130 @@
+{
+ "timestamp": "2026-04-30T04:29:20.938Z",
+ "traceId": "smoke-20260430-095920",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260430-095920.log",
+ "jsonPath": "docs/smoketest/smoke-20260430-095920.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 745,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 47,
+ "error": null
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 12,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 13,
+ "error": null
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 12,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 14,
+ "error": null
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 15,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 17,
+ "error": null
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 32,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 33,
+ "error": null
+ }
+ }
+ ],
+ "baselineMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "postDisruption": {
+ "ok": true,
+ "status": 201,
+ "elapsedMs": 203,
+ "error": null
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 0,
+ "resolution-options": 0,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 404,
+ "elapsedMs": 371,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": null
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260430-095920.log b/docs/smoketest/smoke-20260430-095920.log
new file mode 100644
index 0000000..5922cba
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-095920.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-30T04:29:20.938Z
+Trace ID: smoke-20260430-095920
+[event-bus] /health -> 200 (745ms)
+[event-bus] /metrics -> 200 (47ms)
+[disruption] /health -> 200 (12ms)
+[disruption] /metrics -> 200 (13ms)
+[impact] /health -> 200 (12ms)
+[impact] /metrics -> 200 (14ms)
+[resolution] /health -> 200 (15ms)
+[resolution] /metrics -> 200 (17ms)
+[news-intel] /health -> 200 (32ms)
+[news-intel] /metrics -> 200 (33ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (203ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-095920 -> 404 (371ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (20.6608ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (170.6572ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (269.7188ms)
+ ✔ fetchFlexportTracking maps scraper output (16.2365ms)
+ ✔ syncFlexportShipments updates active shipments (1.1846ms)
+ ✔ fetchVesselDetails parses public vessel metadata (62.0228ms)
+ ✔ fetchVesselsInPort parses vessel table rows (20.5983ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (87.0782ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 3369.3837
+ -> exit 0
diff --git a/docs/smoketest/smoke-20260430-100200.json b/docs/smoketest/smoke-20260430-100200.json
new file mode 100644
index 0000000..b326ae7
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-100200.json
@@ -0,0 +1,130 @@
+{
+ "timestamp": "2026-04-30T04:32:00.597Z",
+ "traceId": "smoke-20260430-100200",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260430-100200.log",
+ "jsonPath": "docs/smoketest/smoke-20260430-100200.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 183,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 18,
+ "error": null
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 53,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 14,
+ "error": null
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 39,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 30,
+ "error": null
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 14,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 7,
+ "error": null
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 12,
+ "error": null
+ }
+ }
+ ],
+ "baselineMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "postDisruption": {
+ "ok": true,
+ "status": 201,
+ "elapsedMs": 183,
+ "error": null
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {
+ "disruption-events": 1,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 0,
+ "resolution-options": 0,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 404,
+ "elapsedMs": 148,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": null
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260430-100200.log b/docs/smoketest/smoke-20260430-100200.log
new file mode 100644
index 0000000..206f80f
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-100200.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-30T04:32:00.597Z
+Trace ID: smoke-20260430-100200
+[event-bus] /health -> 200 (183ms)
+[event-bus] /metrics -> 200 (18ms)
+[disruption] /health -> 200 (53ms)
+[disruption] /metrics -> 200 (14ms)
+[impact] /health -> 200 (39ms)
+[impact] /metrics -> 200 (30ms)
+[resolution] /health -> 200 (14ms)
+[resolution] /metrics -> 200 (7ms)
+[news-intel] /health -> 200 (10ms)
+[news-intel] /metrics -> 200 (12ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (183ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-100200 -> 404 (148ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (3.1272ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (144.3016ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (153.7944ms)
+ ✔ fetchFlexportTracking maps scraper output (13.9472ms)
+ ✔ syncFlexportShipments updates active shipments (1.7764ms)
+ ✔ fetchVesselDetails parses public vessel metadata (65.2195ms)
+ ✔ fetchVesselsInPort parses vessel table rows (43.3042ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (114.3954ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2902.7095
+ -> exit 0
diff --git a/docs/smoketest/smoke-20260430-100653.json b/docs/smoketest/smoke-20260430-100653.json
new file mode 100644
index 0000000..7c1b881
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-100653.json
@@ -0,0 +1,130 @@
+{
+ "timestamp": "2026-04-30T04:36:53.964Z",
+ "traceId": "smoke-20260430-100653",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260430-100653.log",
+ "jsonPath": "docs/smoketest/smoke-20260430-100653.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 208,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 12,
+ "error": null
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 22,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 31,
+ "error": null
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 11,
+ "error": null
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 11,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 7,
+ "error": null
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 22,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ }
+ }
+ ],
+ "baselineMessageCounts": {
+ "disruption-events": 2,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "postDisruption": {
+ "ok": true,
+ "status": 201,
+ "elapsedMs": 183,
+ "error": null
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {
+ "disruption-events": 2,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 0,
+ "resolution-options": 0,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 404,
+ "elapsedMs": 358,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": null
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260430-100653.log b/docs/smoketest/smoke-20260430-100653.log
new file mode 100644
index 0000000..bb73ec9
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-100653.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-30T04:36:53.964Z
+Trace ID: smoke-20260430-100653
+[event-bus] /health -> 200 (208ms)
+[event-bus] /metrics -> 200 (12ms)
+[disruption] /health -> 200 (22ms)
+[disruption] /metrics -> 200 (31ms)
+[impact] /health -> 200 (8ms)
+[impact] /metrics -> 200 (11ms)
+[resolution] /health -> 200 (11ms)
+[resolution] /metrics -> 200 (7ms)
+[news-intel] /health -> 200 (22ms)
+[news-intel] /metrics -> 200 (8ms)
+Baseline counts: {"disruption-events":2,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (183ms)
+Post counts: {"disruption-events":2,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-100653 -> 404 (358ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.1961ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (270.1755ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (165.2036ms)
+ ✔ fetchFlexportTracking maps scraper output (4.4323ms)
+ ✔ syncFlexportShipments updates active shipments (5.8291ms)
+ ✔ fetchVesselDetails parses public vessel metadata (120.5212ms)
+ ✔ fetchVesselsInPort parses vessel table rows (13.4171ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (130.6613ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 3394.7097
+ -> exit 0
diff --git a/docs/smoketest/smoke-20260430-101229.json b/docs/smoketest/smoke-20260430-101229.json
new file mode 100644
index 0000000..99cfca3
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-101229.json
@@ -0,0 +1,130 @@
+{
+ "timestamp": "2026-04-30T04:42:29.071Z",
+ "traceId": "smoke-20260430-101229",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260430-101229.log",
+ "jsonPath": "docs/smoketest/smoke-20260430-101229.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 279,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 12,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 7,
+ "error": null
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 14,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 17,
+ "error": null
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 17,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 9,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 17,
+ "error": null
+ }
+ }
+ ],
+ "baselineMessageCounts": {
+ "disruption-events": 3,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "postDisruption": {
+ "ok": true,
+ "status": 201,
+ "elapsedMs": 175,
+ "error": null
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {
+ "disruption-events": 3,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 0,
+ "resolution-options": 0,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 404,
+ "elapsedMs": 135,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": null
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260430-101229.log b/docs/smoketest/smoke-20260430-101229.log
new file mode 100644
index 0000000..9dbfd0e
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-101229.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-30T04:42:29.071Z
+Trace ID: smoke-20260430-101229
+[event-bus] /health -> 200 (279ms)
+[event-bus] /metrics -> 200 (10ms)
+[disruption] /health -> 200 (12ms)
+[disruption] /metrics -> 200 (7ms)
+[impact] /health -> 200 (14ms)
+[impact] /metrics -> 200 (17ms)
+[resolution] /health -> 200 (17ms)
+[resolution] /metrics -> 200 (8ms)
+[news-intel] /health -> 200 (9ms)
+[news-intel] /metrics -> 200 (17ms)
+Baseline counts: {"disruption-events":3,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (175ms)
+Post counts: {"disruption-events":3,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-101229 -> 404 (135ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.7493ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (158.7259ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (167.3625ms)
+ ✔ fetchFlexportTracking maps scraper output (4.2796ms)
+ ✔ syncFlexportShipments updates active shipments (5.4115ms)
+ ✔ fetchVesselDetails parses public vessel metadata (117.5679ms)
+ ✔ fetchVesselsInPort parses vessel table rows (42.7084ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (114.3219ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 3000.3825
+ -> exit 0
diff --git a/docs/smoketest/smoke-20260430-101753.json b/docs/smoketest/smoke-20260430-101753.json
new file mode 100644
index 0000000..dbf9c5e
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-101753.json
@@ -0,0 +1,130 @@
+{
+ "timestamp": "2026-04-30T04:47:53.458Z",
+ "traceId": "smoke-20260430-101753",
+ "files": {
+ "logPath": "docs/smoketest/smoke-20260430-101753.log",
+ "jsonPath": "docs/smoketest/smoke-20260430-101753.json"
+ },
+ "serviceChecks": [
+ {
+ "service": "event-bus",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 217,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ }
+ },
+ {
+ "service": "disruption",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 9,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ }
+ },
+ {
+ "service": "impact",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ }
+ },
+ {
+ "service": "resolution",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 13,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 10,
+ "error": null
+ }
+ },
+ {
+ "service": "news-intel",
+ "health": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 8,
+ "error": null
+ },
+ "metrics": {
+ "ok": true,
+ "status": 200,
+ "elapsedMs": 14,
+ "error": null
+ }
+ }
+ ],
+ "baselineMessageCounts": {
+ "disruption-events": 5,
+ "impact-reports": 2,
+ "resolution-options": 2,
+ "news-alerts": 0
+ },
+ "postDisruption": {
+ "ok": true,
+ "status": 201,
+ "elapsedMs": 186,
+ "error": null
+ },
+ "pollAttempts": 30,
+ "chainComplete": false,
+ "postMessageCounts": {
+ "disruption-events": 5,
+ "impact-reports": 3,
+ "resolution-options": 3,
+ "news-alerts": 0
+ },
+ "messageCountDelta": {
+ "disruption-events": 0,
+ "impact-reports": 1,
+ "resolution-options": 1,
+ "news-alerts": 0
+ },
+ "resolutionProbe": {
+ "ok": false,
+ "status": 404,
+ "elapsedMs": 102,
+ "optionCount": 0,
+ "firstTitle": null,
+ "error": null
+ },
+ "scraperChecks": {
+ "smokeScraper": {
+ "passed": true,
+ "exitCode": 0
+ },
+ "disruptionSmokes": {
+ "passed": true,
+ "exitCode": 0
+ }
+ },
+ "overallPass": false
+}
diff --git a/docs/smoketest/smoke-20260430-101753.log b/docs/smoketest/smoke-20260430-101753.log
new file mode 100644
index 0000000..705c5e1
--- /dev/null
+++ b/docs/smoketest/smoke-20260430-101753.log
@@ -0,0 +1,41 @@
+Smoke started at 2026-04-30T04:47:53.458Z
+Trace ID: smoke-20260430-101753
+[event-bus] /health -> 200 (217ms)
+[event-bus] /metrics -> 200 (10ms)
+[disruption] /health -> 200 (9ms)
+[disruption] /metrics -> 200 (10ms)
+[impact] /health -> 200 (8ms)
+[impact] /metrics -> 200 (10ms)
+[resolution] /health -> 200 (13ms)
+[resolution] /metrics -> 200 (10ms)
+[news-intel] /health -> 200 (8ms)
+[news-intel] /metrics -> 200 (14ms)
+Baseline counts: {"disruption-events":5,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (186ms)
+Post counts: {"disruption-events":5,"impact-reports":3,"resolution-options":3,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":1,"resolution-options":1,"news-alerts":0}
+GET /options/smoke-20260430-101753 -> 404 (102ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (3.058ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (137.1604ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (163.0275ms)
+ ✔ fetchFlexportTracking maps scraper output (8.3929ms)
+ ✔ syncFlexportShipments updates active shipments (2.8543ms)
+ ✔ fetchVesselDetails parses public vessel metadata (95.2851ms)
+ ✔ fetchVesselsInPort parses vessel table rows (6.551ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (115.1959ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2950.0662
+ -> exit 0
diff --git a/event-bus/package-lock.json b/event-bus/package-lock.json
index 69bf7b9..23ce6c9 100644
--- a/event-bus/package-lock.json
+++ b/event-bus/package-lock.json
@@ -290,6 +290,21 @@
"@opentelemetry/api": "^1.9.0"
}
},
+ "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/context-async-hooks": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.7.0.tgz",
@@ -303,9 +318,9 @@
}
},
"node_modules/@opentelemetry/core": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
- "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz",
+ "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -337,6 +352,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.215.0.tgz",
@@ -356,6 +386,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.215.0.tgz",
@@ -377,6 +422,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.215.0.tgz",
@@ -399,6 +475,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.215.0.tgz",
@@ -418,6 +525,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.215.0.tgz",
@@ -438,6 +576,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-prometheus": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.215.0.tgz",
@@ -456,6 +625,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.215.0.tgz",
@@ -477,6 +677,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.215.0.tgz",
@@ -496,6 +727,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.215.0.tgz",
@@ -515,22 +777,84 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-zipkin": {
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.0.tgz",
+ "integrity": "sha512-tbzcYDmZWtX4hgJn15qP7/iYFVd1yzbUloBuSYsQtn0XQTxJsG7vgwkPKEBellriH0XJmlZJxYtWkHpwzHBhaQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/sdk-trace-base": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.0.tgz",
- "integrity": "sha512-tbzcYDmZWtX4hgJn15qP7/iYFVd1yzbUloBuSYsQtn0XQTxJsG7vgwkPKEBellriH0XJmlZJxYtWkHpwzHBhaQ==",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0",
- "@opentelemetry/sdk-trace-base": "2.7.0",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
"node_modules/@opentelemetry/instrumentation": {
@@ -812,6 +1136,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/instrumentation-ioredis": {
"version": "0.63.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.63.0.tgz",
@@ -1226,6 +1565,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-grpc-exporter-base": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.215.0.tgz",
@@ -1244,6 +1598,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.215.0.tgz",
@@ -1265,23 +1634,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer/node_modules/protobufjs": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.1.tgz",
- "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.3.tgz",
+ "integrity": "sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"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": ">=13.7.0",
"long": "^5.0.0"
},
@@ -1304,6 +1694,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/propagator-jaeger": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.7.0.tgz",
@@ -1319,6 +1724,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/redis-common": {
"version": "0.38.3",
"resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz",
@@ -1329,9 +1749,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.5.tgz",
- "integrity": "sha512-KtbVu0Q+I+yg2/fL0pINxekNrejmxw9gpXB8rc3L8WAA0BXnKEp6KEe/glHyzyXOD8V2eZ+AfaoZixFp76ZJDw==",
+ "version": "0.33.6",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.6.tgz",
+ "integrity": "sha512-ESA169b7uRy7RWoAb59CRRXLCr6mlEvhoZDEJkAASWYc/udCNaMv7T4vvObgjXEkCUDqCNlibvtLwKkEozGsrA==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1345,9 +1765,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-aws": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.15.0.tgz",
- "integrity": "sha512-+aiEkI+JA94XVIJtltt3XKYbLSaHRqHFdvGOwulBpfNKtEIWDEkKm3qfTl7Q0q9gY9621oXMU1sT5MM7koCnyA==",
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.16.0.tgz",
+ "integrity": "sha512-vD9bb47DJvwn2btrWLFR9GGz5wxejqntZLuyrDJ0l48NMdErrJxWa/+IScaLj8hDe0iyZs/TY1MZRbFX+EUlrg==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1379,9 +1799,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-container": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.6.tgz",
- "integrity": "sha512-b3/SzjmbANgZYfQn40+Mx5Bl0f4IIRTrCRSTN3FQ7j1KB8h3jl+JeJpFZZFY1OU5BtDFXI7VQ334SbKi5Z2R1A==",
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.7.tgz",
+ "integrity": "sha512-Yv66OD7DeN6OaMVSslcdffjNXJ6NEB08Pz98a06wrNH3F/SCzY5xUBPesYNH9fjhom6u9/wblz6ocxW/fhneow==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1412,12 +1832,12 @@
}
},
"node_modules/@opentelemetry/resources": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
- "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz",
+ "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==",
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/core": "2.7.1",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
@@ -1445,6 +1865,37 @@
"@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-metrics": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
@@ -1461,6 +1912,37 @@
"@opentelemetry/api": ">=1.9.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-node": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.215.0.tgz",
@@ -1500,6 +1982,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-base": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.0.tgz",
@@ -1517,6 +2030,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-node": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.7.0.tgz",
@@ -1534,6 +2078,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/semantic-conventions": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
@@ -1577,9 +2136,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
@@ -1605,9 +2164,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
+ "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/path": {
@@ -1623,9 +2182,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
+ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause"
},
"node_modules/@supabase/auth-js": {
@@ -2851,22 +3410,22 @@
"license": "MIT"
},
"node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
diff --git a/impact/api/impact.service.js b/impact/api/impact.service.js
index 0d8243a..dd3c31a 100644
--- a/impact/api/impact.service.js
+++ b/impact/api/impact.service.js
@@ -120,7 +120,7 @@ export async function processDisruptionEvent(agentPayload) {
});
validateImpactReport(impactReport);
- await db.collection('impactReports').doc(impactReport.id).set({
+ db.collection('impactReports').doc(impactReport.id).set({
...impactReport,
systemPromptSnapshot: SYSTEM_PROMPT.slice(0, 2000),
inputPayloadSnapshot: JSON.stringify({
@@ -135,6 +135,8 @@ export async function processDisruptionEvent(agentPayload) {
repairedCount: nonParseErrors.length,
parseRetries: retriesUsed,
},
+ }).catch((err) => {
+ console.warn('[ImpactService] Firestore impactReport write failed (non-fatal):', err.message);
});
const { queued: irQueued } = await resilientUpsert(
@@ -183,7 +185,9 @@ export async function processDisruptionEvent(agentPayload) {
disruptionId: disruption.id,
});
});
- await batch.commit();
+ batch.commit().catch((err) => {
+ console.warn('[ImpactService] Firestore shipment batch failed (non-fatal):', err.message);
+ });
}
await publish(TOPICS.IMPACT_REPORTS, createAgentPayload('impact', impactReport, traceId));
diff --git a/impact/package-lock.json b/impact/package-lock.json
index 111b6d3..c4ed522 100644
--- a/impact/package-lock.json
+++ b/impact/package-lock.json
@@ -327,6 +327,7 @@
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"license": "MIT",
"optional": true,
"bin": {
@@ -355,7 +356,7 @@
"node": ">=12.10.0"
}
},
- "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": {
+ "node_modules/@grpc/proto-loader": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz",
"integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==",
@@ -373,25 +374,6 @@
"node": ">=6"
}
},
- "node_modules/@grpc/proto-loader": {
- "version": "0.7.15",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
- "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.2.5",
- "yargs": "^17.7.2"
- },
- "bin": {
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/@js-sdsl/ordered-map": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
@@ -515,6 +497,21 @@
"@opentelemetry/api": "^1.9.0"
}
},
+ "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/context-async-hooks": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.7.0.tgz",
@@ -528,9 +525,9 @@
}
},
"node_modules/@opentelemetry/core": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
- "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz",
+ "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -562,6 +559,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.215.0.tgz",
@@ -581,6 +593,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.215.0.tgz",
@@ -602,6 +629,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.215.0.tgz",
@@ -624,6 +682,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.215.0.tgz",
@@ -643,6 +732,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.215.0.tgz",
@@ -663,6 +783,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-prometheus": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.215.0.tgz",
@@ -681,6 +832,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.215.0.tgz",
@@ -702,6 +884,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.215.0.tgz",
@@ -721,6 +934,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.215.0.tgz",
@@ -740,6 +984,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-zipkin": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.0.tgz",
@@ -758,6 +1033,37 @@
"@opentelemetry/api": "^1.0.0"
}
},
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/instrumentation": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.215.0.tgz",
@@ -1037,6 +1343,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/instrumentation-ioredis": {
"version": "0.63.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.63.0.tgz",
@@ -1451,6 +1772,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-grpc-exporter-base": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.215.0.tgz",
@@ -1469,6 +1805,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.215.0.tgz",
@@ -1490,23 +1841,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer/node_modules/protobufjs": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.1.tgz",
- "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.3.tgz",
+ "integrity": "sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"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": ">=13.7.0",
"long": "^5.0.0"
},
@@ -1529,6 +1901,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/propagator-jaeger": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.7.0.tgz",
@@ -1544,6 +1931,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/redis-common": {
"version": "0.38.3",
"resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz",
@@ -1554,9 +1956,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.5.tgz",
- "integrity": "sha512-KtbVu0Q+I+yg2/fL0pINxekNrejmxw9gpXB8rc3L8WAA0BXnKEp6KEe/glHyzyXOD8V2eZ+AfaoZixFp76ZJDw==",
+ "version": "0.33.6",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.6.tgz",
+ "integrity": "sha512-ESA169b7uRy7RWoAb59CRRXLCr6mlEvhoZDEJkAASWYc/udCNaMv7T4vvObgjXEkCUDqCNlibvtLwKkEozGsrA==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1570,9 +1972,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-aws": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.15.0.tgz",
- "integrity": "sha512-+aiEkI+JA94XVIJtltt3XKYbLSaHRqHFdvGOwulBpfNKtEIWDEkKm3qfTl7Q0q9gY9621oXMU1sT5MM7koCnyA==",
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.16.0.tgz",
+ "integrity": "sha512-vD9bb47DJvwn2btrWLFR9GGz5wxejqntZLuyrDJ0l48NMdErrJxWa/+IScaLj8hDe0iyZs/TY1MZRbFX+EUlrg==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1604,9 +2006,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-container": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.6.tgz",
- "integrity": "sha512-b3/SzjmbANgZYfQn40+Mx5Bl0f4IIRTrCRSTN3FQ7j1KB8h3jl+JeJpFZZFY1OU5BtDFXI7VQ334SbKi5Z2R1A==",
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.7.tgz",
+ "integrity": "sha512-Yv66OD7DeN6OaMVSslcdffjNXJ6NEB08Pz98a06wrNH3F/SCzY5xUBPesYNH9fjhom6u9/wblz6ocxW/fhneow==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1633,65 +2035,59 @@
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
- }
- },
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gaxios": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
- "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
- "license": "Apache-2.0",
- "dependencies": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "node-fetch": "^3.3.2"
- },
- "engines": {
- "node": ">=18"
+ "@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gcp-metadata": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
- "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
+ "node_modules/@opentelemetry/resources": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz",
+ "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==",
"license": "Apache-2.0",
"dependencies": {
- "gaxios": "^7.0.0",
- "google-logging-utils": "^1.0.0",
- "json-bigint": "^1.0.0"
+ "@opentelemetry/core": "2.7.1",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
- "node": ">=18"
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/google-logging-utils": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
- "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.215.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.215.0.tgz",
+ "integrity": "sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==",
"license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.215.0",
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
"engines": {
- "node": ">=14"
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/node-fetch": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
- "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
- "license": "MIT",
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": "^18.19.0 || >=20.6.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/node-fetch"
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resources": {
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
"integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
@@ -1707,38 +2103,51 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/sdk-logs": {
- "version": "0.215.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.215.0.tgz",
- "integrity": "sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==",
+ "node_modules/@opentelemetry/sdk-metrics": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
+ "integrity": "sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==",
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/api-logs": "0.215.0",
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/resources": "2.7.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.9.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/sdk-metrics": {
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
- "integrity": "sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0"
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.9.0 <1.10.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
"node_modules/@opentelemetry/sdk-node": {
@@ -1780,6 +2189,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-base": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.0.tgz",
@@ -1797,6 +2237,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-node": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.7.0.tgz",
@@ -1814,6 +2285,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/semantic-conventions": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
@@ -1857,9 +2343,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
@@ -1885,9 +2371,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
+ "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/path": {
@@ -1903,9 +2389,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
+ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause"
},
"node_modules/@supabase/auth-js": {
@@ -2980,6 +3466,7 @@
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -3075,18 +3562,49 @@
}
},
"node_modules/gcp-metadata": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
- "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
+ "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
"license": "Apache-2.0",
- "optional": true,
"dependencies": {
- "gaxios": "^6.1.1",
- "google-logging-utils": "^0.0.2",
+ "gaxios": "^7.0.0",
+ "google-logging-utils": "^1.0.0",
"json-bigint": "^1.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=18"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/gaxios": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
+ "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "node-fetch": "^3.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
}
},
"node_modules/get-caller-file": {
@@ -3168,6 +3686,31 @@
"node": ">=14"
}
},
+ "node_modules/google-auth-library/node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/google-gax": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz",
@@ -3192,12 +3735,30 @@
"node": ">=14"
}
},
- "node_modules/google-logging-utils": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
- "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "node_modules/google-gax/node_modules/@grpc/proto-loader": {
+ "version": "0.7.15",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
+ "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
"license": "Apache-2.0",
"optional": true,
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.2.5",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/google-logging-utils": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=14"
}
@@ -4060,22 +4621,22 @@
}
},
"node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -4541,6 +5102,7 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
diff --git a/impact/tools/shipmentLookup.js b/impact/tools/shipmentLookup.js
index 8ee227a..e1fdc7f 100644
--- a/impact/tools/shipmentLookup.js
+++ b/impact/tools/shipmentLookup.js
@@ -1,14 +1,67 @@
import { db } from '../../shared/db/firebase.js';
+import { supabase } from '../../shared/db/supabase.js';
-export async function getShipmentsNearEpicenter(epicenterLat, epicenterLng, bboxDegrees = 15) {
- const snapshot = await db.collection('shipments')
- .where('currentLat', '>=', epicenterLat - bboxDegrees)
- .where('currentLat', '<=', epicenterLat + bboxDegrees)
- .get();
+/**
+ * Query Supabase shipments table as a fallback when Firestore is unavailable.
+ * Column names use snake_case (Supabase) and are remapped to camelCase to match
+ * the shape that scoreShipmentsWithTradeWeight expects.
+ */
+async function getShipmentsFromSupabase(epicenterLat, epicenterLng, bboxDegrees) {
+ const minLat = epicenterLat - bboxDegrees;
+ const maxLat = epicenterLat + bboxDegrees;
const minLng = epicenterLng - bboxDegrees;
const maxLng = epicenterLng + bboxDegrees;
- return snapshot.docs
- .map((doc) => ({ id: doc.id, ...doc.data() }))
- .filter((s) => ['active', 'delayed'].includes(s.status))
- .filter((s) => s.currentLng >= minLng && s.currentLng <= maxLng);
+
+ const { data, error } = await supabase
+ .from('shipments')
+ .select('id, origin, destination, carrier, cargo_value_usd, corridor, current_lat, current_lng, eta, status')
+ .gte('current_lat', minLat)
+ .lte('current_lat', maxLat)
+ .gte('current_lng', minLng)
+ .lte('current_lng', maxLng)
+ .in('status', ['active', 'delayed']);
+
+ if (error) throw new Error(`[ShipmentLookup] Supabase fallback failed: ${error.message}`);
+
+ // Remap snake_case -> camelCase to match Firestore doc shape.
+ return (data || []).map((row) => ({
+ id: row.id,
+ origin: row.origin,
+ destination: row.destination,
+ carrier: row.carrier,
+ cargoValueUSD: Number(row.cargo_value_usd || 0),
+ corridor: row.corridor,
+ currentLat: Number(row.current_lat),
+ currentLng: Number(row.current_lng),
+ eta: row.eta,
+ status: row.status,
+ }));
+}
+
+export async function getShipmentsNearEpicenter(epicenterLat, epicenterLng, bboxDegrees = 15) {
+ // Primary: Firestore.
+ try {
+ const snapshot = await db.collection('shipments')
+ .where('currentLat', '>=', epicenterLat - bboxDegrees)
+ .where('currentLat', '<=', epicenterLat + bboxDegrees)
+ .get();
+
+ const minLng = epicenterLng - bboxDegrees;
+ const maxLng = epicenterLng + bboxDegrees;
+
+ return snapshot.docs
+ .map((doc) => ({ id: doc.id, ...doc.data() }))
+ .filter((s) => ['active', 'delayed'].includes(s.status))
+ .filter((s) => s.currentLng >= minLng && s.currentLng <= maxLng);
+ } catch (firestoreErr) {
+ console.warn('[ShipmentLookup] Firestore read failed, falling back to Supabase:', firestoreErr.message);
+ }
+
+ // Fallback: Supabase.
+ try {
+ return await getShipmentsFromSupabase(epicenterLat, epicenterLng, bboxDegrees);
+ } catch (supabaseErr) {
+ console.warn('[ShipmentLookup] Supabase fallback also failed:', supabaseErr.message);
+ return [];
+ }
}
diff --git a/news-intel/agent/agent.js b/news-intel/agent/agent.js
index 724c01e..6637d7e 100644
--- a/news-intel/agent/agent.js
+++ b/news-intel/agent/agent.js
@@ -5,7 +5,7 @@ import { db } from '../../shared/db/firebase.js';
import { createAgentPayload } from '../../shared/types/AgentPayload.js';
import { publish } from '../../shared/eventBusClient.js';
import { TOPICS } from '../../event-bus/topics.js';
-import { generate } from '../../shared/lib/gemini.js';
+import { generate, getRateLimitCooldownMs, isRateLimited } from '../../shared/lib/gemini.js';
import { generateWithRetry } from '../../shared/lib/llmJson.js';
import { NEWS_ALERT_RESULT_SCHEMA, validateAndRepair } from '../../shared/lib/validateSchema.js';
import { fetchGdeltArticles } from '../tools/gdeltFetcher.js';
@@ -26,6 +26,12 @@ const RELEVANCE_THRESHOLD = Number.isFinite(parsedRelevanceThreshold) ? parsedRe
const MAX_ARTICLES_PER_CALL = 20;
const MAX_ARTICLES_PER_CYCLE = 100; // cap total in-memory article array per poll cycle
const DISRUPTION_AGENT_URL = process.env.DISRUPTION_AGENT_URL ?? 'http://localhost:3001';
+const SUPPLY_CHAIN_KEYWORDS = [
+ 'port', 'vessel', 'shipping', 'cargo', 'container', 'tanker', 'freight',
+ 'canal', 'suez', 'panama', 'malacca', 'strait', 'congestion', 'strike',
+ 'typhoon', 'hurricane', 'storm', 'closure', 'disruption', 'delay',
+ 'sanctions', 'blockade', 'piracy', 'houthi', 'red sea',
+];
let lastGdeltFetch = new Date(Date.now() - 30 * 60 * 1000);
let _cycleRunning = false; // prevent overlapping cycles from doubling RAM usage
@@ -49,6 +55,11 @@ function buildNewsFallback(article) {
};
}
+function hasSupplyChainKeyword(article) {
+ const text = `${article?.headline ?? ''} ${article?.summary ?? ''}`.toLowerCase();
+ return SUPPLY_CHAIN_KEYWORDS.some((keyword) => text.includes(keyword));
+}
+
export async function injectToDisruptionAgent(description, traceId, maxAttempts = 3, retryDelayMs = 3000) {
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
@@ -155,10 +166,25 @@ export async function runPollCycle() {
return stats;
}
- const batches = chunk(novel, MAX_ARTICLES_PER_CALL);
+ const relevant = novel.filter(hasSupplyChainKeyword);
+ const irrelevant = novel.filter((article) => !hasSupplyChainKeyword(article));
+
+ if (irrelevant.length) {
+ await Promise.all(irrelevant.map((article) => markProcessed(article.url)));
+ console.log(`[NewsAgent] ${irrelevant.length} articles pre-filtered (no supply chain keywords), ${relevant.length} sent to Gemini`);
+ }
+
+ const batches = chunk(relevant, MAX_ARTICLES_PER_CALL);
const classified = [];
for (const batch of batches) {
+ if (isRateLimited()) {
+ const cooldownSec = Math.ceil(getRateLimitCooldownMs() / 1000);
+ console.warn(`[NewsAgent] Gemini rate-limited (${cooldownSec}s remaining). Marking ${batch.length} articles as processed and deferring classification.`);
+ await Promise.all(batch.map((article) => markProcessed(article.url)));
+ continue;
+ }
+
const input = batch.map(({ url, headline, source, publishedAt }) => ({ url, headline, source, publishedAt }));
let results = [];
diff --git a/news-intel/package-lock.json b/news-intel/package-lock.json
index 45e7fa8..58ef976 100644
--- a/news-intel/package-lock.json
+++ b/news-intel/package-lock.json
@@ -293,6 +293,21 @@
"@opentelemetry/api": "^1.9.0"
}
},
+ "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/context-async-hooks": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.7.0.tgz",
@@ -306,9 +321,9 @@
}
},
"node_modules/@opentelemetry/core": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
- "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz",
+ "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -340,6 +355,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.215.0.tgz",
@@ -359,6 +389,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.215.0.tgz",
@@ -380,6 +425,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.215.0.tgz",
@@ -402,6 +478,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.215.0.tgz",
@@ -421,6 +528,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.215.0.tgz",
@@ -441,6 +579,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-prometheus": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.215.0.tgz",
@@ -459,6 +628,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.215.0.tgz",
@@ -480,6 +680,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.215.0.tgz",
@@ -499,6 +730,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.215.0.tgz",
@@ -518,22 +780,84 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-zipkin": {
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.0.tgz",
+ "integrity": "sha512-tbzcYDmZWtX4hgJn15qP7/iYFVd1yzbUloBuSYsQtn0XQTxJsG7vgwkPKEBellriH0XJmlZJxYtWkHpwzHBhaQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/sdk-trace-base": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.0.tgz",
- "integrity": "sha512-tbzcYDmZWtX4hgJn15qP7/iYFVd1yzbUloBuSYsQtn0XQTxJsG7vgwkPKEBellriH0XJmlZJxYtWkHpwzHBhaQ==",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0",
- "@opentelemetry/sdk-trace-base": "2.7.0",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
"node_modules/@opentelemetry/instrumentation": {
@@ -815,6 +1139,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/instrumentation-ioredis": {
"version": "0.63.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.63.0.tgz",
@@ -1229,6 +1568,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-grpc-exporter-base": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.215.0.tgz",
@@ -1247,6 +1601,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.215.0.tgz",
@@ -1268,23 +1637,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer/node_modules/protobufjs": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.1.tgz",
- "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.3.tgz",
+ "integrity": "sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"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": ">=13.7.0",
"long": "^5.0.0"
},
@@ -1307,6 +1697,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/propagator-jaeger": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.7.0.tgz",
@@ -1322,6 +1727,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/redis-common": {
"version": "0.38.3",
"resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz",
@@ -1332,9 +1752,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.5.tgz",
- "integrity": "sha512-KtbVu0Q+I+yg2/fL0pINxekNrejmxw9gpXB8rc3L8WAA0BXnKEp6KEe/glHyzyXOD8V2eZ+AfaoZixFp76ZJDw==",
+ "version": "0.33.6",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.6.tgz",
+ "integrity": "sha512-ESA169b7uRy7RWoAb59CRRXLCr6mlEvhoZDEJkAASWYc/udCNaMv7T4vvObgjXEkCUDqCNlibvtLwKkEozGsrA==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1348,9 +1768,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-aws": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.15.0.tgz",
- "integrity": "sha512-+aiEkI+JA94XVIJtltt3XKYbLSaHRqHFdvGOwulBpfNKtEIWDEkKm3qfTl7Q0q9gY9621oXMU1sT5MM7koCnyA==",
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.16.0.tgz",
+ "integrity": "sha512-vD9bb47DJvwn2btrWLFR9GGz5wxejqntZLuyrDJ0l48NMdErrJxWa/+IScaLj8hDe0iyZs/TY1MZRbFX+EUlrg==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1382,9 +1802,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-container": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.6.tgz",
- "integrity": "sha512-b3/SzjmbANgZYfQn40+Mx5Bl0f4IIRTrCRSTN3FQ7j1KB8h3jl+JeJpFZZFY1OU5BtDFXI7VQ334SbKi5Z2R1A==",
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.7.tgz",
+ "integrity": "sha512-Yv66OD7DeN6OaMVSslcdffjNXJ6NEB08Pz98a06wrNH3F/SCzY5xUBPesYNH9fjhom6u9/wblz6ocxW/fhneow==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1415,12 +1835,12 @@
}
},
"node_modules/@opentelemetry/resources": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
- "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz",
+ "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==",
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/core": "2.7.1",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
@@ -1448,6 +1868,37 @@
"@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-metrics": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
@@ -1464,6 +1915,37 @@
"@opentelemetry/api": ">=1.9.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-node": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.215.0.tgz",
@@ -1503,6 +1985,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-base": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.0.tgz",
@@ -1520,6 +2033,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-node": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.7.0.tgz",
@@ -1537,6 +2081,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/semantic-conventions": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
@@ -1580,9 +2139,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
@@ -1608,9 +2167,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
+ "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/path": {
@@ -1626,9 +2185,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
+ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause"
},
"node_modules/@supabase/auth-js": {
@@ -2665,6 +3224,7 @@
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
@@ -2902,22 +3462,22 @@
"license": "MIT"
},
"node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -3157,6 +3717,7 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
diff --git a/news-intel/package.json b/news-intel/package.json
index 752c188..1a17438 100644
--- a/news-intel/package.json
+++ b/news-intel/package.json
@@ -9,6 +9,7 @@
},
"dependencies": {
"@fastify/cors": "^11.2.0",
+ "@supabase/supabase-js": "^2.45.0",
"@opentelemetry/auto-instrumentations-node": "^0.73.0",
"@opentelemetry/sdk-node": "^0.215.0",
"@supabase/supabase-js": "^2.105.1",
diff --git a/package-lock.json b/package-lock.json
index 7b9c8d1..8b1f986 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,7 @@
"license": "ISC",
"dependencies": {
"@fastify/cors": "^11.2.0",
+ "@getbrevo/brevo": "^5.0.3",
"@google/generative-ai": "^0.24.1",
"@opentelemetry/auto-instrumentations-node": "^0.66.0",
"@opentelemetry/sdk-node": "^0.205.0",
@@ -30,6 +31,7 @@
"dashboard": {
"version": "0.1.0",
"dependencies": {
+ "@getbrevo/brevo": "^5.0.3",
"@radix-ui/react-tooltip": "^1.2.8",
"@supabase/supabase-js": "^2.49.8",
"cesium": "^1.140.0",
@@ -1382,6 +1384,14 @@
"integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
"license": "MIT"
},
+ "node_modules/@getbrevo/brevo": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@getbrevo/brevo/-/brevo-5.0.4.tgz",
+ "integrity": "sha512-wN4mHE6O0Pb/d/Dh3E4MAm2zCHbLLUcFF8/wgwTeMPy9KzHBYLu7S/nsJbzd0AWL09MHn8vwue8ULL9YOzluOQ==",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@google-cloud/firestore": {
"version": "7.11.6",
"resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz",
diff --git a/package.json b/package.json
index 37ce3c3..5c27279 100644
--- a/package.json
+++ b/package.json
@@ -28,17 +28,18 @@
},
"repository": {
"type": "git",
- "url": "git+https://github.com/ShreyashSingh857/GDG-Solutions-Challenge-2026.git"
+ "url": "git+https://github.com/SamanPandey-in/OpenTrade.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
- "url": "https://github.com/ShreyashSingh857/GDG-Solutions-Challenge-2026/issues"
+ "url": "https://github.com/SamanPandey-in/OpenTrade/issues"
},
- "homepage": "https://github.com/ShreyashSingh857/GDG-Solutions-Challenge-2026#readme",
+ "homepage": "https://github.com/SamanPandey-in/OpenTrade#readme",
"dependencies": {
"@fastify/cors": "^11.2.0",
+ "@getbrevo/brevo": "^5.0.3",
"@google/generative-ai": "^0.24.1",
"@opentelemetry/auto-instrumentations-node": "^0.66.0",
"@opentelemetry/sdk-node": "^0.205.0",
diff --git a/resolution/api/options.service.js b/resolution/api/options.service.js
index 3d2986f..8bd9432 100644
--- a/resolution/api/options.service.js
+++ b/resolution/api/options.service.js
@@ -515,7 +515,7 @@ async function processImpactReport(agentPayload) {
validationStatus,
});
- await batch.commit();
+ batch.commit().catch((err) => console.warn('[ResolutionService] Firestore batch failed (non-fatal):', err.message));
try {
await db.collection('stats').doc('global').set(
diff --git a/resolution/package-lock.json b/resolution/package-lock.json
index 2254a44..2d35412 100644
--- a/resolution/package-lock.json
+++ b/resolution/package-lock.json
@@ -327,6 +327,7 @@
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"license": "MIT",
"optional": true,
"bin": {
@@ -355,7 +356,7 @@
"node": ">=12.10.0"
}
},
- "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": {
+ "node_modules/@grpc/proto-loader": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz",
"integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==",
@@ -373,25 +374,6 @@
"node": ">=6"
}
},
- "node_modules/@grpc/proto-loader": {
- "version": "0.7.15",
- "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
- "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
- "license": "Apache-2.0",
- "optional": true,
- "dependencies": {
- "lodash.camelcase": "^4.3.0",
- "long": "^5.0.0",
- "protobufjs": "^7.2.5",
- "yargs": "^17.7.2"
- },
- "bin": {
- "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/@js-sdsl/ordered-map": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
@@ -515,6 +497,21 @@
"@opentelemetry/api": "^1.9.0"
}
},
+ "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/context-async-hooks": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.7.0.tgz",
@@ -528,9 +525,9 @@
}
},
"node_modules/@opentelemetry/core": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
- "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz",
+ "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -562,6 +559,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.215.0.tgz",
@@ -581,6 +593,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-logs-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.215.0.tgz",
@@ -602,6 +629,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.215.0.tgz",
@@ -624,6 +682,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.215.0.tgz",
@@ -643,6 +732,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-metrics-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.215.0.tgz",
@@ -663,6 +783,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-prometheus": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.215.0.tgz",
@@ -681,6 +832,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.215.0.tgz",
@@ -702,6 +884,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-http": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.215.0.tgz",
@@ -721,6 +934,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-trace-otlp-proto": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.215.0.tgz",
@@ -740,6 +984,37 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/exporter-zipkin": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.7.0.tgz",
@@ -758,6 +1033,37 @@
"@opentelemetry/api": "^1.0.0"
}
},
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/instrumentation": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.215.0.tgz",
@@ -1037,6 +1343,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/instrumentation-ioredis": {
"version": "0.63.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.63.0.tgz",
@@ -1451,6 +1772,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-grpc-exporter-base": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.215.0.tgz",
@@ -1469,6 +1805,21 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer": {
"version": "0.215.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.215.0.tgz",
@@ -1490,23 +1841,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/otlp-transformer/node_modules/protobufjs": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.1.tgz",
- "integrity": "sha512-NWWCCscLjs+cOKF/s/XVNFRW7Yih0fdH+9brffR5NZCy8k42yRdl5KlWKMVXuI1vfCoy4o1z80XR/W/QUb3V3w==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.3.tgz",
+ "integrity": "sha512-LBYnMWkKLB8fE/ljROPDbCl7mgLSlI+oBe1fAAr5MTqFg4TIi0tYrVVurJvQggOjnUYMQtEZBjrej59ojMNTHQ==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"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": ">=13.7.0",
"long": "^5.0.0"
},
@@ -1529,6 +1901,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/propagator-jaeger": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.7.0.tgz",
@@ -1544,6 +1931,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/redis-common": {
"version": "0.38.3",
"resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz",
@@ -1554,9 +1956,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.5.tgz",
- "integrity": "sha512-KtbVu0Q+I+yg2/fL0pINxekNrejmxw9gpXB8rc3L8WAA0BXnKEp6KEe/glHyzyXOD8V2eZ+AfaoZixFp76ZJDw==",
+ "version": "0.33.6",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.33.6.tgz",
+ "integrity": "sha512-ESA169b7uRy7RWoAb59CRRXLCr6mlEvhoZDEJkAASWYc/udCNaMv7T4vvObgjXEkCUDqCNlibvtLwKkEozGsrA==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1570,9 +1972,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-aws": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.15.0.tgz",
- "integrity": "sha512-+aiEkI+JA94XVIJtltt3XKYbLSaHRqHFdvGOwulBpfNKtEIWDEkKm3qfTl7Q0q9gY9621oXMU1sT5MM7koCnyA==",
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.16.0.tgz",
+ "integrity": "sha512-vD9bb47DJvwn2btrWLFR9GGz5wxejqntZLuyrDJ0l48NMdErrJxWa/+IScaLj8hDe0iyZs/TY1MZRbFX+EUlrg==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1604,9 +2006,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-container": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.6.tgz",
- "integrity": "sha512-b3/SzjmbANgZYfQn40+Mx5Bl0f4IIRTrCRSTN3FQ7j1KB8h3jl+JeJpFZZFY1OU5BtDFXI7VQ334SbKi5Z2R1A==",
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.7.tgz",
+ "integrity": "sha512-Yv66OD7DeN6OaMVSslcdffjNXJ6NEB08Pz98a06wrNH3F/SCzY5xUBPesYNH9fjhom6u9/wblz6ocxW/fhneow==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "^2.0.0",
@@ -1633,65 +2035,59 @@
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
- }
- },
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gaxios": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
- "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
- "license": "Apache-2.0",
- "dependencies": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^7.0.1",
- "node-fetch": "^3.3.2"
- },
- "engines": {
- "node": ">=18"
+ "@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/gcp-metadata": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
- "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
+ "node_modules/@opentelemetry/resources": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz",
+ "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==",
"license": "Apache-2.0",
"dependencies": {
- "gaxios": "^7.0.0",
- "google-logging-utils": "^1.0.0",
- "json-bigint": "^1.0.0"
+ "@opentelemetry/core": "2.7.1",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
- "node": ">=18"
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/google-logging-utils": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
- "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.215.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.215.0.tgz",
+ "integrity": "sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==",
"license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.215.0",
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
"engines": {
- "node": ">=14"
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resource-detector-gcp/node_modules/node-fetch": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
- "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
- "license": "MIT",
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": "^18.19.0 || >=20.6.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/node-fetch"
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/resources": {
+ "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
"integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
@@ -1707,38 +2103,51 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/sdk-logs": {
- "version": "0.215.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.215.0.tgz",
- "integrity": "sha512-y3ucOmphzc4vgBTyIGchs+N/1rkACmoka8QalT2z1LBNM232Z17zMYayHcMl+dgMoOadZ0b72UZv7mDtqy1cFA==",
+ "node_modules/@opentelemetry/sdk-metrics": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
+ "integrity": "sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==",
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/api-logs": "0.215.0",
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0",
+ "@opentelemetry/resources": "2.7.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.9.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/sdk-metrics": {
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.0.tgz",
- "integrity": "sha512-Vd7h95av/LYRsAVN7wbprvvJnHkq7swMXAo7Uad0Uxf9jl6NSReLa0JNivrcc5BVIx/vl2t+cgdVQQbnVhsR9w==",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "2.7.0",
- "@opentelemetry/resources": "2.7.0"
+ "@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
"node": "^18.19.0 || >=20.6.0"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.9.0 <1.10.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
"node_modules/@opentelemetry/sdk-node": {
@@ -1780,6 +2189,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-base": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.0.tgz",
@@ -1797,6 +2237,37 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/resources": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.0.tgz",
+ "integrity": "sha512-K+oi0hNMv94EpZbnW3eyu2X6SGVpD3O5DhG2NIp65Hc7lhAj9brRXTAVzh3wB82+q3ThakEf7Zd7RsFUqcTc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "2.7.0",
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-node": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.7.0.tgz",
@@ -1814,6 +2285,21 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.0.tgz",
+ "integrity": "sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "^1.29.0"
+ },
+ "engines": {
+ "node": "^18.19.0 || >=20.6.0"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/semantic-conventions": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz",
@@ -1857,9 +2343,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/eventemitter": {
@@ -1885,9 +2371,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz",
+ "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==",
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/path": {
@@ -1903,9 +2389,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
+ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
"license": "BSD-3-Clause"
},
"node_modules/@supabase/auth-js": {
@@ -2980,6 +3466,7 @@
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -3075,18 +3562,49 @@
}
},
"node_modules/gcp-metadata": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
- "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz",
+ "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==",
"license": "Apache-2.0",
- "optional": true,
"dependencies": {
- "gaxios": "^6.1.1",
- "google-logging-utils": "^0.0.2",
+ "gaxios": "^7.0.0",
+ "google-logging-utils": "^1.0.0",
"json-bigint": "^1.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=18"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/gaxios": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
+ "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^7.0.1",
+ "node-fetch": "^3.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/gcp-metadata/node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
}
},
"node_modules/get-caller-file": {
@@ -3168,6 +3686,31 @@
"node": ">=14"
}
},
+ "node_modules/google-auth-library/node_modules/gcp-metadata": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz",
+ "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "gaxios": "^6.1.1",
+ "google-logging-utils": "^0.0.2",
+ "json-bigint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/google-auth-library/node_modules/google-logging-utils": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
+ "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/google-gax": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz",
@@ -3192,12 +3735,30 @@
"node": ">=14"
}
},
- "node_modules/google-logging-utils": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz",
- "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==",
+ "node_modules/google-gax/node_modules/@grpc/proto-loader": {
+ "version": "0.7.15",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
+ "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
"license": "Apache-2.0",
"optional": true,
+ "dependencies": {
+ "lodash.camelcase": "^4.3.0",
+ "long": "^5.0.0",
+ "protobufjs": "^7.2.5",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/google-logging-utils": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz",
+ "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=14"
}
@@ -4060,22 +4621,22 @@
}
},
"node_modules/protobufjs": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.5.tgz",
- "integrity": "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==",
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz",
+ "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==",
"hasInstallScript": true,
"license": "BSD-3-Clause",
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/codegen": "^2.0.5",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/inquire": "^1.1.1",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.1",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
@@ -4541,6 +5102,7 @@
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
diff --git a/scripts/run-smoke-pipeline.mjs b/scripts/run-smoke-pipeline.mjs
new file mode 100644
index 0000000..d38a642
--- /dev/null
+++ b/scripts/run-smoke-pipeline.mjs
@@ -0,0 +1,221 @@
+#!/usr/bin/env node
+import { spawn, spawnSync } from 'child_process';
+import { existsSync, mkdirSync, writeFileSync, appendFileSync, readFileSync } from 'fs';
+import { join } from 'path';
+
+const SCENARIO = process.argv[2] || 'pacific_storm';
+const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
+const logsDir = join(process.cwd(), 'smoke-logs');
+if (!existsSync(logsDir)) mkdirSync(logsDir);
+const logPath = join(logsDir, `smoke-${SCENARIO}-${timestamp}.log`);
+
+function runStreamed(cmd, args = [], opts = {}) {
+ console.log('RUN:', cmd, ...(args.length ? ['--', ...args] : []));
+ appendFileSync(logPath, `\n\n=== CMD: ${cmd} ${args.join(' ')}\n`);
+ return new Promise((resolve, reject) => {
+ const child = spawn(cmd, args, { shell: true, stdio: ['ignore', 'pipe', 'pipe'], ...opts });
+ child.stdout.on('data', (d) => {
+ const s = d.toString();
+ process.stdout.write(s);
+ appendFileSync(logPath, s);
+ });
+ child.stderr.on('data', (d) => {
+ const s = d.toString();
+ process.stderr.write(s);
+ appendFileSync(logPath, s);
+ });
+ child.on('error', (err) => {
+ appendFileSync(logPath, `\nPROCESS ERROR: ${err.message}\n`);
+ reject(err);
+ });
+ child.on('close', (code) => {
+ appendFileSync(logPath, `\nPROCESS EXIT CODE: ${code}\n`);
+ if (code === 0) resolve(code);
+ else reject(new Error(`Exit code ${code}`));
+ });
+ });
+}
+
+function runSync(cmd, args = [], opts = {}) {
+ console.log('RUN-SYNC:', cmd, ...(args.length ? ['--', ...args] : []));
+ appendFileSync(logPath, `\n\n=== CMD-SYNC: ${cmd} ${args.join(' ')}\n`);
+ const res = spawnSync(cmd, args, { shell: true, encoding: 'utf8', ...opts });
+ if (res.stdout) appendFileSync(logPath, res.stdout);
+ if (res.stderr) appendFileSync(logPath, res.stderr);
+ appendFileSync(logPath, `\nPROCESS EXIT CODE: ${res.status}\n`);
+ if (res.error) {
+ appendFileSync(logPath, `\nPROCESS ERROR: ${res.error.message}\n`);
+ throw res.error;
+ }
+ if (res.status !== 0) throw new Error(`Exit code ${res.status}`);
+ return res;
+}
+
+(async function main() {
+ console.log('Smoke pipeline run start:', SCENARIO);
+ writeFileSync(logPath, `Smoke run start: ${new Date().toISOString()}\nScenario: ${SCENARIO}\n`);
+
+ // Step 1: inject scenario into resolution simulation
+ console.log('Injecting scenario:', SCENARIO);
+ let injectedDisruptionId = null;
+ let injectedTraceId = null;
+ try {
+ const injectRes = runSync('node', [`resolution/simulation/inject.js`, SCENARIO]);
+ const stdout = injectRes.stdout || '';
+ const didMatch = stdout.match(/Disruption ID:\s*(\S+)/i);
+ const traceMatch = stdout.match(/TraceId:\s*(\S+)/i);
+ const publishedMatch = stdout.match(/Published to event bus:\s*(true|false)/i);
+ const wasPublished = publishedMatch ? String(publishedMatch[1]).toLowerCase() === 'true' : true;
+ if (didMatch) injectedDisruptionId = didMatch[1].trim();
+ if (traceMatch) injectedTraceId = traceMatch[1].trim();
+ appendFileSync(logPath, `\nParsed injection: disruptionId=${injectedDisruptionId} traceId=${injectedTraceId}\n`);
+ if (!wasPublished) {
+ appendFileSync(logPath, `Detected published:false from injector — attempting fallback publish to event-bus\n`);
+ try {
+ const EVENT_BUS_URL = process.env.EVENT_BUS_URL || 'http://localhost:4000';
+ let disruptionRow = null;
+ // Prefer Firestore canonical document (camelCase payload) when available
+ try {
+ const { db } = await import('../shared/db/firebase.js');
+ if (injectedDisruptionId) {
+ const doc = await db.collection('disruptions').doc(injectedDisruptionId).get();
+ if (doc.exists) disruptionRow = doc.data();
+ }
+ } catch (fsErr) {
+ appendFileSync(logPath, `Firestore lookup failed (non-fatal): ${fsErr.message}\n`);
+ }
+ if (!disruptionRow) {
+ const { supabase } = await import('../shared/db/supabase.js');
+ if (injectedDisruptionId) {
+ const { data: dRows, error: dErr } = await supabase.from('disruptions').select('*').eq('id', injectedDisruptionId).limit(1);
+ if (!dErr && dRows && dRows.length) disruptionRow = dRows[0];
+ }
+ }
+ if (!disruptionRow) {
+ appendFileSync(logPath, `Fallback publish: could not find persisted disruption row for id=${injectedDisruptionId}\n`);
+ } else {
+ const payload = { agentId: 'monitor', traceId: injectedTraceId || injectedDisruptionId, timestamp: new Date().toISOString(), payload: disruptionRow };
+ appendFileSync(logPath, `Posting fallback publish to ${EVENT_BUS_URL}/publish with traceId=${payload.traceId}\n`);
+ const resp = await fetch(`${EVENT_BUS_URL}/publish`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ topic: 'disruption-events', payload }) });
+ const respText = await resp.text().catch(() => '');
+ appendFileSync(logPath, `Fallback publish response: ${resp.status} ${resp.statusText} ${respText}\n`);
+ if (!resp.ok) appendFileSync(logPath, `Fallback publish returned non-OK status\n`);
+ }
+ } catch (fbErr) {
+ appendFileSync(logPath, `Fallback publish failed: ${fbErr.message}\n`);
+ }
+ }
+ } catch (err) {
+ console.error('Injection failed, aborting. See log:', logPath);
+ process.exit(2);
+ }
+
+ // Step 2: run the overall smoke script which polls the services
+ console.log('Running smoke-overall.mjs to exercise pipeline...');
+ let smokeTraceId = null;
+ try {
+ const smokeRes = runSync('node', ['scripts/smoke-overall.mjs']);
+ const smokeOut = smokeRes.stdout || '';
+ const m = smokeOut.match(/Trace ID:\s*(\S+)/i);
+ if (m) smokeTraceId = m[1].trim();
+ appendFileSync(logPath, `\nParsed smoke-overall traceId: ${smokeTraceId}\n`);
+ } catch (err) {
+ appendFileSync(logPath, `\nSmoke overall script failed (non-fatal): ${err.message}\n`);
+ console.warn('Smoke overall script failed (non-fatal). Continuing to verification.');
+ }
+
+ // Step 3: capture a quick health snapshot of key services
+ try {
+ const services = ['http://localhost:4000/health','http://localhost:3001/health','http://localhost:3002/health','http://localhost:3003/health','http://localhost:3005/health','http://localhost:3000/health'];
+ for (const s of services) {
+ try {
+ runSync('node', ['-e', `(async()=>{try{const r=await fetch('${s}');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()`]);
+ } catch (e) {
+ console.warn('Health check failed for', s);
+ }
+ }
+ } catch (e) {
+ // ignore
+ }
+
+ appendFileSync(logPath, `\nSmoke run finished: ${new Date().toISOString()}\n`);
+ // Supabase verification: check that key rows for this smoke run were written.
+ try {
+ // Dynamic import of shared supabase client
+ const { supabase } = await import('../shared/db/supabase.js');
+ let allPresent = true;
+ appendFileSync(logPath, `\nSupabase verification start:\n`);
+ if (injectedDisruptionId) {
+ const { data: dRows, error: dErr } = await supabase.from('disruptions').select('id').eq('id', injectedDisruptionId).limit(1);
+ if (dErr) {
+ appendFileSync(logPath, `disruptions query error: ${dErr.message}\n`);
+ allPresent = false;
+ } else if (!dRows || dRows.length === 0) {
+ appendFileSync(logPath, `disruptions: MISSING row for id=${injectedDisruptionId}\n`);
+ allPresent = false;
+ } else appendFileSync(logPath, `disruptions: FOUND ${injectedDisruptionId}\n`);
+ }
+ // Prefer verifying the smoke-run traceId if available, otherwise fall back to the injected trace
+ const traceToCheck = smokeTraceId || injectedTraceId;
+ if (traceToCheck) {
+ const { data: iRows, error: iErr } = await supabase.from('impact_reports').select('id').eq('trace_id', traceToCheck).limit(1);
+ if (iErr) { appendFileSync(logPath, `impact_reports query error: ${iErr.message}\n`); allPresent = false; }
+ else if (!iRows || iRows.length === 0) { appendFileSync(logPath, `impact_reports: MISSING for trace=${traceToCheck}\n`); allPresent = false; }
+ else appendFileSync(logPath, `impact_reports: FOUND for trace=${traceToCheck}\n`);
+
+ const { data: rRows, error: rErr } = await supabase.from('resolution_options').select('id').eq('resolution_id', traceToCheck).limit(1);
+ if (rErr) { appendFileSync(logPath, `resolution_options query error: ${rErr.message}\n`); allPresent = false; }
+ else if (!rRows || rRows.length === 0) { appendFileSync(logPath, `resolution_options: MISSING for resolution_id=${traceToCheck}\n`); allPresent = false; }
+ else appendFileSync(logPath, `resolution_options: FOUND for resolution_id=${traceToCheck}\n`);
+ }
+ // If missing for the smoke trace, attempt fallback publish and poll for up to 30s
+ const traceToPoll = smokeTraceId || injectedTraceId;
+ if (traceToPoll && !allPresent) {
+ appendFileSync(logPath, `\nAttempting fallback publish+poll for trace: ${traceToPoll}\n`);
+ try {
+ const EVENT_BUS_URL = process.env.EVENT_BUS_URL || 'http://localhost:4000';
+ // Prefer Firestore canonical doc when possible
+ let disruptionRow = null;
+ try {
+ const { db } = await import('../shared/db/firebase.js');
+ const q = await db.collection('disruptions').where('traceId', '==', traceToPoll).limit(1).get();
+ if (!q.empty) disruptionRow = q.docs[0].data();
+ } catch (fsErr) {
+ appendFileSync(logPath, `Firestore lookup by trace failed (non-fatal): ${fsErr.message}\n`);
+ }
+ if (!disruptionRow) {
+ const { supabase } = await import('../shared/db/supabase.js');
+ const { data: dRows, error: dErr } = await supabase.from('disruptions').select('*').eq('trace_id', traceToPoll).limit(1);
+ disruptionRow = (!dErr && dRows && dRows.length) ? dRows[0] : null;
+ }
+ if (disruptionRow) {
+ const payload = { agentId: 'monitor', traceId: traceToPoll, timestamp: new Date().toISOString(), payload: disruptionRow };
+ await fetch(`${EVENT_BUS_URL}/publish`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ topic: 'disruption-events', payload }) });
+ appendFileSync(logPath, `Fallback publish posted for trace ${traceToPoll}, now polling Supabase up to 30s\n`);
+ const deadline = Date.now() + 30000;
+ let found = false;
+ while (Date.now() < deadline) {
+ const { data: i2, error: i2Err } = await supabase.from('impact_reports').select('id').eq('trace_id', traceToPoll).limit(1);
+ const { data: r2, error: r2Err } = await supabase.from('resolution_options').select('id').eq('resolution_id', traceToPoll).limit(1);
+ if ((!i2Err && i2 && i2.length) && (!r2Err && r2 && r2.length)) { found = true; break; }
+ await new Promise((res) => setTimeout(res, 3000));
+ }
+ appendFileSync(logPath, `Polling result for ${traceToPoll}: ${found}\n`);
+ if (found) allPresent = true;
+ } else {
+ appendFileSync(logPath, `No persisted disruption found for trace ${traceToPoll}, cannot fallback publish\n`);
+ }
+ } catch (pollErr) {
+ appendFileSync(logPath, `Fallback publish+poll failed: ${pollErr.message}\n`);
+ }
+ }
+ appendFileSync(logPath, `Supabase verification result: ${allPresent}\n`);
+ console.log('Supabase verification result:', allPresent);
+ if (!allPresent) process.exit(4);
+ } catch (err) {
+ appendFileSync(logPath, `Supabase verification failed: ${err.message}\n`);
+ console.error('Supabase verification failed:', err.message);
+ process.exit(5);
+ }
+ console.log('Smoke run complete. Logs:', logPath);
+})();
diff --git a/shared/lib/emailDigest.js b/shared/lib/emailDigest.js
index 5d351a4..b1aaf3a 100644
--- a/shared/lib/emailDigest.js
+++ b/shared/lib/emailDigest.js
@@ -1,30 +1,12 @@
-let resendClient = null;
-
-async function getResendClient() {
- if (resendClient) return resendClient;
- if (!process.env.RESEND_API_KEY) return null;
-
- try {
- const { Resend } = await import('resend');
- resendClient = new Resend(process.env.RESEND_API_KEY);
- return resendClient;
- } catch {
- return null;
- }
-}
-
export async function sendDailyDigest({ orgId, recipientEmail, disruptions, resolutions }) {
- const resend = await getResendClient();
- if (!resend || !recipientEmail) return;
+ if (!recipientEmail) return;
+ const apiKey = process.env.BREVO_API_KEY || process.env.SENDINBLUE_API_KEY || process.env.SIB_API_KEY || process.env.SENDINBLUE_API;
+ if (!apiKey) return;
const critical = disruptions.filter((d) => Number(d.severity || 0) >= 8).length;
const executed = resolutions.filter((r) => r.status === 'resolved').length;
- await resend.emails.send({
- from: process.env.DIGEST_FROM_EMAIL || 'Supply Chain Intelligence ',
- to: recipientEmail,
- subject: `Daily Digest (${orgId || 'default'}) - ${critical} critical events, ${executed} executed`,
- html: `
+ const html = `
Supply Chain Daily Digest
Last 24 hours summary
@@ -41,6 +23,50 @@ export async function sendDailyDigest({ orgId, recipientEmail, disruptions, reso
`).join('')}
Open dashboard
- `,
- });
+ `;
+
+ const sendSmtpEmail = {
+ sender: {
+ name: 'Supply Chain Intelligence',
+ email: process.env.DIGEST_FROM_EMAIL || 'alerts@yourapp.com',
+ },
+ to: [{ email: recipientEmail }],
+ subject: `Daily Digest (${orgId || 'default'}) - ${critical} critical events, ${executed} executed`,
+ htmlContent: html,
+ };
+
+ try {
+ // Prefer SDK when available at runtime; otherwise use direct HTTP API.
+ const sdkName = '@getbrevo/brevo';
+ let usedSdk = false;
+ try {
+ // dynamic import using a variable avoids static bundler resolution
+ const mod = await import(sdkName).catch(() => null);
+ const BrevoClient = mod?.BrevoClient || mod?.default?.BrevoClient;
+ if (BrevoClient) {
+ const client = new BrevoClient({ apiKey });
+ // v5 client API: transactionalEmails.sendTransacEmail
+ if (client?.transactionalEmails?.sendTransacEmail) {
+ await client.transactionalEmails.sendTransacEmail(sendSmtpEmail);
+ usedSdk = true;
+ }
+ }
+ } catch (_e) {
+ // fall through to HTTP send
+ }
+
+ if (!usedSdk) {
+ await fetch('https://api.brevo.com/v3/smtp/email', {
+ method: 'POST',
+ headers: {
+ accept: 'application/json',
+ 'api-key': apiKey,
+ 'content-type': 'application/json',
+ },
+ body: JSON.stringify(sendSmtpEmail),
+ });
+ }
+ } catch (_err) {
+ // swallow errors silently in this helper
+ }
}
diff --git a/shared/lib/firestoreRateLimit.js b/shared/lib/firestoreRateLimit.js
new file mode 100644
index 0000000..cab1bdd
--- /dev/null
+++ b/shared/lib/firestoreRateLimit.js
@@ -0,0 +1,20 @@
+const buckets = new Map();
+
+/**
+ * Returns true if a write to `collection` is allowed.
+ * Default: 100 writes/min per collection.
+ */
+export function allowFirestoreWrite(collection, { maxPerMinute = 100 } = {}) {
+ const now = Date.now();
+ if (!buckets.has(collection)) {
+ buckets.set(collection, { count: 0, resetAt: now + 60_000 });
+ }
+ const bucket = buckets.get(collection);
+ if (now > bucket.resetAt) {
+ bucket.count = 0;
+ bucket.resetAt = now + 60_000;
+ }
+ if (bucket.count >= maxPerMinute) return false;
+ bucket.count += 1;
+ return true;
+}
diff --git a/shared/lib/gemini.js b/shared/lib/gemini.js
index 339d977..c80f65f 100644
--- a/shared/lib/gemini.js
+++ b/shared/lib/gemini.js
@@ -178,3 +178,19 @@ export async function* generateStream(prompt, tools = []) {
throw err;
}
}
+
+/**
+ * Returns true if this process's Gemini client is currently in a cooldown period.
+ */
+export function isRateLimited() {
+ const now = Date.now();
+ return rateLimitState.blocked && now < rateLimitState.unblockAt;
+}
+
+/**
+ * Returns the remaining cooldown in milliseconds, or 0 if not blocked.
+ */
+export function getRateLimitCooldownMs() {
+ if (!rateLimitState.blocked) return 0;
+ return Math.max(0, rateLimitState.unblockAt - Date.now());
+}
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-12-59-952Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-12-59-952Z.log
new file mode 100644
index 0000000..18e370b
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-12-59-952Z.log
@@ -0,0 +1,2 @@
+Smoke run start: 2026-04-30T04:12:59.961Z
+Scenario: pacific_storm
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-13-57-924Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-13-57-924Z.log
new file mode 100644
index 0000000..0c92943
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-13-57-924Z.log
@@ -0,0 +1,2 @@
+Smoke run start: 2026-04-30T04:13:57.933Z
+Scenario: pacific_storm
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-20-22-858Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-20-22-858Z.log
new file mode 100644
index 0000000..576ef57
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-20-22-858Z.log
@@ -0,0 +1,62 @@
+Smoke run start: 2026-04-30T04:20:22.868Z
+Scenario: pacific_storm
+
+
+=== CMD: node resolution/simulation/inject.js pacific_storm
+[Inject] ✅ Event injected successfully
+[Inject] Disruption ID: disruption-27dc7c24-420a-4a61-b0aa-071dbd5336e3
+[Inject] TraceId: disruption-27dc7c24-420a-4a61-b0aa-071dbd5336e3
+[Inject] Published to event bus: false
+
+PROCESS EXIT CODE: 0
+
+
+=== CMD: node scripts/smoke-overall.mjs
+Smoke started at 2026-04-30T04:20:44.881Z
+Trace ID: smoke-20260430-095044
+[event-bus] /health -> 200 (105ms)
+[event-bus] /metrics -> 200 (12ms)
+[disruption] /health -> 200 (11ms)
+[disruption] /metrics -> 200 (8ms)
+[impact] /health -> 200 (53ms)
+[impact] /metrics -> 200 (22ms)
+[resolution] /health -> 200 (31ms)
+[resolution] /metrics -> 200 (13ms)
+[news-intel] /health -> 200 (26ms)
+[news-intel] /metrics -> 200 (10ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (178ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-095044 -> 404 (145ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+(node:15140) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.2856ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (160.1512ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (128.751ms)
+ ✔ fetchFlexportTracking maps scraper output (12.4274ms)
+ ✔ syncFlexportShipments updates active shipments (1.9974ms)
+ ✔ fetchVesselDetails parses public vessel metadata (70.5352ms)
+ ✔ fetchVesselsInPort parses vessel table rows (21.2153ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (171.3425ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2854.1775
+ -> exit 0
+Smoke log written: docs/smoketest/smoke-20260430-095044.log
+Smoke summary written: docs/smoketest/smoke-20260430-095044.json
+OVERALL_PASS=false
+
+PROCESS EXIT CODE: 1
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-22-08-210Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-22-08-210Z.log
new file mode 100644
index 0000000..f9a539c
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-22-08-210Z.log
@@ -0,0 +1,62 @@
+Smoke run start: 2026-04-30T04:22:08.216Z
+Scenario: pacific_storm
+
+
+=== CMD-SYNC: node resolution/simulation/inject.js pacific_storm
+[Inject] ✅ Event injected successfully
+[Inject] Disruption ID: disruption-4fd128d0-eb77-4456-801d-418d60003292
+[Inject] TraceId: disruption-4fd128d0-eb77-4456-801d-418d60003292
+[Inject] Published to event bus: false
+
+PROCESS EXIT CODE: 0
+
+
+=== CMD-SYNC: node scripts/smoke-overall.mjs
+Smoke started at 2026-04-30T04:22:10.567Z
+Trace ID: smoke-20260430-095210
+[event-bus] /health -> 200 (150ms)
+[event-bus] /metrics -> 200 (8ms)
+[disruption] /health -> 200 (11ms)
+[disruption] /metrics -> 200 (8ms)
+[impact] /health -> 200 (15ms)
+[impact] /metrics -> 200 (12ms)
+[resolution] /health -> 200 (10ms)
+[resolution] /metrics -> 200 (8ms)
+[news-intel] /health -> 200 (38ms)
+[news-intel] /metrics -> 200 (10ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (182ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-095210 -> 404 (61ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.6289ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (128.9232ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (160.479ms)
+ ✔ fetchFlexportTracking maps scraper output (8.2625ms)
+ ✔ syncFlexportShipments updates active shipments (1.6428ms)
+ ✔ fetchVesselDetails parses public vessel metadata (212.4411ms)
+ ✔ fetchVesselsInPort parses vessel table rows (50.1144ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (271.1517ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2544.9513
+ -> exit 0
+Smoke log written: docs/smoketest/smoke-20260430-095210.log
+Smoke summary written: docs/smoketest/smoke-20260430-095210.json
+OVERALL_PASS=false
+(node:14732) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+
+PROCESS EXIT CODE: 1
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-29-16-827Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-29-16-827Z.log
new file mode 100644
index 0000000..5905774
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-29-16-827Z.log
@@ -0,0 +1,64 @@
+Smoke run start: 2026-04-30T04:29:16.862Z
+Scenario: pacific_storm
+
+
+=== CMD-SYNC: node resolution/simulation/inject.js pacific_storm
+[Inject] ✅ Event injected successfully
+[Inject] Disruption ID: disruption-231136bb-6e20-4a29-b14b-39647c0c73da
+[Inject] TraceId: disruption-231136bb-6e20-4a29-b14b-39647c0c73da
+[Inject] Published to event bus: false
+
+PROCESS EXIT CODE: 0
+
+Parsed injection: disruptionId=disruption-231136bb-6e20-4a29-b14b-39647c0c73da traceId=disruption-231136bb-6e20-4a29-b14b-39647c0c73da
+
+
+=== CMD-SYNC: node scripts/smoke-overall.mjs
+Smoke started at 2026-04-30T04:29:20.938Z
+Trace ID: smoke-20260430-095920
+[event-bus] /health -> 200 (745ms)
+[event-bus] /metrics -> 200 (47ms)
+[disruption] /health -> 200 (12ms)
+[disruption] /metrics -> 200 (13ms)
+[impact] /health -> 200 (12ms)
+[impact] /metrics -> 200 (14ms)
+[resolution] /health -> 200 (15ms)
+[resolution] /metrics -> 200 (17ms)
+[news-intel] /health -> 200 (32ms)
+[news-intel] /metrics -> 200 (33ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (203ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-095920 -> 404 (371ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (20.6608ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (170.6572ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (269.7188ms)
+ ✔ fetchFlexportTracking maps scraper output (16.2365ms)
+ ✔ syncFlexportShipments updates active shipments (1.1846ms)
+ ✔ fetchVesselDetails parses public vessel metadata (62.0228ms)
+ ✔ fetchVesselsInPort parses vessel table rows (20.5983ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (87.0782ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 3369.3837
+ -> exit 0
+Smoke log written: docs/smoketest/smoke-20260430-095920.log
+Smoke summary written: docs/smoketest/smoke-20260430-095920.json
+OVERALL_PASS=false
+(node:14392) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+
+PROCESS EXIT CODE: 1
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-31-59-199Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-31-59-199Z.log
new file mode 100644
index 0000000..6990691
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-31-59-199Z.log
@@ -0,0 +1,176 @@
+Smoke run start: 2026-04-30T04:31:59.209Z
+Scenario: pacific_storm
+
+
+=== CMD-SYNC: node resolution/simulation/inject.js pacific_storm
+[Inject] ✅ Event injected successfully
+[Inject] Disruption ID: disruption-5081e2f7-8382-4f26-9afa-fb77f3cb5460
+[Inject] TraceId: disruption-5081e2f7-8382-4f26-9afa-fb77f3cb5460
+[Inject] Published to event bus: false
+
+PROCESS EXIT CODE: 0
+
+Parsed injection: disruptionId=disruption-5081e2f7-8382-4f26-9afa-fb77f3cb5460 traceId=disruption-5081e2f7-8382-4f26-9afa-fb77f3cb5460
+
+
+=== CMD-SYNC: node scripts/smoke-overall.mjs
+Smoke started at 2026-04-30T04:32:00.597Z
+Trace ID: smoke-20260430-100200
+[event-bus] /health -> 200 (183ms)
+[event-bus] /metrics -> 200 (18ms)
+[disruption] /health -> 200 (53ms)
+[disruption] /metrics -> 200 (14ms)
+[impact] /health -> 200 (39ms)
+[impact] /metrics -> 200 (30ms)
+[resolution] /health -> 200 (14ms)
+[resolution] /metrics -> 200 (7ms)
+[news-intel] /health -> 200 (10ms)
+[news-intel] /metrics -> 200 (12ms)
+Baseline counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (183ms)
+Post counts: {"disruption-events":1,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-100200 -> 404 (148ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (3.1272ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (144.3016ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (153.7944ms)
+ ✔ fetchFlexportTracking maps scraper output (13.9472ms)
+ ✔ syncFlexportShipments updates active shipments (1.7764ms)
+ ✔ fetchVesselDetails parses public vessel metadata (65.2195ms)
+ ✔ fetchVesselsInPort parses vessel table rows (43.3042ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (114.3954ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2902.7095
+ -> exit 0
+Smoke log written: docs/smoketest/smoke-20260430-100200.log
+Smoke summary written: docs/smoketest/smoke-20260430-100200.json
+OVERALL_PASS=false
+(node:15596) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+
+PROCESS EXIT CODE: 1
+
+Smoke overall script failed (non-fatal): Exit code 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:4000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3001/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3002/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3003/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3005/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+Smoke run finished: 2026-04-30T04:34:08.929Z
+
+Supabase verification start:
+disruptions: FOUND disruption-5081e2f7-8382-4f26-9afa-fb77f3cb5460
+impact_reports: MISSING for trace=disruption-5081e2f7-8382-4f26-9afa-fb77f3cb5460
+resolution_options: MISSING for resolution_id=disruption-5081e2f7-8382-4f26-9afa-fb77f3cb5460
+Supabase verification result: false
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-36-51-254Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-36-51-254Z.log
new file mode 100644
index 0000000..5d9701e
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-36-51-254Z.log
@@ -0,0 +1,179 @@
+Smoke run start: 2026-04-30T04:36:51.271Z
+Scenario: pacific_storm
+
+
+=== CMD-SYNC: node resolution/simulation/inject.js pacific_storm
+[Inject] ✅ Event injected successfully
+[Inject] Disruption ID: disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81
+[Inject] TraceId: disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81
+[Inject] Published to event bus: false
+
+PROCESS EXIT CODE: 0
+
+Parsed injection: disruptionId=disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81 traceId=disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81
+Detected published:false from injector — attempting fallback publish to event-bus
+Posting fallback publish to http://localhost:4000/publish with traceId=disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81
+Fallback publish response: 200 OK {"ok":true,"topic":"disruption-events","traceId":"disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81"}
+
+
+=== CMD-SYNC: node scripts/smoke-overall.mjs
+Smoke started at 2026-04-30T04:36:53.964Z
+Trace ID: smoke-20260430-100653
+[event-bus] /health -> 200 (208ms)
+[event-bus] /metrics -> 200 (12ms)
+[disruption] /health -> 200 (22ms)
+[disruption] /metrics -> 200 (31ms)
+[impact] /health -> 200 (8ms)
+[impact] /metrics -> 200 (11ms)
+[resolution] /health -> 200 (11ms)
+[resolution] /metrics -> 200 (7ms)
+[news-intel] /health -> 200 (22ms)
+[news-intel] /metrics -> 200 (8ms)
+Baseline counts: {"disruption-events":2,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (183ms)
+Post counts: {"disruption-events":2,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-100653 -> 404 (358ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.1961ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (270.1755ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (165.2036ms)
+ ✔ fetchFlexportTracking maps scraper output (4.4323ms)
+ ✔ syncFlexportShipments updates active shipments (5.8291ms)
+ ✔ fetchVesselDetails parses public vessel metadata (120.5212ms)
+ ✔ fetchVesselsInPort parses vessel table rows (13.4171ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (130.6613ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 3394.7097
+ -> exit 0
+Smoke log written: docs/smoketest/smoke-20260430-100653.log
+Smoke summary written: docs/smoketest/smoke-20260430-100653.json
+OVERALL_PASS=false
+(node:3912) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+
+PROCESS EXIT CODE: 1
+
+Smoke overall script failed (non-fatal): Exit code 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:4000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3001/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3002/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3003/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3005/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+Smoke run finished: 2026-04-30T04:39:03.100Z
+
+Supabase verification start:
+disruptions: FOUND disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81
+impact_reports: MISSING for trace=disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81
+resolution_options: MISSING for resolution_id=disruption-ccf91c15-a294-4d8e-b7b9-ab8e81751d81
+Supabase verification result: false
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-42-25-639Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-42-25-639Z.log
new file mode 100644
index 0000000..5fa2d5f
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-42-25-639Z.log
@@ -0,0 +1,183 @@
+Smoke run start: 2026-04-30T04:42:25.680Z
+Scenario: pacific_storm
+
+
+=== CMD-SYNC: node resolution/simulation/inject.js pacific_storm
+[Inject] ✅ Event injected successfully
+[Inject] Disruption ID: disruption-4a00d576-51a0-4290-847e-f92133e25abc
+[Inject] TraceId: disruption-4a00d576-51a0-4290-847e-f92133e25abc
+[Inject] Published to event bus: false
+
+PROCESS EXIT CODE: 0
+
+Parsed injection: disruptionId=disruption-4a00d576-51a0-4290-847e-f92133e25abc traceId=disruption-4a00d576-51a0-4290-847e-f92133e25abc
+Detected published:false from injector — attempting fallback publish to event-bus
+Posting fallback publish to http://localhost:4000/publish with traceId=disruption-4a00d576-51a0-4290-847e-f92133e25abc
+Fallback publish response: 200 OK {"ok":true,"topic":"disruption-events","traceId":"disruption-4a00d576-51a0-4290-847e-f92133e25abc"}
+
+
+=== CMD-SYNC: node scripts/smoke-overall.mjs
+Smoke started at 2026-04-30T04:42:29.071Z
+Trace ID: smoke-20260430-101229
+[event-bus] /health -> 200 (279ms)
+[event-bus] /metrics -> 200 (10ms)
+[disruption] /health -> 200 (12ms)
+[disruption] /metrics -> 200 (7ms)
+[impact] /health -> 200 (14ms)
+[impact] /metrics -> 200 (17ms)
+[resolution] /health -> 200 (17ms)
+[resolution] /metrics -> 200 (8ms)
+[news-intel] /health -> 200 (9ms)
+[news-intel] /metrics -> 200 (17ms)
+Baseline counts: {"disruption-events":3,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (175ms)
+Post counts: {"disruption-events":3,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":0,"resolution-options":0,"news-alerts":0}
+GET /options/smoke-20260430-101229 -> 404 (135ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (5.7493ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (158.7259ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (167.3625ms)
+ ✔ fetchFlexportTracking maps scraper output (4.2796ms)
+ ✔ syncFlexportShipments updates active shipments (5.4115ms)
+ ✔ fetchVesselDetails parses public vessel metadata (117.5679ms)
+ ✔ fetchVesselsInPort parses vessel table rows (42.7084ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (114.3219ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 3000.3825
+ -> exit 0
+Smoke log written: docs/smoketest/smoke-20260430-101229.log
+Smoke summary written: docs/smoketest/smoke-20260430-101229.json
+OVERALL_PASS=false
+(node:8640) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+
+PROCESS EXIT CODE: 1
+
+Smoke overall script failed (non-fatal): Exit code 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:4000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3001/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3002/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3003/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3005/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+Smoke run finished: 2026-04-30T04:44:37.584Z
+
+Supabase verification start:
+disruptions: FOUND disruption-4a00d576-51a0-4290-847e-f92133e25abc
+impact_reports: MISSING for trace=disruption-4a00d576-51a0-4290-847e-f92133e25abc
+resolution_options: MISSING for resolution_id=disruption-4a00d576-51a0-4290-847e-f92133e25abc
+
+Attempting fallback publish+poll for trace: disruption-4a00d576-51a0-4290-847e-f92133e25abc
+Fallback publish posted for trace disruption-4a00d576-51a0-4290-847e-f92133e25abc, now polling Supabase up to 30s
+Polling result for disruption-4a00d576-51a0-4290-847e-f92133e25abc: false
+Supabase verification result: false
diff --git a/smoke-logs/smoke-pacific_storm-2026-04-30T04-47-47-518Z.log b/smoke-logs/smoke-pacific_storm-2026-04-30T04-47-47-518Z.log
new file mode 100644
index 0000000..eecb2ff
--- /dev/null
+++ b/smoke-logs/smoke-pacific_storm-2026-04-30T04-47-47-518Z.log
@@ -0,0 +1,179 @@
+Smoke run start: 2026-04-30T04:47:47.822Z
+Scenario: pacific_storm
+
+
+=== CMD-SYNC: node resolution/simulation/inject.js pacific_storm
+[Inject] ✅ Event injected successfully
+[Inject] Disruption ID: disruption-ddc79014-4df0-438b-9035-8b1b89548835
+[Inject] TraceId: disruption-ddc79014-4df0-438b-9035-8b1b89548835
+[Inject] Published to event bus: false
+
+PROCESS EXIT CODE: 0
+
+Parsed injection: disruptionId=disruption-ddc79014-4df0-438b-9035-8b1b89548835 traceId=disruption-ddc79014-4df0-438b-9035-8b1b89548835
+Detected published:false from injector — attempting fallback publish to event-bus
+Posting fallback publish to http://localhost:4000/publish with traceId=disruption-ddc79014-4df0-438b-9035-8b1b89548835
+Fallback publish response: 200 OK {"ok":true,"topic":"disruption-events","traceId":"disruption-ddc79014-4df0-438b-9035-8b1b89548835"}
+
+
+=== CMD-SYNC: node scripts/smoke-overall.mjs
+Smoke started at 2026-04-30T04:47:53.458Z
+Trace ID: smoke-20260430-101753
+[event-bus] /health -> 200 (217ms)
+[event-bus] /metrics -> 200 (10ms)
+[disruption] /health -> 200 (9ms)
+[disruption] /metrics -> 200 (10ms)
+[impact] /health -> 200 (8ms)
+[impact] /metrics -> 200 (10ms)
+[resolution] /health -> 200 (13ms)
+[resolution] /metrics -> 200 (10ms)
+[news-intel] /health -> 200 (8ms)
+[news-intel] /metrics -> 200 (14ms)
+Baseline counts: {"disruption-events":5,"impact-reports":2,"resolution-options":2,"news-alerts":0}
+POST /events -> 201 (186ms)
+Post counts: {"disruption-events":5,"impact-reports":3,"resolution-options":3,"news-alerts":0}
+Count delta: {"disruption-events":0,"impact-reports":1,"resolution-options":1,"news-alerts":0}
+GET /options/smoke-20260430-101753 -> 404 (102ms)
+Running scraper smoke checks
+$ npm run smoke:scraper
+ > opentrade@1.0.0 smoke:scraper
+ > node scripts/smoke-scraper.mjs
+ [smoke-scraper] PASS: fetch/cache/rss helpers are working
+ -> exit 0
+$ node --test disruption/tests/aisResolver.smoke.test.js disruption/tests/ecmwfScraper.smoke.test.js disruption/tests/flexportTracker.smoke.test.js disruption/tests/marineTrafficScraper.smoke.test.js disruption/tests/vesselFinderScraper.smoke.test.js
+ ✔ resolveVesselPosition prefers recent live AIS data (3.058ms)
+ ✔ resolveVesselPosition falls back to MarineTraffic then VesselFinder (137.1604ms)
+ ✔ fetchEcmwfForecast computes risk and includes hourly slices (163.0275ms)
+ ✔ fetchFlexportTracking maps scraper output (8.3929ms)
+ ✔ syncFlexportShipments updates active shipments (2.8543ms)
+ ✔ fetchVesselDetails parses public vessel metadata (95.2851ms)
+ ✔ fetchVesselsInPort parses vessel table rows (6.551ms)
+ ✔ fetchVesselFromVesselFinder parses table and json-ld (115.1959ms)
+ ℹ tests 8
+ ℹ suites 0
+ ℹ pass 8
+ ℹ fail 0
+ ℹ cancelled 0
+ ℹ skipped 0
+ ℹ todo 0
+ ℹ duration_ms 2950.0662
+ -> exit 0
+Smoke log written: docs/smoketest/smoke-20260430-101753.log
+Smoke summary written: docs/smoketest/smoke-20260430-101753.json
+OVERALL_PASS=false
+(node:13084) [DEP0190] DeprecationWarning: Passing args to a child process with shell option true can lead to security vulnerabilities, as the arguments are not escaped, only concatenated.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+
+PROCESS EXIT CODE: 1
+
+Smoke overall script failed (non-fatal): Exit code 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:4000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3001/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3002/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3003/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3005/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+
+=== CMD-SYNC: node -e (async()=>{try{const r=await fetch('http://localhost:3000/health');console.log(await r.text())}catch(e){console.error(e.message);process.exit(2)}})()
+[eval]:1
+(async()=
+
+Invalid assignment target
+
+SyntaxError: Unexpected end of input
+ at makeContextifyScript (node:internal/vm:194:14)
+ at compileScript (node:internal/process/execution:388:10)
+ at evalTypeScript (node:internal/process/execution:260:22)
+ at node:internal/main/eval_string:71:3
+
+Node.js v24.13.0
+
+PROCESS EXIT CODE: 1
+
+Smoke run finished: 2026-04-30T04:50:01.693Z
+
+Supabase verification start:
+disruptions: FOUND disruption-ddc79014-4df0-438b-9035-8b1b89548835
+impact_reports: FOUND for trace=disruption-ddc79014-4df0-438b-9035-8b1b89548835
+resolution_options: FOUND for resolution_id=disruption-ddc79014-4df0-438b-9035-8b1b89548835
+Supabase verification result: true
diff --git a/supabase/migrations/20260429000000_fix_pipeline_constraints.sql b/supabase/migrations/20260429000000_fix_pipeline_constraints.sql
new file mode 100644
index 0000000..58d5feb
--- /dev/null
+++ b/supabase/migrations/20260429000000_fix_pipeline_constraints.sql
@@ -0,0 +1,11 @@
+-- Run in Supabase SQL Editor
+
+-- 1. Drop FK constraints blocking pipeline writes
+ALTER TABLE public.impact_reports DROP CONSTRAINT IF EXISTS impact_reports_disruption_id_fkey;
+ALTER TABLE public.impact_report_shipments DROP CONSTRAINT IF EXISTS impact_report_shipments_impact_report_id_fkey;
+ALTER TABLE public.resolution_options DROP CONSTRAINT IF EXISTS resolution_options_resolution_id_fkey;
+ALTER TABLE public.resolutions DROP CONSTRAINT IF EXISTS resolutions_impact_report_id_fkey;
+ALTER TABLE public.resolutions DROP CONSTRAINT IF EXISTS resolutions_disruption_id_fkey;
+
+-- 2. Add missing updated_at to resolutions (resolution service writes this column)
+ALTER TABLE public.resolutions ADD COLUMN IF NOT EXISTS updated_at timestamptz DEFAULT now();
diff --git a/supabase/schema.sql b/supabase/schema.sql
new file mode 100644
index 0000000..5ed7909
--- /dev/null
+++ b/supabase/schema.sql
@@ -0,0 +1,266 @@
+-- WARNING: This schema is for context only and is not meant to be run.
+-- Table order and constraints may not be valid for execution.
+
+CREATE TABLE public.agent_events (
+ id uuid NOT NULL DEFAULT uuid_generate_v4(),
+ trace_id text NOT NULL,
+ agent_id USER-DEFINED NOT NULL,
+ topic USER-DEFINED NOT NULL,
+ payload_type text NOT NULL,
+ payload jsonb NOT NULL,
+ published_at timestamp with time zone NOT NULL DEFAULT now(),
+ ack_at timestamp with time zone,
+ retry_count smallint NOT NULL DEFAULT 0,
+ CONSTRAINT agent_events_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.agent_metrics (
+ id bigint NOT NULL DEFAULT nextval('agent_metrics_id_seq'::regclass),
+ agent text NOT NULL,
+ processed integer DEFAULT 0,
+ errors integer DEFAULT 0,
+ avg_latency_ms integer,
+ recorded_at timestamp with time zone DEFAULT now(),
+ CONSTRAINT agent_metrics_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.api_keys (
+ id uuid NOT NULL DEFAULT gen_random_uuid(),
+ org_id text NOT NULL,
+ label text,
+ key_hash text NOT NULL UNIQUE,
+ created_at timestamp with time zone DEFAULT now(),
+ last_used timestamp with time zone,
+ CONSTRAINT api_keys_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.canal_events (
+ id uuid NOT NULL DEFAULT gen_random_uuid(),
+ canal text CHECK (canal = ANY (ARRAY['suez'::text, 'panama'::text])),
+ status text,
+ headline text,
+ detected_at timestamp with time zone DEFAULT now(),
+ CONSTRAINT canal_events_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.capabilities (
+ id smallint NOT NULL DEFAULT nextval('capabilities_id_seq'::regclass),
+ name text NOT NULL UNIQUE,
+ CONSTRAINT capabilities_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.disruptions (
+ id text NOT NULL,
+ trace_id text NOT NULL UNIQUE,
+ type USER-DEFINED NOT NULL,
+ severity smallint NOT NULL CHECK (severity >= 1 AND severity <= 10),
+ location text NOT NULL,
+ epicenter_lat numeric NOT NULL,
+ epicenter_lng numeric NOT NULL,
+ affected_zones ARRAY NOT NULL DEFAULT '{}'::text[],
+ confidence numeric NOT NULL CHECK (confidence >= 0::numeric AND confidence <= 1::numeric),
+ raw_description text NOT NULL,
+ weather_data jsonb,
+ published boolean NOT NULL DEFAULT false,
+ resolved boolean NOT NULL DEFAULT false,
+ resolved_at timestamp with time zone,
+ detected_at timestamp with time zone NOT NULL DEFAULT now(),
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ org_id text,
+ CONSTRAINT disruptions_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.errors (
+ id bigint NOT NULL DEFAULT nextval('errors_id_seq'::regclass),
+ service text NOT NULL,
+ trace_id text,
+ error_msg text NOT NULL,
+ stack text,
+ context jsonb,
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ CONSTRAINT errors_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.impact_report_shipments (
+ id bigint NOT NULL DEFAULT nextval('impact_report_shipments_id_seq'::regclass),
+ impact_report_id text NOT NULL,
+ shipment_id text NOT NULL,
+ distance_km integer NOT NULL,
+ impact_score numeric NOT NULL CHECK (impact_score >= 0::numeric AND impact_score <= 1::numeric),
+ cargo_value_usd integer NOT NULL,
+ carrier text NOT NULL,
+ origin text NOT NULL,
+ destination text NOT NULL,
+ corridor text NOT NULL,
+ current_lat numeric NOT NULL,
+ current_lng numeric NOT NULL,
+ status_at_impact USER-DEFINED NOT NULL DEFAULT 'active'::shipment_status,
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ CONSTRAINT impact_report_shipments_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.impact_reports (
+ id text NOT NULL,
+ disruption_id text NOT NULL,
+ trace_id text NOT NULL,
+ cascade_risk USER-DEFINED NOT NULL DEFAULT 'LOW'::cascade_risk,
+ urgency smallint NOT NULL CHECK (urgency >= 1 AND urgency <= 10),
+ total_cargo_at_risk_usd bigint NOT NULL DEFAULT 0,
+ analysis_text text NOT NULL,
+ shipment_count smallint NOT NULL DEFAULT 0,
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ CONSTRAINT impact_reports_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.news_alert_dedup (
+ external_id text NOT NULL,
+ source_url text NOT NULL,
+ processed_at timestamp with time zone NOT NULL DEFAULT now(),
+ CONSTRAINT news_alert_dedup_pkey PRIMARY KEY (external_id)
+);
+CREATE TABLE public.news_alerts (
+ id text NOT NULL,
+ source_url text NOT NULL,
+ headline text NOT NULL,
+ summary text,
+ source text,
+ published_at timestamp with time zone,
+ detected_at timestamp with time zone NOT NULL DEFAULT now(),
+ relevance_score double precision NOT NULL DEFAULT 0 CHECK (relevance_score >= 0::double precision AND relevance_score <= 1::double precision),
+ disruption_type text NOT NULL DEFAULT 'OTHER'::text CHECK (disruption_type = ANY (ARRAY['WEATHER'::text, 'STRIKE'::text, 'GEOPOLITICAL'::text, 'INFRASTRUCTURE'::text, 'OTHER'::text])),
+ severity integer NOT NULL DEFAULT 5 CHECK (severity >= 1 AND severity <= 10),
+ location text,
+ epicenter_lat double precision,
+ epicenter_lng double precision,
+ affected_corridors ARRAY,
+ api_source text DEFAULT 'gdelt'::text,
+ injected boolean NOT NULL DEFAULT false,
+ CONSTRAINT news_alerts_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.outbound_webhooks (
+ id uuid NOT NULL DEFAULT gen_random_uuid(),
+ org_id text NOT NULL,
+ event text NOT NULL,
+ url text NOT NULL,
+ secret text NOT NULL,
+ active boolean NOT NULL DEFAULT true,
+ created_at timestamp with time zone DEFAULT now(),
+ CONSTRAINT outbound_webhooks_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.port_congestion (
+ id bigint NOT NULL DEFAULT nextval('port_congestion_id_seq'::regclass),
+ locode text NOT NULL,
+ port_name text,
+ congestion_score integer,
+ avg_wait_hours real,
+ vessel_count integer,
+ fetched_at timestamp with time zone DEFAULT now(),
+ CONSTRAINT port_congestion_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.push_subscriptions (
+ id uuid NOT NULL DEFAULT gen_random_uuid(),
+ org_id text NOT NULL,
+ user_id text NOT NULL,
+ endpoint text NOT NULL UNIQUE,
+ p256dh text,
+ auth text,
+ created_at timestamp with time zone DEFAULT now(),
+ CONSTRAINT push_subscriptions_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.resolution_options (
+ id bigint NOT NULL DEFAULT nextval('resolution_options_id_seq'::regclass),
+ resolution_id text NOT NULL,
+ trace_id text NOT NULL,
+ rank smallint NOT NULL CHECK (rank = ANY (ARRAY[1, 2, 3])),
+ title text NOT NULL,
+ description text NOT NULL,
+ cost_delta integer NOT NULL,
+ time_delta integer NOT NULL,
+ supplier_id text,
+ supplier_name text NOT NULL,
+ confidence numeric NOT NULL CHECK (confidence >= 0::numeric AND confidence <= 1::numeric),
+ route_geojson jsonb NOT NULL,
+ transport_mode USER-DEFINED NOT NULL DEFAULT 'sea-freight'::transport_mode,
+ selected boolean NOT NULL DEFAULT false,
+ executed_at timestamp with time zone,
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ CONSTRAINT resolution_options_pkey PRIMARY KEY (id),
+ CONSTRAINT resolution_options_supplier_id_fkey FOREIGN KEY (supplier_id) REFERENCES public.suppliers(id)
+);
+CREATE TABLE public.resolutions (
+ id text NOT NULL,
+ trace_id text NOT NULL UNIQUE,
+ impact_report_id text NOT NULL,
+ disruption_id text NOT NULL,
+ cascade_risk USER-DEFINED NOT NULL,
+ urgency smallint NOT NULL,
+ total_cargo_at_risk_usd bigint NOT NULL,
+ analysis_text text NOT NULL,
+ option_count smallint NOT NULL DEFAULT 3,
+ status text NOT NULL DEFAULT 'pending'::text CHECK (status = ANY (ARRAY['pending'::text, 'resolved'::text, 'expired'::text])),
+ selected_rank smallint CHECK (selected_rank = ANY (ARRAY[1, 2, 3])),
+ resolved_at timestamp with time zone,
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ org_id text,
+ updated_at timestamp with time zone DEFAULT now(),
+ CONSTRAINT resolutions_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.shipments (
+ id text NOT NULL,
+ origin text NOT NULL,
+ destination text NOT NULL,
+ origin_lat double precision NOT NULL,
+ origin_lng double precision NOT NULL,
+ dest_lat double precision NOT NULL,
+ dest_lng double precision NOT NULL,
+ current_lat double precision,
+ current_lng double precision,
+ status text NOT NULL DEFAULT 'active'::text CHECK (status = ANY (ARRAY['active'::text, 'delayed'::text, 'rerouted'::text, 'disrupted'::text])),
+ carrier text NOT NULL,
+ cargo_value_usd bigint,
+ eta timestamp with time zone,
+ corridor text,
+ mode text NOT NULL DEFAULT 'sea-freight'::text CHECK (mode = ANY (ARRAY['sea-freight'::text, 'air-freight'::text, 'rail'::text, 'road'::text])),
+ payment_amount_usd bigint,
+ payment_status text NOT NULL DEFAULT 'pending'::text CHECK (payment_status = ANY (ARRAY['pending'::text, 'paid'::text, 'overdue'::text, 'partial'::text])),
+ import_export text NOT NULL DEFAULT 'export'::text CHECK (import_export = ANY (ARRAY['import'::text, 'export'::text, 'transit'::text])),
+ departure_date timestamp with time zone,
+ tracking_number text,
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ updated_at timestamp with time zone NOT NULL DEFAULT now(),
+ org_id text,
+ CONSTRAINT shipments_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.supplier_capabilities (
+ supplier_id text NOT NULL,
+ capability_id smallint NOT NULL,
+ certified_at date,
+ expires_at date,
+ CONSTRAINT supplier_capabilities_pkey PRIMARY KEY (supplier_id, capability_id),
+ CONSTRAINT supplier_capabilities_supplier_id_fkey FOREIGN KEY (supplier_id) REFERENCES public.suppliers(id),
+ CONSTRAINT supplier_capabilities_capability_id_fkey FOREIGN KEY (capability_id) REFERENCES public.capabilities(id)
+);
+CREATE TABLE public.suppliers (
+ id text NOT NULL,
+ name text NOT NULL,
+ region text NOT NULL,
+ base_cost_per_km numeric NOT NULL,
+ reliability_score smallint NOT NULL CHECK (reliability_score >= 0 AND reliability_score <= 100),
+ contact_email text,
+ website text,
+ headquarters_country text,
+ is_active boolean NOT NULL DEFAULT true,
+ max_cargo_tons numeric,
+ insurance_coverage text,
+ notes text,
+ created_at timestamp with time zone NOT NULL DEFAULT now(),
+ updated_at timestamp with time zone NOT NULL DEFAULT now(),
+ CONSTRAINT suppliers_pkey PRIMARY KEY (id)
+);
+CREATE TABLE public.user_orgs (
+ user_id text NOT NULL,
+ org_id text NOT NULL,
+ role text NOT NULL DEFAULT 'viewer'::text CHECK (role = ANY (ARRAY['owner'::text, 'admin'::text, 'analyst'::text, 'viewer'::text])),
+ CONSTRAINT user_orgs_pkey PRIMARY KEY (user_id, org_id)
+);
+CREATE TABLE public.vessel_positions (
+ mmsi text NOT NULL,
+ lat double precision,
+ lng double precision,
+ speed real,
+ heading real,
+ nav_status integer,
+ updated_at timestamp with time zone DEFAULT now(),
+ CONSTRAINT vessel_positions_pkey PRIMARY KEY (mmsi)
+);
\ No newline at end of file
diff --git a/smoke-check-results.json b/tests/integration/smoke-check-results.json
similarity index 100%
rename from smoke-check-results.json
rename to tests/integration/smoke-check-results.json