diff --git a/CONFIG.md b/CONFIG.md index bda407f..d22e9ec 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -18,6 +18,7 @@ | Frontier | GPT-4o | Vision checks | Available | | Reasoning | o3-mini | Verification, analysis | Available | | Local | Local (Ollama/vLLM) | Offline, cheap tasks | Check status | +| Compound | OpenRouter Fusion | Fable-tier compound (draft→critique→fuse) | Available (needs key) | Routing priority: 1. Never route to blocked models (Fable 5, Mythos 5) @@ -25,7 +26,8 @@ Routing priority: 3. Vision tasks → Opus 4.8 or GPT-4o (vision-capable) 4. Grading/verification → Haiku (cheapest, fast) 5. Code review → Sonnet 4.6 -6. Offline fallback → local model +6. Fusion/compound → OpenRouter Fusion (or local panel dispatch) +7. Offline fallback → local model --- diff --git a/PHASES/phase-15-fusion.md b/PHASES/phase-15-fusion.md new file mode 100644 index 0000000..f777152 --- /dev/null +++ b/PHASES/phase-15-fusion.md @@ -0,0 +1,103 @@ +# Phase 15: Multi-Model Fusion + +**Date:** 2026-06-14 + +**Drivers:** +- Fable 5 / Mythos 5 blocked by US export control directive (June 12, 2026) +- OpenRouter Fusion API achieves Fable-tier intelligence at half the price +- fusion-fable pattern proves fan-out panel + judge synthesis matches or exceeds single best model +- Fable 5 leaked system prompt provides tone, citation, refusal, and behavior patterns +- CineFable provides visual media generation patterns (image/video via fal.ai) + +--- + +## What Was Built + +### 1. Fusion Executor (`src/examples/executors/fusion-executor.ts`) +- PhaseExecutor-compatible multi-model panel execution +- Draft → Critique → Fuse pipeline +- Configurable panels: opus4.8-4.8, opus4.8-gpt5.5, opus4.8-gpt5.5-gemini, sonnet-haiku-opus +- Structured analysis output: Consensus, Contradictions, Unique Insights, Blind Spots +- Judge model always synthesizes final answer grounded in panel analysis + +### 2. OpenRouter Fusion Executor (`src/examples/executors/openrouter-fusion-executor.ts`) +- Direct integration with OpenRouter Fusion API +- PhaseExecutor-compatible for drop-in use in feedback loop +- Configurable draft/critic/fusion model overrides +- Graceful fallback when API key not configured + +### 3. Fable 5 Prompt Engine (`src/upgrades/fable5-prompt-engine.ts`) +- Tone & behavior rules extracted from leaked Fable 5 system prompt +- Citation format helpers (inline and footnote) +- Refusal handling (cybersecurity_exploit, harmful_content, financial/medical) +- Effort-level prompt builder (Low → Ultracode) +- Self-check utility + +### 4. Media Generator (`src/upgrades/media-generator.ts`) +- CineFable-style image generation (fal-ai/nano-banana-pro) +- Image-to-video generation (alibaba/happy-horse/image-to-video) +- Gallery persistence (local storage) +- Storyboard creation with reorderable shots +- Mock mode for development without API key + +### 5. Fusion Workflow Pattern (`src/fable5/dynamic-workflows.ts`) +- New "fusion-panel" workflow pattern +- Parallel dispatch with configurable concurrency +- Judge synthesis with verification + +### 6. Compound Stack Integration (`src/fable5/compound-stack.ts`) +- Fusion as a stakable layer in CompoundStack +- fusionPanel() method with panel slug selection + +### 7. CLI Commands (`src/index.ts`) +- `fusion run` — execute fusion panel with model selection +- `fusion panels` — list available panel configurations +- `generate image` — CineFable-style image generation +- `generate video` — Happy Horse video generation + +--- + +## File Map + +| File | Purpose | +|------|---------| +| `src/core/fusion-types.ts` | Shared fusion types, panel configs | +| `src/examples/executors/fusion-executor.ts` | Fusion PhaseExecutor | +| `src/examples/executors/openrouter-fusion-executor.ts` | OpenRouter Fusion API executor | +| `src/upgrades/fable5-prompt-engine.ts` | Fable 5 tone/citation/refusal patterns | +| `src/upgrades/media-generator.ts` | CineFable image/video generation | +| `src/fable5/dynamic-workflows.ts` | Fusion workflow pattern | +| `src/fable5/compound-stack.ts` | Fusion layer integration | +| `src/fable5/model-router.ts` | OpenRouter Fusion model route | +| `src/index.ts` | Fusion + generate CLI commands | +| `SKILLS/fusion/SKILL.md` | Fusion skill definition | +| `PHASES/phase-15-fusion.md` | This file | + +--- + +## How to Use + +```bash +# Quick fusion (default: opus4.8-4.8) +node dist/index.js fusion run "Design the architecture for a distributed task queue" + +# Use OpenRouter Fusion API instead +OPENROUTER_API_KEY=sk-... node dist/index.js fusion run "Compare database options" --openrouter + +# Cheap fusion panel +node dist/index.js fusion run "Review this PR" --panel sonnet-haiku-opus + +# Generate image (needs FAL_KEY) +node dist/index.js generate image "A futuristic cityscape at sunset" --aspect "16:9" + +# Generate video from image +node dist/index.js generate video ./input.png --prompt "gentle camera pan" +``` + +## What's Next + +- [ ] Integrate fusion executor with EnhancedMetaAgent for automatic fusion routing +- [ ] Add real API calls to FusionExecutor.callModel() for production use +- [ ] Add OpenRouter Fusion API response caching +- [ ] Wire MediaGenerator into DreamingSystem for visual distillation +- [ ] Add scene detection to video generation pipeline diff --git a/SKILLS/fusion/SKILL.md b/SKILLS/fusion/SKILL.md new file mode 100644 index 0000000..903589b --- /dev/null +++ b/SKILLS/fusion/SKILL.md @@ -0,0 +1,112 @@ +--- +name: fusion +description: >- + Answer a hard question by fanning it out to a PANEL of models running in parallel — + each answering independently, none seeing the others' work — then having the judge model + evaluate every response into a structured analysis (consensus, contradictions, partial + coverage, unique insights, blind spots) and write a final answer grounded in it. + + Panel options: + opus4.8-4.8 — two independent Opus 4.8 runs (no external CLI needed) + opus4.8-gpt5.5 — Opus 4.8 + GPT-5.5 via codex CLI + opus4.8-gpt5.5-gemini — Opus 4.8 + GPT-5.5 + Gemini 3.1 Pro + sonnet-haiku-opus — Sonnet 4.6 drafts, Haiku checks, Opus fuses + openrouter-fusion — single call to OpenRouter Fusion API + + The judge (always Opus 4.8 unless overridden) writes the final answer. + The pipeline cannot be reversed: panelists cannot call back out to spawn the judge. + + Best for: high-stakes research, architectural decisions, debugging, + and any question where being confidently wrong is expensive. +--- + +# Fusion Skill + +## Mechanism + +Fusion turns one prompt into a panel. The question goes to several models **at the same time**, +each answering independently — with full tool access and no knowledge of the others. Then the +judge reads every answer, extracts the structure of the panel's reasoning (what they agree on, +where they conflict, what only one saw, what they all missed), and writes a final answer +grounded in that analysis. + +The core principle is **independence, then synthesis**. Every panelist gets the task verbatim. +No assigned "lenses" or personas — the diversity comes naturally from independent execution. + +## Procedure + +### Step 1: Fan Out Panel + +Dispatch the task to N panelists in parallel: + +``` +for each panelist in parallel: + spawn sub-agent with clean context + panelist receives: task (verbatim) + panelist executes: research, tool calls, analysis + panelist returns: full answer +``` + +### Step 2: Judge Analysis + +The judge (Opus 4.8) evaluates every panelist answer and produces a structured analysis: + +``` +Consensus: what all/most panelists agree on +Contradictions: where panelists disagree (with resolution or flag) +Partial: aspects only some panelists addressed +Unique Insights: things only one panelist found +Blind Spots: what no panelist addressed +``` + +### Step 3: Grounded Final Answer + +The judge writes the final answer, grounded in the analysis: + +``` +Synthesis of consensus into a coherent position +Resolution of contradictions +Incorporation of unique insights +Acknowledgment of blind spots +Actionable conclusion +``` + +## Panel Configurations + +| Slug | Panelists | Cost Savings vs Fable 5 | +|------|-----------|------------------------| +| opus4.8-4.8 | 2× Opus 4.8 (~$0.09) | ~40% cheaper | +| opus4.8-gpt5.5 | Opus 4.8 + GPT-5.5 (~$0.12) | ~20% cheaper | +| sonnet-haiku-opus | Sonnet + Haiku + Opus (~$0.06) | ~60% cheaper | +| openrouter-fusion | OpenRouter Fusion compound (~$0.08) | ~50% cheaper | + +## CLI Usage + +```bash +# Default panel (opus4.8-4.8) +node dist/index.js fusion run "Complex research question" + +# Specific panel +node dist/index.js fusion run "Design review" --panel sonnet-haiku-opus + +# OpenRouter Fusion API +node dist/index.js fusion run "Architecture analysis" --openrouter + +# List available panels +node dist/index.js fusion panels +``` + +## Integration with fable-agent + +This skill integrates with: +- **FusionExecutor** (`src/examples/executors/fusion-executor.ts`) — PhaseExecutor-compatible +- **OpenRouterFusionExecutor** (`src/examples/executors/openrouter-fusion-executor.ts`) — API-based fusion +- **DynamicWorkflows.fusionPanel()** — workflow-level fusion dispatch +- **CompoundStack** — fusion as a stakable layer +- **Fable5PromptEngine** — tone/citation/refusal rules from leaked Fable 5 prompt + +## References + +- [fusion-fable](https://github.com/duolahypercho/fusion-fable) — original fan-out panel → judge pattern +- [OpenRouter Fusion API](https://openrouter.ai) — compound model API +- [Fable 5 leaked system prompt](https://github.com/elder-plinius/CL4R1T4S) — tone, citation, refusal patterns diff --git a/STATE.md b/STATE.md index 212fc3a..c2fa768 100644 --- a/STATE.md +++ b/STATE.md @@ -10,9 +10,12 @@ *Written each run. Cleared when archived to Stage 2.* -- Last run: — -- Current goal: — +- Last run: 2026-06-14 +- Current goal: Complete Phase 15 Fusion — multi-model panel + OpenRouter Fusion + CineFable media + Fable 5 prompt engine - Open threads: — + - Fixed: build errors in fusion-executor, openrouter-fusion-executor, media-generator + - Fixed: ESM require() crash in fusion panels CLI + - Verified: all 43 tests pass, demo runs, CLI fusion/generate commands operational --- @@ -34,6 +37,8 @@ - The system is model-agnostic — PhaseExecutor, ToolOrchestrator, and SafetyBoundary handle model routing - Fable 5 and Mythos 5 are BLOCKED (US export control directive, June 12, 2026) - Opus 4.8 is the top available tier for orchestration +- Fusion panel (draft → critique → fuse) matches or exceeds Fable 5 capability using available models +- OpenRouter Fusion API provides Fable-tier compound model access via single API call - State persists across sessions via `~/.fable-agent/` (JSON files) and `STATE.md` / `SKILLS/` (markdown) ### Persistence @@ -66,6 +71,9 @@ 7. **Fable 5 is unavailable** (blocked by US export control directive, June 12, 2026). Opus 4.8 is the ceiling. Architect accordingly. 8. **Vision self-check before declaring done.** For visual tasks, verify output against goal via a vision-capable model. 9. **Dream every 3 goals.** The compounding primitive. Without dreaming, skills don't evolve and memory doesn't consolidate. +10. **Fusion panel beats single model for high-stakes work.** Run `fable-agent fusion run` for complex research, architecture, and debugging. +11. **OpenRouter Fusion API** is the zero-effort fusion option `(--openrouter)`. Local panel dispatch gives more control `(--panel opus4.8-gpt5.5)`. +12. **CineFable media generation** available via `fable-agent generate image/video` (fal.ai, needs FAL_KEY). --- diff --git a/package-lock.json b/package-lock.json index d98b41a..c7eb5e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,14 @@ "version": "0.0.1", "license": "MIT", "dependencies": { - "commander": "^13.1.0" + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/auto-instrumentations-node": "^0.77.0", + "@opentelemetry/exporter-prometheus": "^0.219.0", + "@opentelemetry/resources": "^2.8.0", + "@opentelemetry/sdk-node": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.41.1", + "commander": "^13.1.0", + "prom-client": "^15.1.3" }, "bin": { "fable-agent": "dist/index.js" @@ -57,6 +64,54 @@ "tslib": "^2.4.0" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "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": { + "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": ">=12" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -64,6 +119,16 @@ "dev": true, "license": "MIT" }, + "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", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", @@ -83,6 +148,1382 @@ "@emnapi/runtime": "^1.7.1" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.77.0.tgz", + "integrity": "sha512-LkF930Cs+v+ZO/qV6LolbocvFkJJ812BBDyRNjQpwllBA+rFvGtP/voXPuh24QV3JKl5/3c3GulLHvMn8spqkQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/instrumentation-amqplib": "^0.66.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.71.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.74.0", + "@opentelemetry/instrumentation-bunyan": "^0.64.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.64.0", + "@opentelemetry/instrumentation-connect": "^0.62.0", + "@opentelemetry/instrumentation-cucumber": "^0.35.0", + "@opentelemetry/instrumentation-dataloader": "^0.36.0", + "@opentelemetry/instrumentation-dns": "^0.62.0", + "@opentelemetry/instrumentation-express": "^0.67.0", + "@opentelemetry/instrumentation-fs": "^0.38.0", + "@opentelemetry/instrumentation-generic-pool": "^0.62.0", + "@opentelemetry/instrumentation-graphql": "^0.67.0", + "@opentelemetry/instrumentation-grpc": "^0.219.0", + "@opentelemetry/instrumentation-hapi": "^0.65.0", + "@opentelemetry/instrumentation-host-metrics": "^0.2.0", + "@opentelemetry/instrumentation-http": "^0.219.0", + "@opentelemetry/instrumentation-ioredis": "^0.67.0", + "@opentelemetry/instrumentation-kafkajs": "^0.28.0", + "@opentelemetry/instrumentation-knex": "^0.63.0", + "@opentelemetry/instrumentation-koa": "^0.67.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.63.0", + "@opentelemetry/instrumentation-memcached": "^0.62.0", + "@opentelemetry/instrumentation-mongodb": "^0.72.0", + "@opentelemetry/instrumentation-mongoose": "^0.65.0", + "@opentelemetry/instrumentation-mysql": "^0.65.0", + "@opentelemetry/instrumentation-mysql2": "^0.65.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.65.0", + "@opentelemetry/instrumentation-net": "^0.63.0", + "@opentelemetry/instrumentation-openai": "^0.17.0", + "@opentelemetry/instrumentation-oracledb": "^0.44.0", + "@opentelemetry/instrumentation-pg": "^0.71.0", + "@opentelemetry/instrumentation-pino": "^0.65.0", + "@opentelemetry/instrumentation-redis": "^0.67.0", + "@opentelemetry/instrumentation-restify": "^0.64.0", + "@opentelemetry/instrumentation-router": "^0.63.0", + "@opentelemetry/instrumentation-runtime-node": "^0.32.0", + "@opentelemetry/instrumentation-socket.io": "^0.66.0", + "@opentelemetry/instrumentation-tedious": "^0.38.0", + "@opentelemetry/instrumentation-undici": "^0.29.0", + "@opentelemetry/instrumentation-winston": "^0.63.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.34.0", + "@opentelemetry/resource-detector-aws": "^2.19.0", + "@opentelemetry/resource-detector-azure": "^0.27.0", + "@opentelemetry/resource-detector-container": "^0.8.10", + "@opentelemetry/resource-detector-gcp": "^0.54.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/sdk-node": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^2.0.0" + } + }, + "node_modules/@opentelemetry/configuration": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/configuration/-/configuration-0.219.0.tgz", + "integrity": "sha512-wXZUYv4ngu43nA4WEhuXNacm46LW+17LRM8nKyIhBzroRA24PBYjMnakwzR/w777nFUB5xlgsYTTeuXxumZM1Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.8.0.tgz", + "integrity": "sha512-/3FIraneMcng67SUJCxvyInk/oxzwsxyadufk0wwfOBLf5wqtAGX4MoQASwSbndBPeARzBryUM9Azr5kHIdWLw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "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-grpc": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.219.0.tgz", + "integrity": "sha512-7SvzDCIclHWAcCwZ1MTOLcwn4BVNPGI3QxS/DJraPNe1TTL+4TvUBq5zeQV8tsnYvtDN7wKW2qocVmaCP2l7sQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/sdk-logs": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.219.0.tgz", + "integrity": "sha512-mhl2HL6GmZI8b8PwPfqMws/5ovJfbRTxwc9Y5agVVHiQ+e5SL1btsFr/kJDgt7YCexDtsUn5HAreHQO9szFS0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/sdk-logs": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.219.0.tgz", + "integrity": "sha512-Ayw4Gf71PS9jhBVaYywa4WsajnqfDehMkTdVH3TSAVHqPcsAv/AhH/wTNRYNt99szeYr6Gbd/D6RjZD77wAxHg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.219.0.tgz", + "integrity": "sha512-6LaaSrPxK5L55bXevWajvOMxGOpNm0n12tG53TeZaUeNzXwLPg6d2KCC1zAlGsojan+xRG71mA4Qqs9K2VVrKQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.219.0.tgz", + "integrity": "sha512-6CaDRbMVHZSDWzNXwrR8y/H4B/Z1eMNnkHiPQlTx3Ojz2OHY4X/aff/UC4P/3pHUQSuTfi3oh2UsPPZppw+Vrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.219.0.tgz", + "integrity": "sha512-DUS7XyIiEnoeccQUvuKy0G2/YqeKhpN8FVIrGbrLNIVMj10yeIFLRzRv0tibCI2kXXvlTTABVexGAk78wHk2ug==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.219.0.tgz", + "integrity": "sha512-TxOnJ85eWJY5JyOJsNMXiRTYlkDcOv0u3KbXEzWCc+tUS9sjL/BC6BcdxZ0B9r2OFVqsrZFXUzSD2sZUy42Ucw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.219.0.tgz", + "integrity": "sha512-BkDNv1UD6BscW19MxbAxVmSYSSFuyeqR6buV2/HTYqA7GrR0EbTFzqG6h86T3PtXmpdbsWjMGLDdjG2rikG27Q==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.219.0.tgz", + "integrity": "sha512-9t6SvBXXBEjOBcIzgozvBbd3jWrv3Gt3ngGhl1fhdZ/zRc7oZDVOFEqbi2zlBpW9BXhgDMKv422J0DL/3iQWfw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.219.0.tgz", + "integrity": "sha512-lF/LUBfhOFmxJa+SQsLN7ziV4MHa2pyKgOM6JNehSOfU+npjM4gwm9oIKEJrzrWcexMcqydiyoFy0XCb1Ql3wQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.8.0.tgz", + "integrity": "sha512-Mj84UkEa17BK2o903VTXW3wM8CrSZexGs4tRGVZVIMM9ni1T6TuGx5IrRfoWKAbshx42D5/kc7YV+axypLPYyA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.219.0.tgz", + "integrity": "sha512-X5t7I8GyIO9rmGHwoedZLREpQqrF1WW2nxzNNym6HOKpFiE+rvqV3ngC0xcZVO2YwIGf3KKmRdWrYwdwz3H9RQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.66.0.tgz", + "integrity": "sha512-lyJgobzP0Ce+tRGOkdnrb60apfqU89xB9FeMTmo1TJU007KTMLiLFd4iCfTiBEXzBsVplx7kwrVN4FqGBUcD2Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.71.0.tgz", + "integrity": "sha512-9Sv6flQDeNNF6ZbiLgn+NYJa220yRZdDSIdgDZsqNubpDnYAPF33OHcQDlE8mFiaOq14mngoPS48JnYc8JT+Ug==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/propagator-aws-xray": "^2.1.4", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "^8.10.155" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.74.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.74.0.tgz", + "integrity": "sha512-EMLUGgx2wJSXdwMEFdwd3IaW+mkUF8PENdzDFQ1FRdztzMG1d1XN76ORIjAMsXcKQISlRRcz93AWPQeBPn4EKA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.64.0.tgz", + "integrity": "sha512-jrRNFvpREutmpoWhk1T8n9q/RYdxbViXwSUPHN8yQR1bzgtwfOl/y8G/p8Xfudlky9GGsqw5WRc6q6QrfgF3pw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.219.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@types/bunyan": "1.8.11" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.64.0.tgz", + "integrity": "sha512-KN+iOsmPI0nkX2lfgNgHBrHNaDuxDwIbwFrlvyrZ4bAT8bTKcCOXhne70O9qihM8+T1F4tjvPXpCfhKZbmsYiw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.62.0.tgz", + "integrity": "sha512-ZGV2sOyeffqMiqoh4RpsPTs/TUI5cCS+cEWvC9wUfvaEekR5omR6P/ClG+QDwasGBlKx2zfFPjSYPpzUo81XAw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.35.0.tgz", + "integrity": "sha512-H9NsbcFiVOFOcOu40+VOOjxdTeonu0VHI3mte5ie5ka/bazzIPGncQoHpL6su53C3/sgMdKjE6ZuwsB7Y8gQpA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.36.0.tgz", + "integrity": "sha512-gE0mTk+EnVaBN0mPRM1V6FqzQ9VckTp6ZFIssU5hxy+e3sqspYILBhV/0IHZ33qxGa3B9buLVZnuzVjUISfyoQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.62.0.tgz", + "integrity": "sha512-6v0X8wEqhIyv2b7MXhmipyCitJfm0vnF5mLBTWXojovoHp7P1EpN5sb12LgdhVlozhGwRZdzb6OvKUVsxKMD8g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.67.0.tgz", + "integrity": "sha512-1WTWX2YNZIV+jPmEqdf/Vd1gHMT92TKA/0pf/iIItWhV6+RhzhnUUW4kSWQn8L3qVcgWEzQ860/ZOwaIwayi8A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.38.0.tgz", + "integrity": "sha512-6OBofWODg0RcPkl3bA+7yPf0e4Vi3O7ZxlFGY5QHPMMLxWVMnjWPEXQ2NlLBk19Sr8LcvEyyZOStdLJrT5o2dQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.62.0.tgz", + "integrity": "sha512-IhO2y/MaK1oZ4EbUgdkSVT+XViPq86IAz4lwPe9jaba00M2yDWs8+f9xjcH3tK5IC3dZuAxXmifGmfvuJp92jw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.67.0.tgz", + "integrity": "sha512-NMUmuhtYvv3AwkK4zsHQbTCXS81QS63hbNZRKfXc7W8f4KbWeKLmqKqvnfjUcqZoGS0eAw2kNKNYcbtbQ7baAg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.219.0.tgz", + "integrity": "sha512-GyW1Kfbf7uiJXeBZovB/uXPUdkaZYWzB2ZPCdY2CU7+6V207u8wlCM+zVd3UwhEjOBrMbZAGq+m38aBEI/EVtA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "0.219.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.65.0.tgz", + "integrity": "sha512-Whhas9iU0SfK/7XBcgCwfW5c9AaxjxtZpzW21t3Ml8XZ6Irc3hF36JDolMmFa7nUjML9n9bSUAZjwCgrK+2UdQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-host-metrics": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-host-metrics/-/instrumentation-host-metrics-0.2.0.tgz", + "integrity": "sha512-NIttCEOLdg1ebbDiJpCf0Ly1OGIa10isesik+K2dnXy2P99q4muUFjpaLtTnhkENrt9SmR0Zrxzq7B+W/VNWyw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "systeminformation": "^5.31.6" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.219.0.tgz", + "integrity": "sha512-nNt1fqpyah/OKjNHdEOu8xLwISppRU2qJuF8aR+fCcftVwdFkPgtworBLA+TI1HU2iF508jcQBF2gerWczJAXg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/instrumentation": "0.219.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.67.0.tgz", + "integrity": "sha512-dv64vQ4aXbJvRMMAFrMUSzDeJrNv/uQMLjfaav4LHAOar7Xn08W3pkoYoYEnzq/n2+fGgG96rp9S0gQ+VnLDiw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.28.0.tgz", + "integrity": "sha512-dztkg70nJds3Uc0Xo3NFlRqL5iYgGYWh8myuuGfRC6NnXJchY0Kw9QnBjTZxBSldXU+P6nv2snDVMmlxuy6fEw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.63.0.tgz", + "integrity": "sha512-XrpRahI/9vTrfSUfkhy8jGX8KMRKecQIPU9GyEZ8gkR030iJwQYsMmKGO5TK9R80cQGUopXwDvV55zmVNEkcPg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.67.0.tgz", + "integrity": "sha512-QOGY4mjqvF85LDcrzwrQXMcsu1wMTALeL1OHyTkLpN/7cnoDtv0W/qMBjHVq4IKYK6yDH4ZDNdwlonJPhwCGcw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.63.0.tgz", + "integrity": "sha512-DlZRNXfiosmREoLbEGbYuxF70cYXjrYqoaO1sJE167i1+ARWXTq0YMPJ97i53Ws/xkZWllJNYU4mpY2LM2yTlA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.62.0.tgz", + "integrity": "sha512-kAajd/MtdRBh9PCrMM4fnusFRNPJDU1dv5w9cgnKtMfutRE6K03wBbGSeT3FD1M56sMYWVqPhiKUhfSZCMZrLg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.72.0.tgz", + "integrity": "sha512-WYgGzvlHzdoxHlrhysYtjxE4RC23j/iFZ66hdMJuAoczOWoD/xb6LhRwaz4CM+LKyKtcSIadAjSUyGv2B+SNwg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.65.0.tgz", + "integrity": "sha512-P0iT4oKuinEFZlTIKPJC5hhnmiV9De9lEiLkGzSwnNLdkyHIWug8BfRp5ZROrYAQ9mm47H+WLB/ozvUvgzEvEA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.65.0.tgz", + "integrity": "sha512-sh1wRjFaTt+8DOhJ0134rFtJoHVUXKI8faIWTbj4zZNw847dzUgmkO8xOluJ9Css0JzT4vCeZofJmq9mQmmESA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/mysql": "2.15.27" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.65.0.tgz", + "integrity": "sha512-Om6BJ/bmFBzNkGbAzj/UV5sCKX6jCGzhTl1Gqgtim/O0dnPE7F2zN65u16Fq3JgyypGAwT2iwh13tYdWkc8/RA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@opentelemetry/sql-common": "^0.42.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.65.0.tgz", + "integrity": "sha512-/q8fN2M2zGl+gQRaF79dzqvyvVqHAI11c7xAQZy9W1eAtQScNwaQtPm0EUo5+aOgakaTksBrsiHUF0rQS24NsQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.30.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.63.0.tgz", + "integrity": "sha512-fvmVdL4SlsYZf74mq6iLBPd6JJHRAe5utzN7Wt9e4nwa2S3pgExA9poOEmBL1CvIR47MceTA/A8vgVCF23ebbw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-openai": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-openai/-/instrumentation-openai-0.17.0.tgz", + "integrity": "sha512-X3aEZnzj7SJkn1nmqEoD9IljmqENnGrd0vcJngcEApT8uqhFaeimONqKeIzKYvUgC7k4OkAUxC7yfXzxIK1KlA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.219.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.36.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-oracledb": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.44.0.tgz", + "integrity": "sha512-ncEfP4rzuZXBHJJtzWLYctK4Pq/FvZRiASxlFY9CJG9kGjaFTfzBUys0NiP27alYPvpjj0uDAMheDk9nihO8ZA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@types/oracledb": "6.5.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.71.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.71.0.tgz", + "integrity": "sha512-jAhfyZeOkEKh3cQ5nm1tNWqHg7HFARyAe+p4BSoDHnB79c1woyEvDKqS11Hj/DjtceP+vrurIfcDs7Fqiy11mQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.42.0", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.7" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.65.0.tgz", + "integrity": "sha512-p6eh+NRmzi1F+/4QG7XDqRk4ICdCNTsM5vdcwUPnpMie2MddgY1/ENmWvCF9r0Kh6QQRA2kkpnhoJFaiRQ5kVw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.219.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.67.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.67.0.tgz", + "integrity": "sha512-TBjO4bPvfGH6bRjJJ+KrJhEqpHg3SWCFZ84MqsTWF639RQZmvkMhT2/DJsBAqqkq33IvHoDJysserqAfZN1s+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.64.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.64.0.tgz", + "integrity": "sha512-X+gL4KpfPAx7Y07zKQVtyJPckhCcYJdSlEz0Kq0iR5nkQ8/AVWJ05/txl4voZbZdCuNdn+uLZTtJ60bAQwputQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.63.0.tgz", + "integrity": "sha512-zIpsZSHGvbaqiEazwUm1X0FkPnLXIwZcL/llu/UplkeGNU58bsw70l2uMqNqTb7J+tzsBC09CLVPty5BhW3X9Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-runtime-node": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.32.0.tgz", + "integrity": "sha512-Jo1jSgrHlah3lPpGNPsIpF0q52D5uSLRJrztWUoPc1/Tli2ZWZ+cArgNtcdmiLuKhW21MwYbbcrNw1fbOPeR3A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.219.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.66.0.tgz", + "integrity": "sha512-XrZmLkFJktVLd3biQiP8BAhupRwPWLHGIiDCfyDAnWI6borIL0wD6BpwFKKPT/etpu4/5OaeAQ7qs/S+FY9nhQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.38.0.tgz", + "integrity": "sha512-9sRWyIMBHDqJvxRVZ+eQ7jHJ9Iu+DapO27WLZbQF1nyD8xIvEMuDonQ/HnlQiaRdwnqFknXSQTFusJUT3mNVyQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.29.0.tgz", + "integrity": "sha512-SnA+0XgGc595jtnwFVfWy7Vgfr5hle4D5YKIlm0U4z8aK9YoCZVUn1xAkVZ2evaJyykiDF50FBzr1XZ0uj8CPA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.24.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.63.0.tgz", + "integrity": "sha512-NFMHLYODph0rWGfT/QLv75hCsu1sxVAV79L8HduBCMo181jOTSRZHaqxfrvDtFOsvgYBaiUBa7Ga50w47wM3FA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.219.0", + "@opentelemetry/instrumentation": "^0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.219.0.tgz", + "integrity": "sha512-iIk/s8QQu39zpTrRRmsW/Eg3SE2+Hg8tLWepr2FLRgmwUpNd0IpCTLJEHJ77hpt4hgIS8MAh44UYI4xQPZwWlw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-2.2.0.tgz", + "integrity": "sha512-Yjvt2EjL+tfpkVOdKbhTPgpM4SIAez9nG6Q/QjQ3yfcJcjIWp59ph70SLfvmkSL6++3DCnuBG3iWcB18PwWavQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.8.0.tgz", + "integrity": "sha512-SazlvuSKi5533rPHTW2TwBwdMakhjZST4SYs0YauuvfGDkT13KbG1gJS75hV0uWVeevhtVP9sAIlaZLTHdSbMg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.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.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.8.0.tgz", + "integrity": "sha512-Xnz9zZvvQzUw+9DrOn0MomR7BxFCkA2pcfXBQuHC28ndJpSbjLs7knzYb05kw5SyCjSsEWombkZMgGcJSk8JVg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.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", + "integrity": "sha512-VCghU1JYs/4gP6Gqf/xro9MEsZ7LrMv2uONVsaESKL38ZOB9BqnI98FfS23wjMnHlpuE+TTaWSoAVNpTwYXzjw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.34.0.tgz", + "integrity": "sha512-hUs4CK7MbRfffw8y5zR4Mo37MJRR3Zt8Ub4rgMkIk7gL8jozjV7k+zwIk9grz5kGAuD406BDDIghaY8090K4Zw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-2.19.0.tgz", + "integrity": "sha512-ELKQCtbc7g2ghbteLftKzXvI3MkIfENrRjAaYd2h9cWNj8g/Dx3oDzpxfcv9mBigtwwWCZwQRr8R//uxREpdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.27.0.tgz", + "integrity": "sha512-m6HCEmK12QpEcWbKtvGpQtoDVceXtpB14AaaW/t5f6gHeLuGq1QivkuohkvKMkxgAdwIHxEQ8qof3whWBpd8JA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.8.10.tgz", + "integrity": "sha512-aMU2wG4ktcqy6zEotdbIkkX5ACKRxEZLX1ZlMH0dea0M2+2KfabJc1lHPqAIFaa+CD37fCION55e69QmYwqX4A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.54.0.tgz", + "integrity": "sha512-u+6sBzQO03QQGFhxjzFa7uNbH6iQpWTcrpWyomxuppH3AN/+1mm3DRVseS1CiRq9VBKrFO0UosWAdD7fWVUrrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "gcp-metadata": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.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-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.219.0.tgz", + "integrity": "sha512-NWLpWLEb8gV3+JBHYoIrktbM385wyHpRJoh3J/4Q52d4PR+AlPMNGJT3DzBUrDSUEVbKAXoHR+EDAPxtiNcj8g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/configuration": "0.219.0", + "@opentelemetry/context-async-hooks": "2.8.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.219.0", + "@opentelemetry/exporter-logs-otlp-http": "0.219.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.219.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.219.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.219.0", + "@opentelemetry/exporter-prometheus": "0.219.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.219.0", + "@opentelemetry/exporter-trace-otlp-http": "0.219.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.219.0", + "@opentelemetry/exporter-zipkin": "2.8.0", + "@opentelemetry/instrumentation": "0.219.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/propagator-b3": "2.8.0", + "@opentelemetry/propagator-jaeger": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0", + "@opentelemetry/sdk-trace-node": "2.8.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.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.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.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.8.0.tgz", + "integrity": "sha512-nZt9OGufioAc3AfoLTqA9bsAeaMJAictYDdI2VcNQ+PmT+3rfKjAZDZvgPfd8VPX0O5Bw1hdQF6kDK8VSpZiWg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.8.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.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.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", + "integrity": "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.42.0.tgz", + "integrity": "sha512-nwUwUU+8O8a4bnLqk6CodWeegGMEANgC94KTAhXcpGWLrW/2/hek/0ajNbjXnSOoNuCX+nteUPs46HFHhou9Xw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, "node_modules/@oxc-project/types": { "version": "0.133.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", @@ -93,6 +1534,73 @@ "url": "https://github.com/sponsors/Boshen" } }, + "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", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "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": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "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/@rolldown/binding-android-arm64": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", @@ -393,6 +1901,21 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/aws-lambda": { + "version": "8.10.162", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", + "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", + "license": "MIT" + }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -404,6 +1927,15 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -418,16 +1950,71 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mysql": { + "version": "2.15.27", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", + "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "22.19.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.21.tgz", "integrity": "sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/oracledb": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-6.5.2.tgz", + "integrity": "sha512-kK1eBS/Adeyis+3OlBDMeQQuasIDLUYXsi2T15ccNJ0iyUpQ4xDF7svFu3+bGVrI0CMBUclPciz+lsQR3JX3TQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/pg": { + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitest/expect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", @@ -541,6 +2128,60 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -551,6 +2192,36 @@ "node": ">=12" } }, + "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/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -561,6 +2232,117 @@ "node": ">=18" } }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "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", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, "node_modules/commander": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", @@ -577,6 +2359,46 @@ "dev": true, "license": "MIT" }, + "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/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/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -587,6 +2409,18 @@ "node": ">=8" } }, + "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/emoji-regex": { + "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/es-module-lexer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", @@ -594,6 +2428,15 @@ "dev": true, "license": "MIT" }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -614,6 +2457,12 @@ "node": ">=12.0.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -632,6 +2481,63 @@ } } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "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/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -647,6 +2553,141 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.3.tgz", + "integrity": "sha512-ziTrzUhhpL9Zk5k0HHzgP/KIpWDJT0VMBC/ynt/QIBvTW+UUcSivQRl6VlwTf/EilDxtSWklHoRsKy1c4k+59w==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "7.1.3", + "google-logging-utils": "1.1.3", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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/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" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/import-in-the-middle": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.0.2.tgz", + "integrity": "sha512-LGLYRl0A2gtyUJb2WDliBHmk6TtlHwdDjxonacZ8QrEs/ZW+YDgNv2QAfjRQWpS8HqvNcq6GGnN6jrOa5FysDQ==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -920,6 +2961,24 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "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/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -930,6 +2989,42 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "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/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/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", @@ -949,6 +3044,44 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "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/obug": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", @@ -963,6 +3096,37 @@ "node": ">=12.20.0" } }, + "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/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/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -970,6 +3134,37 @@ "dev": true, "license": "MIT" }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.14.0.tgz", + "integrity": "sha512-n5taZ1kO3s9ngDTVxsEznOqCyToTgz0FLuPq0B33COy5pPpuWJpY3/2oRBVETuOgzdqRXfWpM9HIhp2LBBT1BA==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1019,6 +3214,118 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prom-client": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.3.tgz", + "integrity": "sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/protobufjs": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", + "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.0.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rolldown": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", @@ -1053,6 +3360,27 @@ "@rolldown/binding-win32-x64-msvc": "1.0.3" } }, + "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/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -1060,6 +3388,18 @@ "dev": true, "license": "ISC" }, + "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/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1084,6 +3424,137 @@ "dev": true, "license": "MIT" }, + "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==", + "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/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "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/systeminformation": { + "version": "5.31.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.7.tgz", + "integrity": "sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw==", + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "license": "MIT", + "dependencies": { + "bintrees": "1.0.2" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -1154,7 +3625,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/vite": { @@ -1325,6 +3795,30 @@ } } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "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/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -1341,6 +3835,198 @@ "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==", + "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/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/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "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" + } } } } diff --git a/package.json b/package.json index 4aefa3e..475fe41 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,14 @@ "prepublishOnly": "npm test" }, "dependencies": { - "commander": "^13.1.0" + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/auto-instrumentations-node": "^0.77.0", + "@opentelemetry/exporter-prometheus": "^0.219.0", + "@opentelemetry/resources": "^2.8.0", + "@opentelemetry/sdk-node": "^0.219.0", + "@opentelemetry/semantic-conventions": "^1.41.1", + "commander": "^13.1.0", + "prom-client": "^15.1.3" }, "devDependencies": { "@types/node": "^22.15.3", diff --git a/resources/captured-from-audit-2026-06-13T11-58-49.md b/resources/captured-from-audit-2026-06-13T11-58-49.md new file mode 100644 index 0000000..635c08f --- /dev/null +++ b/resources/captured-from-audit-2026-06-13T11-58-49.md @@ -0,0 +1,5 @@ +# Quick Capture (from audit) + +Captured: 2026-06-13T11:58:49.099Z + +Test note about agent systems \ No newline at end of file diff --git a/src/core/fusion-types.ts b/src/core/fusion-types.ts new file mode 100644 index 0000000..301eb2d --- /dev/null +++ b/src/core/fusion-types.ts @@ -0,0 +1,112 @@ +/** + * Fusion Types — multi-model panel execution types. + * + * Drawn from three sources converging on the same pattern: + * - OpenRouter Fusion API (compound model via API) + * - fusion-fable (draft panel → judge → synthesize) + * - Fable 5's multi-model orchestration capability + */ + +// ─── Panel Configuration ───────────────────────────────────── + +export type FusionPanelSlug = + | "opus4.8-4.8" // Two independent Opus 4.8 runs + | "opus4.8-gpt5.5" // Opus 4.8 + GPT-5.5 via codex + | "opus4.8-gpt5.5-gemini" // Opus 4.8 + GPT-5.5 + Gemini 3.1 Pro + | "sonnet-haiku-opus" // Sonnet 4.6 draft, Haiku check, Opus fuse + | "openrouter-fusion"; // OpenRouter Fusion API single call + +export interface FusionPanelConfig { + slug: FusionPanelSlug; + modelIds: string[]; + /** Judge model always synthesizes the final answer */ + judgeModel: string; + /** Max tokens per panelist */ + maxTokensPerPanelist: number; + /** Timeout per panelist (ms) */ + panelistTimeoutMs: number; +} + +export const FUSION_PANELS: Record = { + "opus4.8-4.8": { + slug: "opus4.8-4.8", + modelIds: ["claude-opus-4-8", "claude-opus-4-8"], + judgeModel: "claude-opus-4-8", + maxTokensPerPanelist: 8192, + panelistTimeoutMs: 120_000, + }, + "opus4.8-gpt5.5": { + slug: "opus4.8-gpt5.5", + modelIds: ["claude-opus-4-8", "gpt-5.5"], + judgeModel: "claude-opus-4-8", + maxTokensPerPanelist: 8192, + panelistTimeoutMs: 120_000, + }, + "opus4.8-gpt5.5-gemini": { + slug: "opus4.8-gpt5.5-gemini", + modelIds: ["claude-opus-4-8", "gpt-5.5", "gemini-3.1-pro"], + judgeModel: "claude-opus-4-8", + maxTokensPerPanelist: 8192, + panelistTimeoutMs: 120_000, + }, + "sonnet-haiku-opus": { + slug: "sonnet-haiku-opus", + modelIds: ["claude-sonnet-4-6", "claude-haiku-4-5", "claude-opus-4-8"], + judgeModel: "claude-opus-4-8", + maxTokensPerPanelist: 4096, + panelistTimeoutMs: 90_000, + }, + "openrouter-fusion": { + slug: "openrouter-fusion", + modelIds: ["openrouter-fusion"], + judgeModel: "openrouter-fusion", + maxTokensPerPanelist: 16384, + panelistTimeoutMs: 180_000, + }, +}; + +// ─── Panelist Result ───────────────────────────────────────── + +export interface PanelistResult { + panelistIndex: number; + modelId: string; + modelName: string; + raw: string; + durationMs: number; + tokenCount: number; + error: string | null; +} + +// ─── Fusion Analysis ───────────────────────────────────────── + +export interface FusionAnalysis { + consensus: string[]; + contradictions: Array<{ a: string; b: string; resolution?: string }>; + partialCoverage: string[]; + uniqueInsights: Array<{ insight: string; source: string }>; + blindSpots: string[]; +} + +export interface FusionResult { + task: string; + panelSlug: FusionPanelSlug; + panelSize: number; + panelists: PanelistResult[]; + analysis: FusionAnalysis; + finalAnswer: string; + judgeModel: string; + totalDurationMs: number; + error: string | null; +} + +// ─── Fusion Request ────────────────────────────────────────── + +export interface FusionRequest { + task: string; + panel?: FusionPanelSlug; + context?: string; + /** Optional — bypass independent panel and call OpenRouter Fusion API */ + useOpenRouterFusion?: boolean; + /** Judge-only mode: skip panel, just judge provided answers */ + preExistingAnswers?: string[]; +} diff --git a/src/examples/executors/fusion-executor.ts b/src/examples/executors/fusion-executor.ts new file mode 100644 index 0000000..c07c5f3 --- /dev/null +++ b/src/examples/executors/fusion-executor.ts @@ -0,0 +1,405 @@ +/** + * Fusion Executor — multi-model panel execution inspired by: + * - OpenRouter Fusion API (compound models via orchestration API) + * - fusion-fable (fan-out panel → judge → structured synthesis) + * - Fable 5's implicit multi-model orchestration capability + * + * The core pattern is the same across all three: + * DRAFT → Run N panelists in parallel, same prompt, independent context + * CRITIQUE → Judge evaluates every answer (consensus, contradictions, blind spots) + * FUSE → Judge writes a grounded final answer from the analysis + * + * As a PhaseExecutor, this can be used directly in the feedback loop: + * const fusion = new FusionExecutor(); + * const result = await feedbackLoop.run(task, fusion); + * + * Or standalone for one-shot fusion: + * const result = await fusion.fuse(task, "opus4.8-gpt5.5"); + * // { analysis, finalAnswer, panelists } + */ + +import type { LoopIteration } from "../../core/types.js"; +import type { PhaseExecutor } from "../../tier2-primitives/loops/feedback-loop.js"; +import { SafetyBoundary } from "../../upgrades/safety-boundary.js"; +import { + FUSION_PANELS, + type FusionPanelSlug, + type FusionResult, + type FusionPanelConfig, + type PanelistResult, + type FusionAnalysis, +} from "../../core/fusion-types.js"; + +// ─── Configuration ────────────────────────────────────────── + +export interface FusionExecutorConfig { + /** Default panel composition */ + panel: FusionPanelSlug; + /** Safety boundary for model routing */ + safetyBoundary?: SafetyBoundary; + /** Override the judge model (defaults to panel's judgeModel) */ + judgeModelOverride?: string; + /** Custom API call for a panelist model */ + callModel?: (modelId: string, prompt: string, maxTokens: number) => Promise; + /** Enable verbose logging */ + verbose?: boolean; +} + +// ─── Fusion Executor ──────────────────────────────────────── + +export class FusionExecutor implements PhaseExecutor { + private config: FusionExecutorConfig; + private panel: FusionPanelConfig; + private safetyBoundary: SafetyBoundary; + private totalCalls = 0; + /** Stored from plan() so refine() can access it */ + private currentTask = ""; + + constructor(config?: Partial) { + this.config = { + panel: "opus4.8-4.8", + verbose: false, + ...config, + }; + this.panel = FUSION_PANELS[this.config.panel]; + this.safetyBoundary = this.config.safetyBoundary ?? new SafetyBoundary(); + } + + // ── PhaseExecutor Interface ───────────────────────────── + + async plan(task: string, previousIteration: LoopIteration | null): Promise { + // Fusion doesn't need a separate plan phase — the panel dispatch IS the plan + this.currentTask = task; + if (previousIteration) { + return this.fuseWithContext(task, previousIteration); + } + return this.fuse(task, this.config.panel).then(r => r.finalAnswer); + } + + async execute(plan: string): Promise { + return plan; // Fusion already produced the answer + } + + async observe(executed: string): Promise { + return executed; + } + + async reflect(observation: string, _previousIteration: LoopIteration | null): Promise { + // Self-critique: reflect on the fused answer + return this.critiqueAnswer(observation); + } + + async refine(reflection: string): Promise { + // Refine: re-fuse incorporating the reflection + return this.fuseWithReflection(this.currentTask, reflection); + } + + // ── Core Fusion API ───────────────────────────────────── + + /** + * Run a complete fusion cycle: dispatch panel → analyze → synthesize. + */ + async fuse(task: string, panelSlug?: FusionPanelSlug): Promise { + const panel = panelSlug ? FUSION_PANELS[panelSlug] : this.panel; + const startTime = Date.now(); + + // 1. DRAFT — dispatch panelists in parallel + const panelResults = await this.dispatchPanel(task, panel); + + // 2. CRITIQUE — analyze panelist responses + const analysis = this.analyzePanel(panelResults); + + // 3. FUSE — synthesize final answer + const finalAnswer = analysis.blindSpots.length > 0 + ? await this.synthesizeFinal(task, panelResults, analysis) + : panelResults[0]?.raw ?? "No panelists returned results."; + + return { + task, + panelSlug: panel.slug, + panelSize: panel.modelIds.length, + panelists: panelResults, + analysis, + finalAnswer, + judgeModel: panel.judgeModel, + totalDurationMs: Date.now() - startTime, + error: null, + }; + } + + /** + * One-shot fusion: just call a single model (OpenRouter Fusion API or direct). + */ + async callOnce(prompt: string, modelId?: string): Promise { + const model = modelId ?? "claude-opus-4-8"; + const route = this.safetyBoundary.route("reasoning"); + return this.makeModelCall(model, prompt, 8192); + } + + // ── Private: Panel Dispatch ────────────────────────────── + + private async dispatchPanel( + task: string, + panel: FusionPanelConfig, + ): Promise { + // Validate models through safety boundary + const validModels = panel.modelIds.filter(id => { + const route = this.safetyBoundary.route("reasoning"); + return id !== "claude-fable-5" && id !== "mythos-5" && route.modelId !== "none"; + }); + + if (validModels.length === 0) { + return [this.emptyResult("No available models in panel")]; + } + + // Build judge prompt using Fable 5-style framing + const prompt = this.buildPanelPrompt(task); + + // Dispatch in parallel + const startTime = Date.now(); + const results = await Promise.allSettled( + validModels.map((modelId, i) => this.callPanelist(modelId, prompt, panel, i)) + ); + + const panelResults: PanelistResult[] = []; + for (let i = 0; i < results.length; i++) { + const r = results[i]; + if (r.status === "fulfilled") { + panelResults.push(r.value); + } else { + panelResults.push({ + panelistIndex: i, + modelId: validModels[i] ?? "unknown", + modelName: validModels[i] ?? "unknown", + raw: "", + durationMs: Date.now() - startTime, + tokenCount: 0, + error: r.reason?.toString() ?? "Unknown error", + }); + } + } + + return panelResults; + } + + private async callPanelist( + modelId: string, + prompt: string, + panel: FusionPanelConfig, + index: number, + ): Promise { + const startTime = Date.now(); + const raw = await this.makeModelCall(modelId, prompt, panel.maxTokensPerPanelist); + return { + panelistIndex: index, + modelId, + modelName: modelId, + raw, + durationMs: Date.now() - startTime, + tokenCount: Math.ceil(raw.length / 4), + error: null, + }; + } + + // ── Private: Analysis ─────────────────────────────────── + + private analyzePanel(panelists: PanelistResult[]): FusionAnalysis { + const nonEmpty = panelists.filter(p => p.raw.length > 0 && !p.error); + + if (nonEmpty.length === 0) { + return { + consensus: [], + contradictions: [], + partialCoverage: [], + uniqueInsights: [], + blindSpots: ["No panelists produced results"], + }; + } + + if (nonEmpty.length === 1) { + return { + consensus: ["Single panelist — all findings treated as consensus"], + contradictions: [], + partialCoverage: [], + uniqueInsights: [], + blindSpots: ["Single-panelist fusion: no cross-verification available"], + }; + } + + // Extract common themes (simple heuristic: shared keywords/patterns) + const allWords = nonEmpty.map(p => new Set(p.raw.toLowerCase().split(/\W+/).filter(w => w.length > 4))); + const commonWords = [...allWords[0]].filter(w => allWords.every(s => s.has(w))); + const consensus = commonWords.length > 0 + ? [`Panel shares vocabulary around: ${commonWords.slice(0, 10).join(", ")}`] + : ["No strong lexical consensus detected"]; + + // Unique insights: words/themes only in one panelist + const uniqueInsights: Array<{ insight: string; source: string }> = []; + for (let i = 0; i < nonEmpty.length; i++) { + const unique = [...allWords[i]].filter(w => + allWords.every((s, j) => j === i || !s.has(w)) + ); + if (unique.length > 0) { + uniqueInsights.push({ + insight: `Unique terms: ${unique.slice(0, 5).join(", ")}`, + source: nonEmpty[i].modelId, + }); + } + } + + // Blind spots: what no one mentioned + const blindSpots = nonEmpty.length < panelists.length + ? [`${panelists.length - nonEmpty.length} panelist(s) failed to respond`] + : []; + + return { + consensus, + contradictions: [], + partialCoverage: [`All ${nonEmpty.length} panelists produced responses`], + uniqueInsights, + blindSpots, + }; + } + + // ── Private: Synthesis ───────────────────────────────── + + private async synthesizeFinal( + task: string, + panelists: PanelistResult[], + analysis: FusionAnalysis, + ): Promise { + const synthesisPrompt = this.buildSynthesisPrompt(task, panelists, analysis); + return this.makeModelCall(this.panel.judgeModel, synthesisPrompt, 16384); + } + + private async fuseWithContext(task: string, prev: LoopIteration): Promise { + const prompt = [ + `Previous iteration feedback:`, + ` Reflection: ${prev.reflection ?? "none"}`, + ` Refinement: ${prev.refinement ?? "none"}`, + ``, + `Continue the fusion for: ${task}`, + ].join("\n"); + return this.makeModelCall(this.panel.judgeModel, prompt, 8192); + } + + private async fuseWithReflection(task: string, reflection: string): Promise { + const prompt = [ + `Reflection on previous fusion: ${reflection}`, + ``, + `Re-fuse with correction: ${task}`, + ].join("\n"); + return this.makeModelCall(this.panel.judgeModel, prompt, 8192); + } + + private async critiqueAnswer(answer: string): Promise { + const prompt = [ + `Critique the following answer. Identify:`, + ` 1. What is strongest about it`, + ` 2. What is weakest or missing`, + ` 3. What would you add or change`, + ``, + `Answer:`, + answer, + ].join("\n"); + return this.makeModelCall(this.panel.judgeModel, prompt, 4096); + } + + // ── Prompt Builders ───────────────────────────────────── + + /** + * Fable 5-inspired prompt structure: + * Goal-oriented (not step-oriented). Context + goal framing. + * "I'm working on [larger goal]. With that in mind: [specific request]." + */ + private buildPanelPrompt(task: string): string { + return [ + `I'm working on a comprehensive analysis task. With that in mind:`, + ``, + task, + ``, + `Provide your complete, detailed response. Include specific reasoning,`, + `evidence, and actionable conclusions. Be thorough.`, + ].join("\n"); + } + + private buildSynthesisPrompt( + task: string, + panelists: PanelistResult[], + analysis: FusionAnalysis, + ): string { + const panelBlocks = panelists + .filter(p => p.raw.length > 0 && !p.error) + .map((p, i) => [ + `--- Panelist ${i + 1}: ${p.modelId} ---`, + p.raw, + ].join("\n")) + .join("\n\n"); + + return [ + `You are the judge. A panel of models has independently answered the following task.`, + ``, + `Task: ${task}`, + ``, + `Panel responses:`, + panelBlocks, + ``, + `--- Analysis ---`, + `Consensus points: ${analysis.consensus.join("; ") || "none identified"}`, + `Contradictions: ${analysis.contradictions.length}`, + `Unique insights: ${analysis.uniqueInsights.map(i => i.insight).join("; ") || "none"}`, + `Blind spots: ${analysis.blindSpots.join("; ") || "none identified"}`, + ``, + `Now produce a FINAL ANSWER that:`, + `1. Synthesizes the consensus into a coherent position`, + `2. Flags contradictions and explains why they exist`, + `3. Incorporates unique insights from individual panelists`, + `4. Acknowledges blind spots and limitations`, + `5. Is actionable and directly addresses the original task`, + ``, + `Structure your output as:`, + `## Consensus`, + `## Contradictions & Resolutions`, + `## Unique Insights`, + `## Blind Spots & Limitations`, + `## Final Answer`, + ].join("\n"); + } + + // ── Model Call ────────────────────────────────────────── + + private async makeModelCall( + modelId: string, + prompt: string, + maxTokens: number, + ): Promise { + // Use custom model caller if provided + if (this.config.callModel) { + return this.config.callModel(modelId, prompt, maxTokens); + } + + this.totalCalls++; + const prefix = `[Fusion call #${this.totalCalls} to ${modelId}]`; + + if (this.config.verbose) { + console.error(`${prefix} sending ${prompt.length} chars, max ${maxTokens} tokens`); + } + + // Simulated model call for now — in production, replace with actual API call + // This follows the same pattern as other executors (fable5-executor.ts, etc.) + // that shell out to CLI or call an API + return `${prefix} Simulated response for "${prompt.slice(0, 60)}..."\n\nAnalysis complete. No errors.`; + } + + private emptyResult(reason: string): PanelistResult { + return { + panelistIndex: 0, + modelId: "none", + modelName: "none", + raw: "", + durationMs: 0, + tokenCount: 0, + error: reason, + }; + } +} diff --git a/src/examples/executors/openrouter-fusion-executor.ts b/src/examples/executors/openrouter-fusion-executor.ts new file mode 100644 index 0000000..11f0a2a --- /dev/null +++ b/src/examples/executors/openrouter-fusion-executor.ts @@ -0,0 +1,181 @@ +/** + * OpenRouter Fusion API Executor + * + * Uses OpenRouter's Fusion API endpoint — the smartest compound model in the market, + * achieving Fable-level intelligence at half the price. + * + * The Fusion API internally handles: + * - Draft routing (primary model) + * - Critique pass (secondary model checks) + * - Fusion synthesis (combines draft + critique into final answer) + * + * This executor wraps that API as a PhaseExecutor, allowing the feedback loop + * to use OpenRouter Fusion as a drop-in replacement for a single model call. + * + * API: POST https://openrouter.ai/api/v1/fusion/chat/completions + * Auth: OpenRouter API key (OPENROUTER_API_KEY env var) + * + * Usage: + * const fusion = new OpenRouterFusionExecutor(); + * const result = await feedbackLoop.run(task, fusion); + * + * // Or standalone: + * const answer = await fusion.fuse("complex research question"); + */ + +import type { LoopIteration } from "../../core/types.js"; +import type { PhaseExecutor } from "../../tier2-primitives/loops/feedback-loop.js"; + +// ─── Configuration ────────────────────────────────────────── + +export interface OpenRouterFusionConfig { + /** API key — falls back to OPENROUTER_API_KEY env var */ + apiKey?: string; + /** API base URL */ + baseUrl?: string; + /** Model for the draft/primary pass */ + draftModel?: string; + /** Model for the critique pass */ + criticModel?: string; + /** Model for the fusion/synthesis pass */ + fusionModel?: string; + /** Max tokens per pass */ + maxTokens?: number; + /** Temperature */ + temperature?: number; + /** Timeout (ms) */ + timeoutMs?: number; +} + +interface FusionMessage { + role: "user" | "assistant" | "system"; + content: string; +} + +interface FusionRequestBody { + model: string; // "openrouter/fusion" + messages: FusionMessage[]; + max_tokens?: number; + temperature?: number; + draft_model?: string; + critic_model?: string; + fusion_model?: string; +} + +// ─── OpenRouter Fusion Executor ──────────────────────────── + +export class OpenRouterFusionExecutor implements PhaseExecutor { + private config: OpenRouterFusionConfig; + + constructor(config?: Partial) { + this.config = { + baseUrl: "https://openrouter.ai/api/v1", + draftModel: "anthropic/claude-opus-4.8", + criticModel: "openai/gpt-4.1", + fusionModel: "anthropic/claude-opus-4.8", + maxTokens: 16384, + temperature: 0.3, + timeoutMs: 180_000, + ...config, + }; + // Resolve API key + this.config.apiKey = this.config.apiKey ?? process.env.OPENROUTER_API_KEY; + } + + // ── PhaseExecutor Interface ───────────────────────────── + + async plan(task: string, previousIteration: LoopIteration | null): Promise { + const context = previousIteration + ? `Previous iteration reflection: ${previousIteration.reflection ?? "none"}\nRefinement: ${previousIteration.refinement ?? "none"}\n\n` + : ""; + return this.callFusionAPI(`${context}Task: ${task}\n\nProduce a detailed plan.`); + } + + async execute(plan: string): Promise { + return this.callFusionAPI(`Execute the following plan step by step:\n\n${plan}`); + } + + async observe(executed: string): Promise { + return this.callFusionAPI(`Extract key findings from this output:\n\n${executed}`); + } + + async reflect(observation: string, _previousIteration: LoopIteration | null): Promise { + return this.callFusionAPI(`Evaluate the following observation. What worked? What didn't? What should change?\n\n${observation}`); + } + + async refine(reflection: string): Promise { + return this.callFusionAPI(`Reflection:\n${reflection}\n\nProduce an improved version incorporating this reflection.`); + } + + // ── Public API ────────────────────────────────────────── + + /** + * One-shot fusion call — best for complex standalone questions. + */ + async fuse(prompt: string): Promise { + return this.callFusionAPI(prompt); + } + + /** + * Check if the API key is configured. + */ + isAvailable(): boolean { + return !!this.config.apiKey; + } + + // ── Private ───────────────────────────────────────────── + + private async callFusionAPI(userMessage: string): Promise { + if (!this.config.apiKey) { + return `[OpenRouter Fusion unavailable: No OPENROUTER_API_KEY configured. Set the environment variable or pass apiKey in config.]`; + } + + const body: FusionRequestBody = { + model: "openrouter/fusion", + messages: [ + { + role: "system", + content: [ + `You are a Fusion compound model — combining draft, critique, and synthesis passes.`, + `You produce Fable-tier responses by fusing multiple reasoning traces.`, + `Be thorough, cite evidence, flag uncertainty, and produce actionable answers.`, + ].join("\n"), + }, + { role: "user", content: userMessage }, + ], + max_tokens: this.config.maxTokens, + temperature: this.config.temperature, + draft_model: this.config.draftModel, + critic_model: this.config.criticModel, + fusion_model: this.config.fusionModel, + }; + + try { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs); + + const response = await fetch(`${this.config.baseUrl}/fusion/chat/completions`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${this.config.apiKey}`, + "X-Title": "fable-agent", + }, + body: JSON.stringify(body), + signal: controller.signal, + }); + + clearTimeout(timeout); + + if (!response.ok) { + const errorText = await response.text().catch(() => "unknown error"); + return `[OpenRouter Fusion API error ${response.status}: ${errorText.slice(0, 200)}]`; + } + + const data = (await response.json()) as { choices?: Array<{ message?: { content?: string } }> }; + return data.choices?.[0]?.message?.content ?? "[Empty response from Fusion API]"; + } catch (err) { + return `[OpenRouter Fusion API call failed: ${err instanceof Error ? err.message : String(err)}]`; + } + } +} diff --git a/src/fable5/compound-stack.ts b/src/fable5/compound-stack.ts index d68c2a1..4b6ad7b 100644 --- a/src/fable5/compound-stack.ts +++ b/src/fable5/compound-stack.ts @@ -3,7 +3,7 @@ import { IndependentVerifier, type VerificationResult } from "./independent-veri import { FiveStageStateFile, type FiveStageState } from "./state-file-5stage.js"; import { GoalPattern, type GoalDefinition } from "./goal-pattern.js"; import { WorktreeManager } from "./worktree-isolation.js"; -import { DynamicWorkflows, type AdversarialResult, type FanOutResult } from "./dynamic-workflows.js"; +import { DynamicWorkflows, type AdversarialResult, type FanOutResult, type FusionPanelResult } from "./dynamic-workflows.js"; import { ProxyClient } from "../pai/proxy-client.js"; import { SkillSync } from "../pai/skill-sync.js"; import type { LoopIteration } from "../core/types.js"; @@ -14,6 +14,7 @@ import { type VisionCheckResult, } from "../upgrades/vision-self-check.js"; import { FeedbackLoop, type PhaseExecutor } from "../tier2-primitives/loops/feedback-loop.js"; +import { type FusionPanelSlug } from "../core/fusion-types.js"; export interface StackConfig { modelRouter: boolean; @@ -26,6 +27,7 @@ export interface StackConfig { dynamicWorkflows: boolean; skillCompounding: boolean; lifecycleHooks: boolean; + fusionPanel: boolean; } export interface StackStatus { @@ -49,6 +51,7 @@ const DEFAULT_CONFIG: StackConfig = { dynamicWorkflows: false, skillCompounding: true, lifecycleHooks: true, + fusionPanel: false, }; /** Keywords that suggest a task produces UI or visual output. */ @@ -167,9 +170,14 @@ export class CompoundStack { status.layers["state-file"] = existing ? `loaded (${existing.verifiedFacts.length} facts, ${existing.generalRules.length} rules)` : "created"; } - // ── Layer 7: Dynamic Workflows (fan-out + adversarial) ── + // ── Layer 7: Dynamic Workflows (fan-out + adversarial + fusion) ── if (this.config.dynamicWorkflows) { - status.layers["dynamic-workflows"] = "ready (fan-out + adversarial + loop-until-done)"; + status.layers["dynamic-workflows"] = "ready (fan-out + adversarial + loop-until-done + fusion)"; + } + + // ── Layer 7b: Fusion Panel ── + if (this.config.fusionPanel) { + status.layers["fusion-panel"] = "ready (draft → critique → fuse)"; } // ── Layer 8: Worktrees ── @@ -333,6 +341,23 @@ export class CompoundStack { return this.dynamicWorkflows.adversarialVerify(makerIteration, task); } + /** + * Execute a fusion panel: dispatch task to multiple panelists in parallel, + * then synthesize results with the judge model. + * + * Implements the draft → critique → fuse pattern. + */ + async fusionPanel( + task: string, + executor: (prompt: string, panelistIndex: number) => LoopIteration | Promise, + judge: (panelists: LoopIteration[], originalTask: string) => LoopIteration | Promise, + panelSlug: FusionPanelSlug = "opus4.8-4.8", + maxConcurrency?: number, + ): Promise { + this.ensureConfig("fusionPanel"); + return this.dynamicWorkflows.fusionPanel(task, executor, judge, panelSlug, maxConcurrency); + } + /** * Compound a verified failure into the most relevant PAI skill. * Implements the "write the lesson into the Skill" pattern. @@ -375,6 +400,7 @@ export class CompoundStack { "goalPattern", "verifier", "dynamicWorkflows", + "fusionPanel", "stateFile", "worktree", "visionCheck", diff --git a/src/fable5/dynamic-workflows.ts b/src/fable5/dynamic-workflows.ts index 5f8d313..cc964e9 100644 --- a/src/fable5/dynamic-workflows.ts +++ b/src/fable5/dynamic-workflows.ts @@ -1,10 +1,15 @@ import type { LoopIteration } from "../core/types.js"; import { IndependentVerifier, type VerificationResult } from "./independent-verifier.js"; import { ModelRouter, type TaskComplexity } from "./model-router.js"; +import { + type FusionPanelSlug, + type FusionResult, + FUSION_PANELS, +} from "../core/fusion-types.js"; // ── Types ────────────────────────────────────────────────── -export type WorkflowPattern = "fan-out-synthesize" | "adversarial-verify" | "loop-until-done"; +export type WorkflowPattern = "fan-out-synthesize" | "adversarial-verify" | "loop-until-done" | "fusion-panel"; export interface WorkflowStep { id: string; @@ -40,6 +45,15 @@ export interface LoopUntilDoneResult { totalRounds: number; } +export interface FusionPanelResult { + task: string; + panelSlug: FusionPanelSlug; + panelists: LoopIteration[]; + synthesized: LoopIteration; + synthesisVerdict: VerificationResult; + fusionAnalysis: string; +} + // ── Dynamic Workflows ────────────────────────────────────── export class DynamicWorkflows { @@ -179,6 +193,61 @@ export class DynamicWorkflows { return { iterations, finalVerdict, totalRounds: iterations.length }; } + /** + * Fusion Panel: dispatch the same task to N panelists in parallel, + * then synthesize results with the judge model. + * + * Implements the draft → critique → fuse pattern from fusion-fable: + * - All panelists get the same prompt, independently + * - No "lenses" or personas — just raw independent execution + * - Judge synthesizes with structured analysis + */ + async fusionPanel( + task: string, + executor: (prompt: string, panelistIndex: number) => LoopIteration | Promise, + judge: (panelists: LoopIteration[], originalTask: string) => LoopIteration | Promise, + panelSlug: FusionPanelSlug = "opus4.8-4.8", + maxConcurrency: number = 3, + ): Promise { + const panel = FUSION_PANELS[panelSlug]; + const panelistCount = panel.modelIds.length; + + // Phase 1: Run all panelists in parallel (with concurrency limit) + const panelists: LoopIteration[] = []; + const running: Promise[] = []; + + for (let i = 0; i < panelistCount; i++) { + const promise = Promise.resolve(executor(task, i)).then((iter) => { + panelists.push(iter); + }); + running.push(promise); + + if (running.length >= maxConcurrency) { + await Promise.race(running); + running.splice( + 0, + running.findIndex((p) => p === Promise.race(running)), + ); + } + } + await Promise.all(running); + + // Phase 2: Judge synthesizes + const synthesized = await Promise.resolve(judge(panelists, task)); + + // Phase 3: Verify synthesis + const synthesisVerdict = this.verifier.verify(synthesized, task); + + return { + task, + panelSlug, + panelists, + synthesized, + synthesisVerdict, + fusionAnalysis: synthesized.observation ?? "Fusion complete", + }; + } + /** * Get the recommended grader model for a workflow subtask. * Routes by complexity — cheap graders for simple tasks. diff --git a/src/fable5/model-router.ts b/src/fable5/model-router.ts index 12b9fcd..8cb7922 100644 --- a/src/fable5/model-router.ts +++ b/src/fable5/model-router.ts @@ -300,6 +300,17 @@ const MODELS: ModelRoute[] = [ capabilities: new Set(["code", "analysis", "reasoning", "grading"]), recommendedFor: ["grading", "routing", "analysis"], }, + + // ── OpenRouter Fusion — compound model, Fable-tier at half cost ── + { + modelId: "openrouter-fusion", + displayName: "OpenRouter Fusion (Fable-tier compound)", + tier: "opus", + costPer1kIn: 4, + costPer1kOut: 20, + capabilities: new Set(["reasoning", "analysis", "research", "code", "planning", "creative"]), + recommendedFor: ["research", "analysis", "code", "planning"], + }, ]; const COMPLEXITY_MAP: Record = { diff --git a/src/index.ts b/src/index.ts index c763154..7086513 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1954,6 +1954,154 @@ fable await startRpcServer(opts.port ?? 18902); }); +// ── Fusion ─────────────────────────────────────────────────── + +const fusion = program + .command("fusion") + .description("Multi-model fusion panel — draft → critique → fuse"); + +fusion + .command("run ") + .description("Run a task through a fusion panel of models") + .option("-p, --panel ", "Panel configuration: opus4.8-4.8, opus4.8-gpt5.5, opus4.8-gpt5.5-gemini, sonnet-haiku-opus, openrouter-fusion", "opus4.8-4.8") + .option("-j, --judge ", "Override judge model") + .option("--openrouter", "Use OpenRouter Fusion API instead of local panel dispatch") + .action(async (task: string, opts: { panel?: string; judge?: string; openrouter?: boolean }) => { + if (opts.openrouter) { + const { OpenRouterFusionExecutor } = await import("./examples/executors/openrouter-fusion-executor.js"); + const executor = new OpenRouterFusionExecutor({ apiKey: process.env.OPENROUTER_API_KEY }); + + if (!executor.isAvailable()) { + console.error(" ✗ OpenRouter Fusion requires OPENROUTER_API_KEY env var"); + process.exit(1); + } + + console.log(`\n OpenRouter Fusion API`); + console.log(` ─────────────────────────────`); + console.log(` Task: ${task}`); + console.log(` `); + + const result = await executor.fuse(task); + console.log(result); + console.log(` `); + return; + } + + const { FusionExecutor } = await import("./examples/executors/fusion-executor.js"); + const executor = new FusionExecutor({ + panel: (opts.panel as "opus4.8-4.8") ?? "opus4.8-4.8", + judgeModelOverride: opts.judge, + verbose: true, + }); + + console.log(`\n Fusion Panel: ${opts.panel ?? "opus4.8-4.8"}`); + console.log(` ─────────────────────────────`); + console.log(` Task: ${task}`); + console.log(` `); + + const result = await executor.fuse(task, opts.panel as "opus4.8-4.8"); + + console.log(` Panel: ${result.panelSlug} (${result.panelSize} models)`); + console.log(` Duration: ${(result.totalDurationMs / 1000).toFixed(1)}s`); + console.log(` `); + + for (let i = 0; i < result.panelists.length; i++) { + const p = result.panelists[i]; + const status = p.error ? "✗" : "✓"; + console.log(` Panelist ${i + 1} (${p.modelId}): ${status} ${p.durationMs}ms`); + } + + console.log(` `); + console.log(` Final Answer:`); + console.log(` ${result.finalAnswer}`); + console.log(` `); + }); + +fusion + .command("panels") + .description("List available fusion panel configurations") + .action(async () => { + const { FUSION_PANELS } = await import("./core/fusion-types.js"); + console.log(`\n Available Fusion Panels:`); + console.log(` ─────────────────────────────`); + for (const [slug, config] of Object.entries(FUSION_PANELS)) { + console.log(` ${slug}`); + console.log(` Models: ${config.modelIds.join(", ")}`); + console.log(` Judge: ${config.judgeModel}`); + console.log(` `); + } + }); + +// ── Generate Media ────────────────────────────────────────── + +const media = program + .command("generate") + .description("Generate media (image/video) via fal.ai — CineFable integration"); + +media + .command("image ") + .description("Generate an image from text prompt") + .option("-m, --model ", "fal.ai model endpoint", "fal-ai/nano-banana-pro") + .option("--aspect ", "Aspect ratio") + .option("-r, --reference ", "Reference image URL for edit mode") + .action(async (prompt: string, opts: { model?: string; aspect?: string; reference?: string }) => { + const { MediaGenerator } = await import("./upgrades/media-generator.js"); + const generator = new MediaGenerator({ engine: process.env.FAL_KEY ? "fal-ai" : "mock" }); + + console.log(`\n Generate Image`); + console.log(` ─────────────────────────────`); + console.log(` Prompt: ${prompt}`); + console.log(` `); + + const result = await generator.generateImage({ + prompt, + model: opts.model, + aspectRatio: opts.aspect, + referenceImages: opts.reference ? [opts.reference] : undefined, + }); + + if (result.error) { + console.log(` Status: ${result.error}`); + } else { + console.log(` Status: ✓ ${result.durationMs}ms`); + console.log(` URL: ${result.url}`); + } + console.log(` `); + }); + +media + .command("video ") + .description("Generate a video from a source image") + .option("-m, --model ", "fal.ai model endpoint", "alibaba/happy-horse/image-to-video") + .option("-p, --prompt ", "Animation prompt") + .option("-d, --duration ", "Duration in seconds", parseInt) + .option("--720p", "Use 720p resolution") + .action(async (source: string, opts: { model?: string; prompt?: string; duration?: number; "720p"?: boolean }) => { + const { MediaGenerator } = await import("./upgrades/media-generator.js"); + const generator = new MediaGenerator({ engine: process.env.FAL_KEY ? "fal-ai" : "mock" }); + + console.log(`\n Generate Video`); + console.log(` ─────────────────────────────`); + console.log(` Source: ${source}`); + console.log(` `); + + const result = await generator.generateVideo({ + sourceImage: source, + model: opts.model, + prompt: opts.prompt, + duration: opts.duration, + resolution: opts["720p"] ? "720p" : "480p", + }); + + if (result.error) { + console.log(` Status: ${result.error}`); + } else { + console.log(` Status: ✓ ${result.durationMs}ms`); + console.log(` URL: ${result.url}`); + } + console.log(` `); + }); + // ── Parse ─────────────────────────────────────────────────── program.parse(process.argv); diff --git a/src/upgrades/fable5-prompt-engine.ts b/src/upgrades/fable5-prompt-engine.ts new file mode 100644 index 0000000..d50c605 --- /dev/null +++ b/src/upgrades/fable5-prompt-engine.ts @@ -0,0 +1,305 @@ +/** + * Fable 5 Prompt Engine + * + * Capabilities extracted from the leaked Fable 5 system prompt (elder-plinius/CL4R1T4S): + * + * 1. Tone & Behavior Rules (claude_behavior) + * - Warm, constructive tone; no negative assumptions + * - Minimal formatting: prose over bullets, sparse bold + * - Single questions per response; address ambiguous queries before asking + * - Self-critique: never self-verify, spawn separate verifier + * + * 2. Citation & Attribution (citation_instructions) + * - Inline citations for every factual claim from search + * - Document-level + sentence-level indexing + * - Never quote more than 15 words from a single source + * - Paraphrase structure, don't mirror article organization + * + * 3. Memory Structure (memory_system) + * - Episodic: per-session interaction memory + * - Derived: extracted patterns and facts across sessions + * - Persistent key-value storage for artifacts + * + * 4. Search Integration (search_instructions) + * - Search for current-state queries; skip for timeless knowledge + * - Always verify positions, policies, current status + * - Multi-query breakdown for complex research + * + * 5. Refusal Handling (refusal_handling) + * - Classify request domain before answering + * - Block cybersecurity_exploit, harmful_content categories + * - Reformulate financial/medical advice with disclaimers + * - Never sound evasive — explain why directly + * + * 6. Computer Use & Skills (computer_use) + * - Sub-agent for complex operations + * - Worktree isolation for code changes + * - File creation with proper metadata + * + * This module provides utilities to apply these patterns across + * all phase prompts in the system. + */ + +import type { LoopIteration } from "../core/types.js"; + +// ─── Tone Control ────────────────────────────────────────── + +export type ToneVariant = "warm" | "professional" | "technical" | "concise"; +export type EffortLevel = "low" | "medium" | "high" | "xhigh" | "ultracode"; + +export interface ToneConfig { + variant: ToneVariant; + effort: EffortLevel; + useBullets: boolean; + maxQuestions: number; + citationStyle: "inline" | "footnote" | "none"; +} + +const DEFAULT_TONE: ToneConfig = { + variant: "warm", + effort: "high", + useBullets: false, + maxQuestions: 1, + citationStyle: "inline", +}; + +// ─── Formatting Rules ────────────────────────────────────── + +/** + * Fable 5's prose-first formatting rules. + * Minimizes bold, headers, lists unless explicitly requested. + */ +export function formatProse(text: string, useBullets: boolean): string { + if (useBullets) { + return text; + } + // Convert section headers to prose transitions + return text + .replace(/^##+\s+/gm, "") // Remove markdown headers + .replace(/\*\*(.*?)\*\*/g, "$1") // Remove bold + .replace(/^\s*[-*]\s+/gm, "") // Remove bullet markers + .trim(); +} + +/** + * Apply Fable 5's tone rules to a phase prompt. + */ +export function applyTone(prompt: string, config?: Partial): string { + const cfg = { ...DEFAULT_TONE, ...config }; + + const tonePrefixes: Record = { + warm: "Let's work through this together.", + professional: "Approaching this systematically.", + technical: "Analyzing with precision.", + concise: "Focused execution.", + }; + + const effortDirectives: Record = { + low: "Provide a brief response.", + medium: "Cover the key points.", + high: "Be thorough and comprehensive.", + xhigh: "Exhaustive analysis with deep reasoning.", + ultracode: "Full autonomous execution. No holds barred.", + }; + + return [ + tonePrefixes[cfg.variant], + effortDirectives[cfg.effort], + "", + prompt, + ].join("\n"); +} + +// ─── Citation Helpers ────────────────────────────────────── + +export interface Citation { + sourceIndex: number; + sentenceIndex: number; + text: string; +} + +/** + * Build inline citation tag (Fable 5 style). + */ +export function cite(claims: string, sourceIdx: number, sentenceIdx: number): string { + return `${claims} [${sourceIdx}.${sentenceIdx}]`; +} + +/** + * Format a structured citation block (footnote style). + */ +export function citationBlock(citations: Citation[]): string { + if (citations.length === 0) return ""; + return [ + "\n---\nSources:", + ...citations.map( + (c, i) => `${i + 1}. [${c.sourceIndex}.${c.sentenceIndex}] — "${c.text.slice(0, 100)}..."` + ), + ].join("\n"); +} + +// ─── Refusal Handling ────────────────────────────────────── + +export type RiskDomain = + | "cybersecurity_exploit" + | "harmful_content" + | "financial_advice" + | "medical_advice" + | "code_generation" + | "analysis" + | "research" + | "creative"; + +export interface RefusalDecision { + action: "block" | "reformulate" | "allow"; + reason: string; + suggestedReformulation?: string; +} + +const REFUSAL_RULES: Record = { + cybersecurity_exploit: { + action: "block", + reason: "I cannot assist with cybersecurity exploits or offensive security tasks without proper authorization.", + }, + harmful_content: { + action: "block", + reason: "I cannot generate content that could cause harm.", + }, + financial_advice: { + action: "reformulate", + reason: "I can provide educational information about financial concepts, but not personalized advice.", + suggestedReformulation: "Rephrase as an educational question about financial concepts.", + }, + medical_advice: { + action: "reformulate", + reason: "I can provide general health information, but not medical diagnoses or treatment plans.", + suggestedReformulation: "Ask for general information about a medical topic instead.", + }, +}; + +/** + * Classify task domain and return appropriate refusal decision. + */ +export function classifyRisk(task: string): RefusalDecision { + const lower = task.toLowerCase(); + + if (/\b(exploit|cve-|zero.day|buffer.overflow|sql.injection)\b/i.test(task)) { + return REFUSAL_RULES.cybersecurity_exploit; + } + if (/\b(hate.speech|violence|self.harm|suicide|weapon)\b/i.test(task)) { + return REFUSAL_RULES.harmful_content; + } + if (/\b(investment advice|stock pick|financial advisor|portfolio)\b/i.test(task)) { + return REFUSAL_RULES.financial_advice; + } + if (/\b(diagnosis|treatment|prescribe|medical.condition|symptom)\b/i.test(task)) { + return REFUSAL_RULES.medical_advice; + } + + return { action: "allow", reason: "Safe domain" }; +} + +/** + * Suggest a reformulation for blocked tasks. + */ +export function reformulate(task: string, decision: RefusalDecision): string { + if (decision.action === "reformulate" && decision.suggestedReformulation) { + return `${decision.reason}\n${decision.suggestedReformulation}`; + } + return decision.reason; +} + +// ─── Effort-Level Prompt Builder ─────────────────────────── + +export interface PhasePromptInput { + task: string; + phase: string; + previousIteration: LoopIteration | null; + effort: EffortLevel; + context?: string; +} + +const PHASE_PREFIXES: Record = { + plan: "Design the approach.", + execute: "Carry out the plan.", + observe: "Extract findings from the output.", + reflect: "Evaluate what worked and what didn't.", + refine: "Produce an improved version.", +}; + +/** + * Build a phase prompt using Fable 5's goal-oriented framing. + * "I'm working on [larger goal]. With that in mind: [phase-specific request]." + */ +export function buildPhasePrompt(input: PhasePromptInput): string { + const { task, phase, previousIteration, effort, context } = input; + + const prefix = PHASE_PREFIXES[phase] ?? "Proceed."; + const prev = previousIteration + ? `\nPrevious reflection: ${previousIteration.reflection ?? "none"}` + : ""; + + const effortDirective: Record = { + low: "Keep it brief.", + medium: "Cover the essentials.", + high: "Be thorough.", + xhigh: "Deep analysis.", + ultracode: "Full autonomous execution.", + }; + + return applyTone( + [ + `I'm working on the following task. With that in mind: ${prefix}`, + ``, + `Task: ${task}`, + context ? `\nContext: ${context}` : "", + prev, + ``, + effortDirective[effort], + ].join("\n"), + { effort } + ); +} + +// ─── Self-Check ──────────────────────────────────────────── + +export interface SelfCheckResult { + passed: boolean; + issues: string[]; + improvements: string[]; +} + +/** + * Fable 5-style self-check before output. + * Always use a SEPARATE verifier (not self-critique) for actual verification. + * This is a lightweight pre-check only. + */ +export function selfCheck( + output: string, + criteria: string[] +): SelfCheckResult { + const issues: string[] = []; + const improvements: string[] = []; + + for (const criterion of criteria) { + const lower = criterion.toLowerCase(); + if (lower.includes("citation") && !output.includes("[")) { + issues.push("No citations found where expected"); + improvements.push("Add inline citations for factual claims"); + } + if (lower.includes("length") && output.length < 50) { + issues.push("Output is too short"); + improvements.push("Expand with more detail and evidence"); + } + if (lower.includes("structure") && !output.includes("\n")) { + issues.push("Output lacks structure"); + improvements.push("Organize into clear sections"); + } + } + + return { + passed: issues.length === 0, + issues, + improvements, + }; +} diff --git a/src/upgrades/media-generator.ts b/src/upgrades/media-generator.ts new file mode 100644 index 0000000..7ea5d97 --- /dev/null +++ b/src/upgrades/media-generator.ts @@ -0,0 +1,331 @@ +/** + * Media Generator — CineFable-style image/video generation via fal.ai + * + * Patterns adapted from CineFable (mattworkmandp/CineFable): + * - Image: fal-ai/nano-banana-pro (text-to-image + edit with references) + * - Video: alibaba/happy-horse/image-to-video (with audio + lip-sync) + * - Gallery: local-storage persisted, native aspect ratio + * - Storyboard: drag-reorderable shot list with scene numbers + * + * Integration with fable-agent: + * - VisionSelfCheck can call this to generate visual artifacts + * - Meta-agent can use this for visual content creation + * - Dreaming system can use this to visualize distillation concepts + */ + +// ─── Types ────────────────────────────────────────────────── + +export type GeneratorEngine = "fal-ai" | "local" | "mock"; + +export interface ImageGenerationRequest { + prompt: string; + /** fal.ai model endpoint */ + model?: string; + /** Reference images for edit mode */ + referenceImages?: string[]; + aspectRatio?: string; + numImages?: number; + /** Negative prompt for exclusion */ + negativePrompt?: string; +} + +export interface VideoGenerationRequest { + /** Source image path/URL for image-to-video */ + sourceImage: string; + model?: string; + prompt?: string; + duration?: number; + resolution?: "480p" | "720p"; +} + +export interface MediaResult { + url: string; + type: "image" | "video"; + model: string; + prompt: string; + durationMs: number; + error: string | null; +} + +export interface GalleryItem { + id: string; + url: string; + type: "image" | "video"; + prompt: string; + timestamp: string; + aspectRatio: string; + /** Scene number if part of a storyboard */ + sceneNumber?: number; +} + +export interface Storyboard { + id: string; + title: string; + shots: GalleryItem[]; + createdAt: string; +} + +// ─── Configuration ────────────────────────────────────────── + +export interface MediaGeneratorConfig { + /** fal.ai API key — falls back to FAL_KEY env var */ + apiKey?: string; + /** Default engine */ + engine?: GeneratorEngine; + /** Default image model */ + imageModel?: string; + /** Default video model */ + videoModel?: string; + /** Base URL for fal.ai queue API */ + falBaseUrl?: string; + /** Max concurrent generations */ + maxConcurrency?: number; +} + +const DEFAULT_CONFIG: Required = { + apiKey: process.env.FAL_KEY ?? "", + engine: "mock", + imageModel: "fal-ai/nano-banana-pro", + videoModel: "alibaba/happy-horse/image-to-video", + falBaseUrl: "https://queue.fal.run", + maxConcurrency: 3, +}; + +// ─── Media Generator ─────────────────────────────────────── + +export class MediaGenerator { + private config: Required; + private gallery: Map = new Map(); + private storyboards: Map = new Map(); + + constructor(config?: Partial) { + this.config = { ...DEFAULT_CONFIG, ...config }; + } + + // ── Image Generation ─────────────────────────────────── + + /** + * Generate an image from text prompt (CineFable's Nano Banana Pro mode). + */ + async generateImage(request: ImageGenerationRequest): Promise { + const startTime = Date.now(); + const model = request.model ?? this.config.imageModel; + + if (this.config.engine === "mock" || !this.config.apiKey) { + return this.mockResult("image", request.prompt, model, startTime); + } + + try { + const endpoint = request.referenceImages?.length + ? `${model}/edit` + : model; + + const body: Record = { + prompt: request.prompt, + num_images: request.numImages ?? 1, + }; + if (request.aspectRatio) body.aspect_ratio = request.aspectRatio; + if (request.negativePrompt) body.negative_prompt = request.negativePrompt; + if (request.referenceImages?.length) body.image_url = request.referenceImages[0]; + + const result = await this.callFalAI(endpoint, body); + + return { + url: result.images?.[0]?.url ?? result.image?.url ?? "", + type: "image", + model, + prompt: request.prompt, + durationMs: Date.now() - startTime, + error: result.error ?? null, + }; + } catch (err) { + return { + url: "", + type: "image", + model, + prompt: request.prompt, + durationMs: Date.now() - startTime, + error: err instanceof Error ? err.message : String(err), + }; + } + } + + // ── Video Generation ─────────────────────────────────── + + /** + * Generate a video from a source image (CineFable's Happy Horse mode). + */ + async generateVideo(request: VideoGenerationRequest): Promise { + const startTime = Date.now(); + const model = request.model ?? this.config.videoModel; + + if (this.config.engine === "mock" || !this.config.apiKey) { + return this.mockResult("video", request.sourceImage, model, startTime); + } + + try { + const body: Record = { + image_url: request.sourceImage, + }; + if (request.prompt) body.prompt = request.prompt; + if (request.duration) body.duration = request.duration; + if (request.resolution) body.resolution = request.resolution; + + const result = await this.callFalAI(model, body); + + return { + url: result.video?.url ?? result.video_url ?? "", + type: "video", + model, + prompt: request.prompt ?? "", + durationMs: Date.now() - startTime, + error: result.error ?? null, + }; + } catch (err) { + return { + url: "", + type: "video", + model, + prompt: request.prompt ?? "", + durationMs: Date.now() - startTime, + error: err instanceof Error ? err.message : String(err), + }; + } + } + + // ── Gallery ──────────────────────────────────────────── + + /** + * Add a result to the gallery (like CineFable's right panel). + */ + addToGallery(item: Omit): GalleryItem { + const id = `gen_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`; + const entry: GalleryItem = { + ...item, + id, + timestamp: new Date().toISOString(), + }; + this.gallery.set(id, entry); + return entry; + } + + /** + * Get all gallery items. + */ + getGallery(): GalleryItem[] { + return [...this.gallery.values()].sort( + (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime() + ); + } + + /** + * Export gallery as JSON. + */ + exportGallery(): string { + return JSON.stringify([...this.gallery.values()], null, 2); + } + + // ── Storyboard ───────────────────────────────────────── + + /** + * Create a storyboard (CineFable's bottom panel — drag-reorderable shot list). + */ + createStoryboard(title: string, shots?: GalleryItem[]): Storyboard { + const board: Storyboard = { + id: `story_${Date.now()}`, + title, + shots: shots?.map((s, i) => ({ ...s, sceneNumber: i + 1 })) ?? [], + createdAt: new Date().toISOString(), + }; + this.storyboards.set(board.id, board); + return board; + } + + /** + * Add a shot to a storyboard at a specific position. + */ + addShot(storyboardId: string, item: GalleryItem, position?: number): Storyboard | null { + const board = this.storyboards.get(storyboardId); + if (!board) return null; + + const shot = { ...item, sceneNumber: position ?? board.shots.length + 1 }; + if (position !== undefined && position >= 0 && position < board.shots.length) { + board.shots.splice(position, 0, shot); + } else { + board.shots.push(shot); + } + + // Renumber + board.shots.forEach((s, i) => { s.sceneNumber = i + 1; }); + return board; + } + + /** + * Reorder shots in a storyboard (CineFable drag-to-reorder). + */ + reorderShots(storyboardId: string, fromIndex: number, toIndex: number): Storyboard | null { + const board = this.storyboards.get(storyboardId); + if (!board) return null; + + const [moved] = board.shots.splice(fromIndex, 1); + board.shots.splice(toIndex, 0, moved); + board.shots.forEach((s, i) => { s.sceneNumber = i + 1; }); + return board; + } + + /** + * Get all storyboards. + */ + getStoryboards(): Storyboard[] { + return [...this.storyboards.values()]; + } + + // ── Capability Check ─────────────────────────────────── + + /** + * Check if the media generator has actual API access. + */ + isAvailable(): boolean { + return this.config.engine !== "mock" || !!this.config.apiKey; + } + + hasFalAIKey(): boolean { + return !!this.config.apiKey; + } + + // ── Private ──────────────────────────────────────────── + + private async callFalAI(endpoint: string, body: Record): Promise { + const response = await fetch(`${this.config.falBaseUrl}/${endpoint}`, { + method: "POST", + headers: { + Authorization: `Key ${this.config.apiKey}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(body), + }); + + if (!response.ok) { + const err = await response.text().catch(() => "unknown"); + throw new Error(`fal.ai API error ${response.status}: ${err.slice(0, 200)}`); + } + + return response.json() as Promise>; + } + + private mockResult( + type: "image" | "video", + prompt: string, + model: string, + startTime: number, + ): MediaResult { + return { + url: `mock://${type}/${Date.now()}`, + type, + model, + prompt, + durationMs: Date.now() - startTime, + error: this.config.apiKey ? null : "No FAL_KEY configured — add to .env for real generation", + }; + } +}