diff --git a/.eslintrc.json b/.eslintrc.json index 589d758..908fad4 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,10 +15,7 @@ "sourceType": "module", "project": "./tsconfig.json" }, - "plugins": [ - "@typescript-eslint", - "import" - ], + "plugins": ["@typescript-eslint", "import"], "rules": { "@typescript-eslint/no-unused-vars": [ "error", @@ -74,11 +71,5 @@ "curly": ["error", "all"], "no-throw-literal": "error" }, - "ignorePatterns": [ - "dist", - "coverage", - "node_modules", - "*.js", - "*.d.ts" - ] + "ignorePatterns": ["dist", "coverage", "node_modules", "*.js", "*.d.ts"] } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ce49da..d6311ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,31 @@ concurrency: cancel-in-progress: true jobs: + dependency-security: + name: Production Dependency Security + runs-on: ubuntu-24.04 + timeout-minutes: 10 + permissions: + contents: read + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: 20.19.5 + cache: npm + - name: Fingerprint committed dependency resolution + run: sha256sum package-lock.json > "$RUNNER_TEMP/test-bench-lock.sha256" + - run: npm ci --ignore-scripts + - name: Reject high and critical production advisories + run: npm audit --omit=dev --audit-level=high + - name: Verify native HTTP proxy trust boundary + run: node scripts/verify-proxy-boundary.mjs . + - name: Verify dependency lock unchanged + if: always() + run: | + sha256sum --check "$RUNNER_TEMP/test-bench-lock.sha256" + git diff --exit-code -- package-lock.json + # Format checking job format: name: Check Code Formatting @@ -232,19 +257,15 @@ jobs: # Summary job - requires all checks to pass ci-success: name: CI Success - runs-on: ubuntu-latest - needs: [format, lint, typecheck, test, coverage, build] + runs-on: ubuntu-24.04 + needs: [format, lint, typecheck, test, coverage, build, integration, dependency-security] if: always() steps: - name: Check all jobs run: | - if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then - echo "One or more CI jobs failed" - exit 1 - fi - if [[ "${{ contains(needs.*.result, 'cancelled') }}" == "true" ]]; then - echo "One or more CI jobs were cancelled" + if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}" == "true" ]]; then + echo "One or more required CI jobs failed, were cancelled, or were skipped" exit 1 fi echo "All CI jobs passed successfully!" diff --git a/.mcp.json b/.mcp.json index bdbebd1..93abafc 100644 --- a/.mcp.json +++ b/.mcp.json @@ -2,11 +2,7 @@ "mcpServers": { "claude-flow": { "command": "npx", - "args": [ - "@claude-flow/cli@latest", - "mcp", - "start" - ], + "args": ["@claude-flow/cli@latest", "mcp", "start"], "env": { "CLAUDE_FLOW_MODE": "v3", "CLAUDE_FLOW_HOOKS_ENABLED": "true", @@ -17,4 +13,4 @@ "autoStart": false } } -} \ No newline at end of file +} diff --git a/CLAUDE.md b/CLAUDE.md index 498ece8..fbeaa0f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,6 +11,7 @@ ### 🚨 CRITICAL: CLI + Task Tool in SAME Message **When user says "spawn swarm" or requests complex work, Claude Code MUST in ONE message:** + 1. Call CLI tools via Bash to initialize coordination 2. **IMMEDIATELY** call Task tool to spawn REAL working agents 3. Both CLI and Task calls must be in the SAME response @@ -21,13 +22,14 @@ **The routing system has 3 tiers for optimal cost/performance:** -| Tier | Handler | Latency | Cost | Use Cases | -|------|---------|---------|------|-----------| -| **1** | Agent Booster | <1ms | $0 | Simple transforms (varβ†’const, add-types, remove-console) | -| **2** | Haiku | ~500ms | $0.0002 | Simple tasks, bug fixes, low complexity | -| **3** | Sonnet/Opus | 2-5s | $0.003-$0.015 | Architecture, security, complex reasoning | +| Tier | Handler | Latency | Cost | Use Cases | +| ----- | ------------- | ------- | ------------- | -------------------------------------------------------- | +| **1** | Agent Booster | <1ms | $0 | Simple transforms (varβ†’const, add-types, remove-console) | +| **2** | Haiku | ~500ms | $0.0002 | Simple tasks, bug fixes, low complexity | +| **3** | Sonnet/Opus | 2-5s | $0.003-$0.015 | Architecture, security, complex reasoning | **Before spawning agents, get routing recommendation:** + ```bash npx @claude-flow/cli@latest hooks pre-task --description "[task description]" ``` @@ -35,15 +37,17 @@ npx @claude-flow/cli@latest hooks pre-task --description "[task description]" **When you see these recommendations:** 1. `[AGENT_BOOSTER_AVAILABLE]` β†’ Skip LLM entirely, use Edit tool directly - - Intent types: `var-to-const`, `add-types`, `add-error-handling`, `async-await`, `add-logging`, `remove-console` + - Intent types: `var-to-const`, `add-types`, `add-error-handling`, `async-await`, `add-logging`, + `remove-console` 2. `[TASK_MODEL_RECOMMENDATION] Use model="X"` β†’ Use that model in Task tool: + ```javascript Task({ - prompt: "...", - subagent_type: "coder", - model: "haiku" // ← USE THE RECOMMENDED MODEL (haiku/sonnet/opus) -}) + prompt: '...', + subagent_type: 'coder', + model: 'haiku', // ← USE THE RECOMMENDED MODEL (haiku/sonnet/opus) +}); ``` **Benefits:** 75% cost reduction, 352x faster for Tier 1 tasks @@ -53,6 +57,7 @@ Task({ ### πŸ›‘οΈ Anti-Drift Config (PREFERRED) **Use this to prevent agent drift:** + ```bash # Small teams (6-8 agents) - use hierarchical for tight control npx @claude-flow/cli@latest swarm init --topology hierarchical --max-agents 8 --strategy specialized @@ -62,6 +67,7 @@ npx @claude-flow/cli@latest swarm init --topology hierarchical-mesh --max-agents ``` **Valid Topologies:** + - `hierarchical` - Queen controls workers directly (anti-drift for small teams) - `hierarchical-mesh` - V3 queen + peer communication (recommended for 10+ agents) - `mesh` - Fully connected peer network @@ -70,6 +76,7 @@ npx @claude-flow/cli@latest swarm init --topology hierarchical-mesh --max-agents - `hybrid` - Dynamic topology switching **Anti-Drift Guidelines:** + - **hierarchical**: Coordinator catches divergence - **max-agents 6-8**: Smaller team = less drift - **specialized**: Clear roles, no overlap @@ -83,40 +90,42 @@ When the user requests a complex task, **spawn agents in background and WAIT for ```javascript // STEP 1: Initialize swarm coordination (anti-drift config) -Bash("npx @claude-flow/cli@latest swarm init --topology hierarchical --max-agents 8 --strategy specialized") +Bash( + 'npx @claude-flow/cli@latest swarm init --topology hierarchical --max-agents 8 --strategy specialized', +); // STEP 2: Spawn ALL agents IN BACKGROUND in a SINGLE message // Use run_in_background: true so agents work concurrently Task({ - prompt: "Research requirements, analyze codebase patterns, store findings in memory", - subagent_type: "researcher", - description: "Research phase", - run_in_background: true // ← CRITICAL: Run in background -}) + prompt: 'Research requirements, analyze codebase patterns, store findings in memory', + subagent_type: 'researcher', + description: 'Research phase', + run_in_background: true, // ← CRITICAL: Run in background +}); Task({ - prompt: "Design architecture based on research. Document decisions.", - subagent_type: "system-architect", - description: "Architecture phase", - run_in_background: true -}) + prompt: 'Design architecture based on research. Document decisions.', + subagent_type: 'system-architect', + description: 'Architecture phase', + run_in_background: true, +}); Task({ - prompt: "Implement the solution following the design. Write clean code.", - subagent_type: "coder", - description: "Implementation phase", - run_in_background: true -}) + prompt: 'Implement the solution following the design. Write clean code.', + subagent_type: 'coder', + description: 'Implementation phase', + run_in_background: true, +}); Task({ - prompt: "Write comprehensive tests for the implementation.", - subagent_type: "tester", - description: "Testing phase", - run_in_background: true -}) + prompt: 'Write comprehensive tests for the implementation.', + subagent_type: 'tester', + description: 'Testing phase', + run_in_background: true, +}); Task({ - prompt: "Review code quality, security, and best practices.", - subagent_type: "reviewer", - description: "Review phase", - run_in_background: true -}) + prompt: 'Review code quality, security, and best practices.', + subagent_type: 'reviewer', + description: 'Review phase', + run_in_background: true, +}); // STEP 3: WAIT - Tell user agents are working, then STOP // Say: "I've spawned 5 agents to work on this in parallel. They'll report back when done." @@ -133,6 +142,7 @@ Task({ 4. **RESPOND** - When agents return results, review and synthesize **Example response after spawning:** + ``` I've launched 5 concurrent agents to work on this: - πŸ” Researcher: Analyzing requirements and codebase @@ -145,12 +155,14 @@ They're working in parallel. I'll synthesize their results when they complete. ``` ### 🚫 DO NOT: + - Continuously check swarm status - Poll TaskOutput repeatedly - Add more tool calls after spawning - Ask "should I check on the agents?" ### βœ… DO: + - Spawn all agents in ONE message - Tell user what's happening - Wait for agent results to arrive @@ -159,6 +171,7 @@ They're working in parallel. I'll synthesize their results when they complete. ## 🧠 AUTO-LEARNING PROTOCOL ### Before Starting Any Task + ```bash # 1. Search memory for relevant patterns from past successes Bash("npx @claude-flow/cli@latest memory search --query '[task keywords]' --namespace patterns") @@ -171,6 +184,7 @@ Bash("npx @claude-flow/cli@latest hooks route --task '[task description]'") ``` ### After Completing Any Task Successfully + ```bash # 1. Store successful pattern for future reference Bash("npx @claude-flow/cli@latest memory store --namespace patterns --key '[pattern-name]' --value '[what worked]'") @@ -187,24 +201,26 @@ Bash("npx @claude-flow/cli@latest hooks worker dispatch --trigger optimize") ### Continuous Improvement Triggers -| Trigger | Worker | When to Use | -|---------|--------|-------------| -| After major refactor | `optimize` | Performance optimization | -| After adding features | `testgaps` | Find missing test coverage | -| After security changes | `audit` | Security analysis | -| After API changes | `document` | Update documentation | -| Every 5+ file changes | `map` | Update codebase map | -| Complex debugging | `deepdive` | Deep code analysis | +| Trigger | Worker | When to Use | +| ---------------------- | ---------- | -------------------------- | +| After major refactor | `optimize` | Performance optimization | +| After adding features | `testgaps` | Find missing test coverage | +| After security changes | `audit` | Security analysis | +| After API changes | `document` | Update documentation | +| Every 5+ file changes | `map` | Update codebase map | +| Complex debugging | `deepdive` | Deep code analysis | ### Memory-Enhanced Development **ALWAYS check memory before:** + - Starting a new feature (search for similar implementations) - Debugging an issue (search for past solutions) - Refactoring code (search for learned patterns) - Performance work (search for optimization strategies) **ALWAYS store in memory after:** + - Solving a tricky bug (store the solution pattern) - Completing a feature (store the approach) - Finding a performance fix (store the optimization) @@ -212,20 +228,21 @@ Bash("npx @claude-flow/cli@latest hooks worker dispatch --trigger optimize") ### πŸ“‹ Agent Routing (Anti-Drift) -| Code | Task | Agents | -|------|------|--------| -| 1 | Bug Fix | coordinator, researcher, coder, tester | -| 3 | Feature | coordinator, architect, coder, tester, reviewer | -| 5 | Refactor | coordinator, architect, coder, reviewer | -| 7 | Performance | coordinator, perf-engineer, coder | -| 9 | Security | coordinator, security-architect, auditor | -| 11 | Docs | researcher, api-docs | +| Code | Task | Agents | +| ---- | ----------- | ----------------------------------------------- | +| 1 | Bug Fix | coordinator, researcher, coder, tester | +| 3 | Feature | coordinator, architect, coder, tester, reviewer | +| 5 | Refactor | coordinator, architect, coder, reviewer | +| 7 | Performance | coordinator, perf-engineer, coder | +| 9 | Security | coordinator, security-architect, auditor | +| 11 | Docs | researcher, api-docs | **Codes 1-9: hierarchical/specialized (anti-drift). Code 11: mesh/balanced** ### 🎯 Task Complexity Detection **AUTO-INVOKE SWARM when task involves:** + - Multiple files (3+) - New feature implementation - Refactoring across modules @@ -235,6 +252,7 @@ Bash("npx @claude-flow/cli@latest hooks worker dispatch --trigger optimize") - Database schema changes **SKIP SWARM for:** + - Single file edits - Simple bug fixes (1-2 lines) - Documentation updates @@ -244,6 +262,7 @@ Bash("npx @claude-flow/cli@latest hooks worker dispatch --trigger optimize") ## 🚨 CRITICAL: CONCURRENT EXECUTION & FILE MANAGEMENT **ABSOLUTE RULES**: + 1. ALL operations MUST be concurrent/parallel in a single message 2. **NEVER save working files, text/mds and tests to the root folder** 3. ALWAYS organize files in appropriate subdirectories @@ -252,6 +271,7 @@ Bash("npx @claude-flow/cli@latest hooks worker dispatch --trigger optimize") ### ⚑ GOLDEN RULE: "1 MESSAGE = ALL RELATED OPERATIONS" **MANDATORY PATTERNS:** + - **TodoWrite**: ALWAYS batch ALL todos in ONE call (5-10+ todos minimum) - **Task tool (Claude Code)**: ALWAYS spawn ALL agents in ONE message with full instructions - **File operations**: ALWAYS batch ALL reads/writes/edits in ONE message @@ -261,6 +281,7 @@ Bash("npx @claude-flow/cli@latest hooks worker dispatch --trigger optimize") ### πŸ“ File Organization Rules **NEVER save to root folder. Use these directories:** + - `/src` - Source code files - `/tests` - Test files - `/docs` - Documentation and markdown files @@ -282,37 +303,37 @@ Bash("npx @claude-flow/cli@latest hooks worker dispatch --trigger optimize") ### Core Commands -| Command | Subcommands | Description | -|---------|-------------|-------------| -| `init` | 4 | Project initialization with wizard, presets, skills, hooks | -| `agent` | 8 | Agent lifecycle (spawn, list, status, stop, metrics, pool, health, logs) | -| `swarm` | 6 | Multi-agent swarm coordination and orchestration | -| `memory` | 11 | AgentDB memory with vector search (150x-12,500x faster) | -| `mcp` | 9 | MCP server management and tool execution | -| `task` | 6 | Task creation, assignment, and lifecycle | -| `session` | 7 | Session state management and persistence | -| `config` | 7 | Configuration management and provider setup | -| `status` | 3 | System status monitoring with watch mode | -| `workflow` | 6 | Workflow execution and template management | -| `hooks` | 17 | Self-learning hooks + 12 background workers | -| `hive-mind` | 6 | Queen-led Byzantine fault-tolerant consensus | +| Command | Subcommands | Description | +| ----------- | ----------- | ------------------------------------------------------------------------ | +| `init` | 4 | Project initialization with wizard, presets, skills, hooks | +| `agent` | 8 | Agent lifecycle (spawn, list, status, stop, metrics, pool, health, logs) | +| `swarm` | 6 | Multi-agent swarm coordination and orchestration | +| `memory` | 11 | AgentDB memory with vector search (150x-12,500x faster) | +| `mcp` | 9 | MCP server management and tool execution | +| `task` | 6 | Task creation, assignment, and lifecycle | +| `session` | 7 | Session state management and persistence | +| `config` | 7 | Configuration management and provider setup | +| `status` | 3 | System status monitoring with watch mode | +| `workflow` | 6 | Workflow execution and template management | +| `hooks` | 17 | Self-learning hooks + 12 background workers | +| `hive-mind` | 6 | Queen-led Byzantine fault-tolerant consensus | ### Advanced Commands -| Command | Subcommands | Description | -|---------|-------------|-------------| -| `daemon` | 5 | Background worker daemon (start, stop, status, trigger, enable) | -| `neural` | 5 | Neural pattern training (train, status, patterns, predict, optimize) | -| `security` | 6 | Security scanning (scan, audit, cve, threats, validate, report) | -| `performance` | 5 | Performance profiling (benchmark, profile, metrics, optimize, report) | -| `providers` | 5 | AI providers (list, add, remove, test, configure) | -| `plugins` | 5 | Plugin management (list, install, uninstall, enable, disable) | -| `deployment` | 5 | Deployment management (deploy, rollback, status, environments, release) | -| `embeddings` | 4 | Vector embeddings (embed, batch, search, init) - 75x faster with agentic-flow | -| `claims` | 4 | Claims-based authorization (check, grant, revoke, list) | -| `migrate` | 5 | V2 to V3 migration with rollback support | -| `doctor` | 1 | System diagnostics with health checks | -| `completions` | 4 | Shell completions (bash, zsh, fish, powershell) | +| Command | Subcommands | Description | +| ------------- | ----------- | ----------------------------------------------------------------------------- | +| `daemon` | 5 | Background worker daemon (start, stop, status, trigger, enable) | +| `neural` | 5 | Neural pattern training (train, status, patterns, predict, optimize) | +| `security` | 6 | Security scanning (scan, audit, cve, threats, validate, report) | +| `performance` | 5 | Performance profiling (benchmark, profile, metrics, optimize, report) | +| `providers` | 5 | AI providers (list, add, remove, test, configure) | +| `plugins` | 5 | Plugin management (list, install, uninstall, enable, disable) | +| `deployment` | 5 | Deployment management (deploy, rollback, status, environments, release) | +| `embeddings` | 4 | Vector embeddings (embed, batch, search, init) - 75x faster with agentic-flow | +| `claims` | 4 | Claims-based authorization (check, grant, revoke, list) | +| `migrate` | 5 | V2 to V3 migration with rollback support | +| `doctor` | 1 | System diagnostics with health checks | +| `completions` | 4 | Shell completions (bash, zsh, fish, powershell) | ### Quick CLI Examples @@ -345,87 +366,102 @@ npx @claude-flow/cli@latest performance benchmark --suite all ## πŸš€ Available Agents (60+ Types) ### Core Development + `coder`, `reviewer`, `tester`, `planner`, `researcher` ### V3 Specialized Agents + `security-architect`, `security-auditor`, `memory-specialist`, `performance-engineer` ### πŸ” @claude-flow/security + CVE remediation, input validation, path security: + - `InputValidator` - Zod validation - `PathValidator` - Traversal prevention - `SafeExecutor` - Injection protection ### Swarm Coordination -`hierarchical-coordinator`, `mesh-coordinator`, `adaptive-coordinator`, `collective-intelligence-coordinator`, `swarm-memory-manager` + +`hierarchical-coordinator`, `mesh-coordinator`, `adaptive-coordinator`, +`collective-intelligence-coordinator`, `swarm-memory-manager` ### Consensus & Distributed -`byzantine-coordinator`, `raft-manager`, `gossip-coordinator`, `consensus-builder`, `crdt-synchronizer`, `quorum-manager`, `security-manager` + +`byzantine-coordinator`, `raft-manager`, `gossip-coordinator`, `consensus-builder`, +`crdt-synchronizer`, `quorum-manager`, `security-manager` ### Performance & Optimization + `perf-analyzer`, `performance-benchmarker`, `task-orchestrator`, `memory-coordinator`, `smart-agent` ### GitHub & Repository -`github-modes`, `pr-manager`, `code-review-swarm`, `issue-tracker`, `release-manager`, `workflow-automation`, `project-board-sync`, `repo-architect`, `multi-repo-swarm` + +`github-modes`, `pr-manager`, `code-review-swarm`, `issue-tracker`, `release-manager`, +`workflow-automation`, `project-board-sync`, `repo-architect`, `multi-repo-swarm` ### SPARC Methodology + `sparc-coord`, `sparc-coder`, `specification`, `pseudocode`, `architecture`, `refinement` ### Specialized Development -`backend-dev`, `mobile-dev`, `ml-developer`, `cicd-engineer`, `api-docs`, `system-architect`, `code-analyzer`, `base-template-generator` + +`backend-dev`, `mobile-dev`, `ml-developer`, `cicd-engineer`, `api-docs`, `system-architect`, +`code-analyzer`, `base-template-generator` ### Testing & Validation + `tdd-london-swarm`, `production-validator` ## πŸͺ V3 Hooks System (27 Hooks + 12 Workers) ### All Available Hooks -| Hook | Description | Key Options | -|------|-------------|-------------| -| `pre-edit` | Get context before editing files | `--file`, `--operation` | -| `post-edit` | Record editing outcome for learning | `--file`, `--success`, `--train-neural` | -| `pre-command` | Assess risk before commands | `--command`, `--validate-safety` | -| `post-command` | Record command execution outcome | `--command`, `--track-metrics` | -| `pre-task` | Record task start, get agent suggestions | `--description`, `--coordinate-swarm` | -| `post-task` | Record task completion for learning | `--task-id`, `--success`, `--store-results` | -| `session-start` | Start/restore session (v2 compat) | `--session-id`, `--auto-configure` | -| `session-end` | End session and persist state | `--generate-summary`, `--export-metrics` | -| `session-restore` | Restore a previous session | `--session-id`, `--latest` | -| `route` | Route task to optimal agent | `--task`, `--context`, `--top-k` | -| `route-task` | (v2 compat) Alias for route | `--task`, `--auto-swarm` | -| `explain` | Explain routing decision | `--topic`, `--detailed` | -| `pretrain` | Bootstrap intelligence from repo | `--model-type`, `--epochs` | -| `build-agents` | Generate optimized agent configs | `--agent-types`, `--focus` | -| `metrics` | View learning metrics dashboard | `--v3-dashboard`, `--format` | -| `transfer` | Transfer patterns via IPFS registry | `store`, `from-project` | -| `list` | List all registered hooks | `--format` | -| `intelligence` | RuVector intelligence system | `trajectory-*`, `pattern-*`, `stats` | -| `worker` | Background worker management | `list`, `dispatch`, `status`, `detect` | -| `progress` | Check V3 implementation progress | `--detailed`, `--format` | -| `statusline` | Generate dynamic statusline | `--json`, `--compact`, `--no-color` | -| `coverage-route` | Route based on test coverage gaps | `--task`, `--path` | -| `coverage-suggest` | Suggest coverage improvements | `--path` | -| `coverage-gaps` | List coverage gaps with priorities | `--format`, `--limit` | -| `pre-bash` | (v2 compat) Alias for pre-command | Same as pre-command | -| `post-bash` | (v2 compat) Alias for post-command | Same as post-command | +| Hook | Description | Key Options | +| ------------------ | ---------------------------------------- | ------------------------------------------- | +| `pre-edit` | Get context before editing files | `--file`, `--operation` | +| `post-edit` | Record editing outcome for learning | `--file`, `--success`, `--train-neural` | +| `pre-command` | Assess risk before commands | `--command`, `--validate-safety` | +| `post-command` | Record command execution outcome | `--command`, `--track-metrics` | +| `pre-task` | Record task start, get agent suggestions | `--description`, `--coordinate-swarm` | +| `post-task` | Record task completion for learning | `--task-id`, `--success`, `--store-results` | +| `session-start` | Start/restore session (v2 compat) | `--session-id`, `--auto-configure` | +| `session-end` | End session and persist state | `--generate-summary`, `--export-metrics` | +| `session-restore` | Restore a previous session | `--session-id`, `--latest` | +| `route` | Route task to optimal agent | `--task`, `--context`, `--top-k` | +| `route-task` | (v2 compat) Alias for route | `--task`, `--auto-swarm` | +| `explain` | Explain routing decision | `--topic`, `--detailed` | +| `pretrain` | Bootstrap intelligence from repo | `--model-type`, `--epochs` | +| `build-agents` | Generate optimized agent configs | `--agent-types`, `--focus` | +| `metrics` | View learning metrics dashboard | `--v3-dashboard`, `--format` | +| `transfer` | Transfer patterns via IPFS registry | `store`, `from-project` | +| `list` | List all registered hooks | `--format` | +| `intelligence` | RuVector intelligence system | `trajectory-*`, `pattern-*`, `stats` | +| `worker` | Background worker management | `list`, `dispatch`, `status`, `detect` | +| `progress` | Check V3 implementation progress | `--detailed`, `--format` | +| `statusline` | Generate dynamic statusline | `--json`, `--compact`, `--no-color` | +| `coverage-route` | Route based on test coverage gaps | `--task`, `--path` | +| `coverage-suggest` | Suggest coverage improvements | `--path` | +| `coverage-gaps` | List coverage gaps with priorities | `--format`, `--limit` | +| `pre-bash` | (v2 compat) Alias for pre-command | Same as pre-command | +| `post-bash` | (v2 compat) Alias for post-command | Same as post-command | ### 12 Background Workers -| Worker | Priority | Description | -|--------|----------|-------------| -| `ultralearn` | normal | Deep knowledge acquisition | -| `optimize` | high | Performance optimization | -| `consolidate` | low | Memory consolidation | -| `predict` | normal | Predictive preloading | -| `audit` | critical | Security analysis | -| `map` | normal | Codebase mapping | -| `preload` | low | Resource preloading | -| `deepdive` | normal | Deep code analysis | -| `document` | normal | Auto-documentation | -| `refactor` | normal | Refactoring suggestions | -| `benchmark` | normal | Performance benchmarking | -| `testgaps` | normal | Test coverage analysis | +| Worker | Priority | Description | +| ------------- | -------- | -------------------------- | +| `ultralearn` | normal | Deep knowledge acquisition | +| `optimize` | high | Performance optimization | +| `consolidate` | low | Memory consolidation | +| `predict` | normal | Predictive preloading | +| `audit` | critical | Security analysis | +| `map` | normal | Codebase mapping | +| `preload` | low | Resource preloading | +| `deepdive` | normal | Deep code analysis | +| `document` | normal | Auto-documentation | +| `refactor` | normal | Refactoring suggestions | +| `benchmark` | normal | Performance benchmarking | +| `testgaps` | normal | Test coverage analysis | ### Essential Hook Commands @@ -481,6 +517,7 @@ npx @claude-flow/cli@latest migrate validate ## 🧠 Intelligence System (RuVector) V3 includes the RuVector Intelligence System: + - **SONA**: Self-Optimizing Neural Architecture (<0.05ms adaptation) - **MoE**: Mixture of Experts for specialized routing - **HNSW**: 150x-12,500x faster pattern search @@ -488,6 +525,7 @@ V3 includes the RuVector Intelligence System: - **Flash Attention**: 2.49x-7.47x speedup The 4-step intelligence pipeline: + 1. **RETRIEVE** - Fetch relevant patterns via HNSW 2. **JUDGE** - Evaluate with verdicts (success/failure) 3. **DISTILL** - Extract key learnings via LoRA @@ -496,6 +534,7 @@ The 4-step intelligence pipeline: ## πŸ“¦ Embeddings Package (v3.0.0-alpha.12) Features: + - **sql.js**: Cross-platform SQLite persistent cache (WASM, no native compilation) - **Document chunking**: Configurable overlap and size - **Normalization**: L2, L1, min-max, z-score @@ -506,12 +545,14 @@ Features: ## 🐝 Hive-Mind Consensus ### Topologies + - `hierarchical` - Queen controls workers directly - `mesh` - Fully connected peer network - `hierarchical-mesh` - Hybrid (recommended) - `adaptive` - Dynamic based on load ### Consensus Strategies + - `byzantine` - BFT (tolerates f < n/3 faulty) - `raft` - Leader-based (tolerates f < n/2) - `gossip` - Epidemic for eventual consistency @@ -520,18 +561,19 @@ Features: ## V3 Performance Targets -| Metric | Target | -|--------|--------| -| Flash Attention | 2.49x-7.47x speedup | -| HNSW Search | 150x-12,500x faster | +| Metric | Target | +| ---------------- | ------------------------ | +| Flash Attention | 2.49x-7.47x speedup | +| HNSW Search | 150x-12,500x faster | | Memory Reduction | 50-75% with quantization | -| MCP Response | <100ms | -| CLI Startup | <500ms | -| SONA Adaptation | <0.05ms | +| MCP Response | <100ms | +| CLI Startup | <500ms | +| SONA Adaptation | <0.05ms | ## πŸ“Š Performance Optimization Protocol ### Automatic Performance Tracking + ```bash # After any significant operation, track metrics Bash("npx @claude-flow/cli@latest hooks post-command --command '[operation]' --track-metrics true") @@ -544,6 +586,7 @@ Bash("npx @claude-flow/cli@latest performance profile --target '[component]'") ``` ### Session Persistence (Cross-Conversation Learning) + ```bash # At session start - restore previous context Bash("npx @claude-flow/cli@latest session restore --latest") @@ -553,6 +596,7 @@ Bash("npx @claude-flow/cli@latest hooks session-end --generate-summary true --pe ``` ### Neural Pattern Training + ```bash # Train on successful code patterns Bash("npx @claude-flow/cli@latest neural train --pattern-type coordination --epochs 10") @@ -589,6 +633,7 @@ CLAUDE_FLOW_MEMORY_PATH=./data/memory ## πŸ” Doctor Health Checks Run `npx @claude-flow/cli@latest doctor` to check: + - Node.js version (20+) - npm version (9+) - Git installation @@ -618,6 +663,7 @@ npx @claude-flow/cli@latest doctor --fix ## 🎯 Claude Code vs CLI Tools ### Claude Code Handles ALL EXECUTION: + - **Task tool**: Spawn and run agents concurrently - File operations (Read, Write, Edit, MultiEdit, Glob, Grep) - Code generation and programming @@ -626,18 +672,22 @@ npx @claude-flow/cli@latest doctor --fix - Git operations ### CLI Tools Handle Coordination (via Bash): + - **Swarm init**: `npx @claude-flow/cli@latest swarm init --topology ` - **Swarm status**: `npx @claude-flow/cli@latest swarm status` - **Agent spawn**: `npx @claude-flow/cli@latest agent spawn -t --name ` -- **Memory store**: `npx @claude-flow/cli@latest memory store --key "mykey" --value "myvalue" --namespace patterns` +- **Memory store**: + `npx @claude-flow/cli@latest memory store --key "mykey" --value "myvalue" --namespace patterns` - **Memory search**: `npx @claude-flow/cli@latest memory search --query "search terms"` - **Memory list**: `npx @claude-flow/cli@latest memory list --namespace patterns` -- **Memory retrieve**: `npx @claude-flow/cli@latest memory retrieve --key "mykey" --namespace patterns` +- **Memory retrieve**: + `npx @claude-flow/cli@latest memory retrieve --key "mykey" --namespace patterns` - **Hooks**: `npx @claude-flow/cli@latest hooks [options]` ## πŸ“ Memory Commands Reference (IMPORTANT) ### Store Data (ALL options shown) + ```bash # REQUIRED: --key and --value # OPTIONAL: --namespace (default: "default"), --ttl, --tags @@ -646,6 +696,7 @@ npx @claude-flow/cli@latest memory store --key "bug-fix-123" --value "Fixed null ``` ### Search Data (semantic vector search) + ```bash # REQUIRED: --query (full flag, not -q) # OPTIONAL: --namespace, --limit, --threshold @@ -654,6 +705,7 @@ npx @claude-flow/cli@latest memory search --query "error handling" --namespace p ``` ### List Entries + ```bash # OPTIONAL: --namespace, --limit npx @claude-flow/cli@latest memory list @@ -661,6 +713,7 @@ npx @claude-flow/cli@latest memory list --namespace patterns --limit 10 ``` ### Retrieve Specific Entry + ```bash # REQUIRED: --key # OPTIONAL: --namespace (default: "default") @@ -669,6 +722,7 @@ npx @claude-flow/cli@latest memory retrieve --key "pattern-auth" --namespace pat ``` ### Initialize Memory Database + ```bash npx @claude-flow/cli@latest memory init --force --verbose ``` @@ -677,11 +731,13 @@ npx @claude-flow/cli@latest memory init --force --verbose ## πŸ“š Full Capabilities Reference -For a comprehensive overview of all Claude Flow V3 features, agents, commands, and integrations, see: +For a comprehensive overview of all Claude Flow V3 features, agents, commands, and integrations, +see: **`.claude-flow/CAPABILITIES.md`** - Complete reference generated during init This includes: + - All 60+ agent types with routing recommendations - All 26 CLI commands with 140+ subcommands - All 27 hooks + 12 background workers @@ -700,13 +756,15 @@ This includes: Remember: **Claude Flow CLI coordinates, Claude Code Task tool creates!** # important-instruction-reminders -Do what has been asked; nothing more, nothing less. -NEVER create files unless they're absolutely necessary for achieving your goal. -ALWAYS prefer editing an existing file to creating a new one. -NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User. -Never save working files, text/mds and tests to the root folder. + +Do what has been asked; nothing more, nothing less. NEVER create files unless they're absolutely +necessary for achieving your goal. ALWAYS prefer editing an existing file to creating a new one. +NEVER proactively create documentation files (\*.md) or README files. Only create documentation +files if explicitly requested by the User. Never save working files, text/mds and tests to the root +folder. ## 🚨 SWARM EXECUTION RULES (CRITICAL) + 1. **SPAWN IN BACKGROUND**: Use `run_in_background: true` for all agent Task calls 2. **SPAWN ALL AT ONCE**: Put ALL agent Task calls in ONE message for parallel execution 3. **TELL USER**: After spawning, list what each agent is doing (use emojis for clarity) @@ -716,6 +774,7 @@ Never save working files, text/mds and tests to the root folder. 7. **NO CONFIRMATION**: Don't ask "should I check?" - just wait for results Example spawn message: + ``` "I've launched 4 agents in background: - πŸ” Researcher: [task] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 26e3623..29e2501 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,7 @@ # Contributing to LLM Test Bench -Thank you for your interest in contributing to LLM Test Bench! This document provides guidelines and instructions for contributing to the project. +Thank you for your interest in contributing to LLM Test Bench! This document provides guidelines and +instructions for contributing to the project. ## Table of Contents @@ -21,7 +22,8 @@ Please be respectful and constructive in all interactions. We're building a welc 1. Fork the repository 2. Clone your fork: `git clone https://github.com/YOUR_USERNAME/llm-test-bench.git` -3. Add upstream remote: `git remote add upstream https://github.com/ORIGINAL_OWNER/llm-test-bench.git` +3. Add upstream remote: + `git remote add upstream https://github.com/ORIGINAL_OWNER/llm-test-bench.git` 4. Create a branch: `git checkout -b feature/your-feature-name` ## Development Setup @@ -63,7 +65,8 @@ npm run ci ## CI/CD Pipeline -Our CI/CD pipeline ensures code quality and consistency. All checks must pass before a PR can be merged. +Our CI/CD pipeline ensures code quality and consistency. All checks must pass before a PR can be +merged. ### CI Workflow (Automated on Push/PR) @@ -113,6 +116,7 @@ git push origin v1.0.0 ``` This triggers: + - Full test suite - Build for multiple platforms - GitHub release creation @@ -147,6 +151,7 @@ This triggers: Auto-format on save is recommended. Configure your editor: **VS Code (.vscode/settings.json):** + ```json { "editor.formatOnSave": true, @@ -214,6 +219,7 @@ describe('MyComponent', () => { 6. βœ… Build succeeds: `npm run build` Or run everything at once: + ```bash npm run ci ``` @@ -234,18 +240,22 @@ When creating a PR, include: ```markdown ## Description + Brief description of the change ## Type of Change + - [ ] Bug fix - [ ] New feature - [ ] Breaking change - [ ] Documentation update ## Testing + How has this been tested? ## Checklist + - [ ] Tests pass locally - [ ] Code follows style guidelines - [ ] Documentation updated @@ -305,6 +315,7 @@ Add troubleshooting section for common installation issues. ### Scopes Common scopes: + - `cli` - CLI interface - `config` - Configuration system - `providers` - LLM providers @@ -336,10 +347,12 @@ npm run test:ui ### Husky Git Hooks Pre-commit hooks automatically run: + - ESLint on staged TypeScript files - Prettier on staged files To bypass hooks (not recommended): + ```bash git commit --no-verify ``` @@ -347,17 +360,20 @@ git commit --no-verify ### Common Issues **"Module not found" errors:** + ```bash rm -rf node_modules package-lock.json npm install ``` **Type errors after update:** + ```bash npm run typecheck ``` **Coverage threshold failures:** + ```bash npm run test:coverage # Check which files need more coverage @@ -366,7 +382,8 @@ npm run test:coverage ## Getting Help - πŸ“– Read the [documentation](./docs/) -- πŸ’¬ Ask questions in [GitHub Discussions](https://github.com/yourusername/llm-test-bench/discussions) +- πŸ’¬ Ask questions in + [GitHub Discussions](https://github.com/yourusername/llm-test-bench/discussions) - πŸ› Report bugs in [GitHub Issues](https://github.com/yourusername/llm-test-bench/issues) ## License diff --git a/README.md b/README.md index 20bfd6e..e1b0b98 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ # πŸ§ͺ LLM Test Bench -**A comprehensive, production-ready framework for benchmarking, testing, and evaluating Large Language Models** +**A comprehensive, production-ready framework for benchmarking, testing, and evaluating Large +Language Models** [![CI](https://img.shields.io/github/actions/workflow/status/globalbusinessadvisors/llm-test-bench/llm-benchmark.yml?branch=main&label=CI&logo=github)](https://github.com/globalbusinessadvisors/llm-test-bench/actions) [![Crates.io](https://img.shields.io/crates/v/llm-test-bench?logo=rust)](https://crates.io/crates/llm-test-bench) @@ -11,7 +12,8 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Rust Version](https://img.shields.io/badge/rust-1.75%2B-blue.svg)](https://www.rust-lang.org) -[Features](#-features) β€’ [Quick Start](#-quick-start) β€’ [Documentation](#-documentation) β€’ [Architecture](#-architecture) β€’ [Contributing](#-contributing) +[Features](#-features) β€’ [Quick Start](#-quick-start) β€’ [Documentation](#-documentation) β€’ +[Architecture](#-architecture) β€’ [Contributing](#-contributing) @@ -19,13 +21,18 @@ ## πŸ“– Overview -LLM Test Bench is a powerful, enterprise-grade framework built in Rust for comprehensive testing, benchmarking, and evaluation of Large Language Models. It provides a unified interface to test multiple LLM providers, evaluate responses with sophisticated metrics, and visualize results through an intuitive dashboard. +LLM Test Bench is a powerful, enterprise-grade framework built in Rust for comprehensive testing, +benchmarking, and evaluation of Large Language Models. It provides a unified interface to test +multiple LLM providers, evaluate responses with sophisticated metrics, and visualize results through +an intuitive dashboard. ### Why LLM Test Bench? -- **πŸš€ Multi-Provider Support**: Test 14+ LLM providers with 65 models through a single, unified interface +- **πŸš€ Multi-Provider Support**: Test 14+ LLM providers with 65 models through a single, unified + interface - **πŸ†• Latest Models**: Full support for GPT-5, Claude Opus 4, Gemini 2.5, and all 2025 releases -- **πŸ“Š Comprehensive Metrics**: Evaluate models with perplexity, coherence, relevance, faithfulness, and custom evaluators +- **πŸ“Š Comprehensive Metrics**: Evaluate models with perplexity, coherence, relevance, faithfulness, + and custom evaluators - **⚑ High Performance**: Built in Rust for speed, safety, and scalability - **🎨 Rich Visualization**: Interactive dashboards with real-time metrics and beautiful charts - **πŸ”Œ Extensible**: Plugin system, custom evaluators, and distributed computing support @@ -40,6 +47,7 @@ LLM Test Bench is a powerful, enterprise-grade framework built in Rust for compr #### πŸ€– Multi-Provider LLM Support **OpenAI (27 models)** + ``` gpt-5 gpt-4.5, gpt-4.5-2025-02-27 @@ -54,6 +62,7 @@ gpt-3.5-turbo, gpt-3.5-turbo-0125, gpt-3.5-turbo-1106 ``` **Anthropic (15 models)** + ``` claude-opus-4, claude-opus-4-20250501 claude-sonnet-4.5, claude-sonnet-4.5-20250901 @@ -66,6 +75,7 @@ claude-3-haiku-20240307 ``` **Google Gemini (16 models)** + ``` gemini-2.5-pro gemini-2.5-computer-use, gemini-2.5-computer-use-20251007 @@ -77,6 +87,7 @@ gemini-pro, gemini-pro-vision ``` **Mistral AI (7 models)** + ``` mistral-code, mistral-code-20250604 magistral-large, magistral-medium, magistral-small @@ -84,6 +95,7 @@ voxtral-small, voxtral-small-20250701 ``` **Additional Providers** + - **Azure OpenAI**: All OpenAI models via Azure endpoints - **AWS Bedrock**: Claude, Llama, Titan, and more - **Cohere**: Command, Command R/R+ @@ -91,6 +103,7 @@ voxtral-small, voxtral-small-20250701 - **Specialized**: Groq, Perplexity AI #### πŸ“ˆ Advanced Evaluation Metrics + - **Perplexity Analysis**: Statistical language model evaluation - **Coherence Scoring**: Semantic consistency and logical flow - **Relevance Evaluation**: Context-aware response quality @@ -100,6 +113,7 @@ voxtral-small, voxtral-small-20250701 - **Custom Evaluators**: Build your own evaluation metrics #### 🎯 Benchmarking & Testing + - **Systematic Testing**: Automated test suites with rich assertions - **Comparative Analysis**: Side-by-side model comparison - **Performance Profiling**: Latency, throughput, and cost tracking @@ -107,6 +121,7 @@ voxtral-small, voxtral-small-20250701 - **Optimization Tools**: Automatic parameter tuning and model recommendation #### πŸ“Š Visualization & Reporting + - **Interactive Dashboard**: Real-time metrics with Chart.js - **Rich Charts**: Performance graphs, cost analysis, trend visualization - **Multiple Formats**: HTML reports, JSON exports, custom templates @@ -114,6 +129,7 @@ voxtral-small, voxtral-small-20250701 - **Historical Trends**: Long-term performance tracking #### 🌐 API & Integration + - **REST API**: Complete HTTP API with authentication - **GraphQL**: Flexible query interface for complex data needs - **WebSocket**: Real-time streaming and live updates @@ -121,6 +137,7 @@ voxtral-small, voxtral-small-20250701 - **Distributed Computing**: Scale benchmarks across multiple nodes #### πŸ”Œ Extensibility + - **Plugin System**: WASM-based sandboxed plugins - **Custom Evaluators**: Implement domain-specific metrics - **Multimodal Support**: Image, audio, and video evaluation @@ -146,6 +163,7 @@ llm-test-bench --version #### Option 2: Install via npm **CLI Package:** + ```bash # Install CLI globally npm install -g @llm-dev-ops/test-bench-cli @@ -158,6 +176,7 @@ ltb --version ``` **SDK Package (for programmatic use):** + ```bash # Install SDK in your project npm install @llm-dev-ops/test-bench-sdk @@ -187,7 +206,8 @@ cargo install --path cli ### Prerequisites - **For Cargo**: Rust 1.75.0 or later ([Install Rust](https://rustup.rs/)) -- **For npm**: Node.js 14.0.0+ and Rust ([Install Node](https://nodejs.org/), [Install Rust](https://rustup.rs/)) +- **For npm**: Node.js 14.0.0+ and Rust ([Install Node](https://nodejs.org/), + [Install Rust](https://rustup.rs/)) - **API Keys**: At least one LLM provider API key ### Configuration @@ -268,16 +288,19 @@ open http://localhost:9090 # Prometheus ## πŸ“š Documentation ### Getting Started + - [Quick Start Guide](docs/QUICKSTART_PHASE4.md) - Get up and running in 5 minutes - [CLI Reference](docs/CLI_REFERENCE.md) - Complete command-line documentation - [Configuration Guide](docs/CONFIGURATION.md) - Advanced configuration options ### Architecture & Design + - [Architecture Overview](docs/ARCHITECTURE_REPORT.md) - System design and components - [Workspace Structure](docs/WORKSPACE_STRUCTURE.md) - Project organization - [Technical Architecture](plans/PHASE5_TECHNICAL_ARCHITECTURE.md) - Deep dive into design ### Features + - [Provider Support](docs/PROVIDERS.md) - All supported LLM providers - [API Documentation](docs/API.md) - REST & GraphQL API reference - [Monitoring](docs/MONITORING.md) - Observability and metrics @@ -286,10 +309,12 @@ open http://localhost:9090 # Prometheus - [Plugins](docs/PLUGINS.md) - Extensibility and custom plugins ### Deployment + - [Docker Deployment](docs/DOCKER_DEPLOYMENT.md) - Containerized deployment guide - [Database Setup](docs/DATABASE.md) - PostgreSQL configuration ### Development + - [Phase Implementation Reports](docs/) - Detailed implementation history - [Contributing Guide](CONTRIBUTING.md) - How to contribute - [Development Setup](docs/DEVELOPMENT.md) - Set up your dev environment @@ -384,21 +409,28 @@ llm-test-bench/ ## 🎯 Use Cases ### 1. Model Selection -Compare multiple LLM providers to choose the best model for your use case based on quality, cost, and latency. + +Compare multiple LLM providers to choose the best model for your use case based on quality, cost, +and latency. ### 2. Quality Assurance + Systematic testing of LLM applications with rich assertions and automated evaluation metrics. ### 3. Performance Benchmarking + Measure and track latency, throughput, and cost across different models and configurations. ### 4. Regression Testing + Ensure model updates don't degrade quality with historical comparison and automated alerts. ### 5. Cost Optimization + Identify the most cost-effective model that meets your quality requirements. ### 6. Research & Experimentation + Rapid prototyping and comparison of different prompts, models, and parameters. --- @@ -456,7 +488,8 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file ## πŸ“ž Support - **Issues**: [GitHub Issues](https://github.com/globalbusinessadvisors/llm-test-bench/issues) -- **Discussions**: [GitHub Discussions](https://github.com/globalbusinessadvisors/llm-test-bench/discussions) +- **Discussions**: + [GitHub Discussions](https://github.com/globalbusinessadvisors/llm-test-bench/discussions) - **Documentation**: [docs/](docs/) --- @@ -464,6 +497,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file ## πŸ—ΊοΈ Roadmap ### Completed βœ… + - βœ… Multi-provider LLM support (14+ providers) - βœ… Advanced evaluation metrics - βœ… Visualization dashboard @@ -475,12 +509,14 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file - βœ… PostgreSQL backend ### In Progress 🚧 + - 🚧 Enhanced multimodal support - 🚧 Advanced cost optimization - 🚧 Plugin marketplace - 🚧 Cloud deployment templates ### Planned πŸ“‹ + - πŸ“‹ Real-time collaboration features - πŸ“‹ Advanced A/B testing framework - πŸ“‹ Integration with MLOps platforms @@ -492,7 +528,9 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file **⭐ Star us on GitHub β€” it motivates us a lot!** -[Report Bug](https://github.com/globalbusinessadvisors/llm-test-bench/issues) β€’ [Request Feature](https://github.com/globalbusinessadvisors/llm-test-bench/issues) β€’ [Documentation](docs/) +[Report Bug](https://github.com/globalbusinessadvisors/llm-test-bench/issues) β€’ +[Request Feature](https://github.com/globalbusinessadvisors/llm-test-bench/issues) β€’ +[Documentation](docs/) Made with ❀️ by the LLM Test Bench Team diff --git a/agents/adversarial-prompt/tests/smoke.test.ts b/agents/adversarial-prompt/tests/smoke.test.ts index 6a815d3..4fa12cd 100644 --- a/agents/adversarial-prompt/tests/smoke.test.ts +++ b/agents/adversarial-prompt/tests/smoke.test.ts @@ -140,7 +140,7 @@ describe('Adversarial Prompt Agent', () => { path: '/adversarial-prompt', }); - expect(response.statusCode).toBe(200); + expect(response.statusCode, response.body).toBe(200); const result = JSON.parse(response.body); expect(result.success).toBe(true); diff --git a/agents/benchmark-runner/tests/smoke.test.ts b/agents/benchmark-runner/tests/smoke.test.ts index b18a812..3cfa7e4 100644 --- a/agents/benchmark-runner/tests/smoke.test.ts +++ b/agents/benchmark-runner/tests/smoke.test.ts @@ -4,7 +4,7 @@ * Verification checklist and smoke tests for platform wiring. */ -import { describe, it, expect, beforeAll, afterAll } from 'vitest'; +import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'; import { handler, BENCHMARK_RUNNER_AGENT } from '../handler'; import { BenchmarkRunnerInputSchema, @@ -12,10 +12,23 @@ import { DecisionEventSchema, validateInput, } from '../../contracts'; -import { - getRegistrationMetadata, - validateRegistration, -} from '../../registry/benchmark-runner'; +import { getRegistrationMetadata, validateRegistration } from '../../registry/benchmark-runner'; + +vi.mock('../../services', () => ({ + getRuVectorClient: () => ({ + persistDecisionEvent: vi.fn().mockResolvedValue(undefined), + flush: vi.fn().mockResolvedValue(undefined), + }), + createTelemetryEmitter: () => ({ + emitInvoked: vi.fn(), + emitCompleted: vi.fn(), + emitDecision: vi.fn(), + emitError: vi.fn(), + emitValidationFailed: vi.fn(), + emitConstraintApplied: vi.fn(), + flush: vi.fn().mockResolvedValue(undefined), + }), +})); // ============================================================================= // TEST FIXTURES @@ -259,11 +272,13 @@ describe('Integration Smoke Tests', () => { // Requires OPENAI_API_KEY const input = { ...VALID_INPUT, - providers: [{ - provider_name: 'openai' as const, - model_id: 'gpt-4o-mini', - api_key_ref: 'openai', - }], + providers: [ + { + provider_name: 'openai' as const, + model_id: 'gpt-4o-mini', + api_key_ref: 'openai', + }, + ], }; const response = await handler({ diff --git a/agents/contracts/schemas/base.ts b/agents/contracts/schemas/base.ts index 58fc805..e1b238b 100644 --- a/agents/contracts/schemas/base.ts +++ b/agents/contracts/schemas/base.ts @@ -3,6 +3,7 @@ * These schemas define the canonical structures that ALL agents must use. */ +import { webcrypto } from 'crypto'; import { z } from 'zod'; // ============================================================================= @@ -82,11 +83,15 @@ export const DecisionEventSchema = z.object({ // Confidence and constraints confidence: z.number().min(0).max(1), - confidence_factors: z.array(z.object({ - factor: z.string(), - weight: z.number().min(0).max(1), - value: z.number().min(0).max(1), - })).optional(), + confidence_factors: z + .array( + z.object({ + factor: z.string(), + weight: z.number().min(0).max(1), + value: z.number().min(0).max(1), + }), + ) + .optional(), constraints_applied: z.array(z.string()), @@ -98,11 +103,13 @@ export const DecisionEventSchema = z.object({ duration_ms: z.number().nonnegative(), // Error state (if any) - error: z.object({ - code: z.string(), - message: z.string(), - recoverable: z.boolean(), - }).optional(), + error: z + .object({ + code: z.string(), + message: z.string(), + recoverable: z.boolean(), + }) + .optional(), }); export type DecisionEvent = z.infer; @@ -171,7 +178,7 @@ export type AgentError = z.infer; */ export function validateInput( schema: z.ZodSchema, - input: unknown + input: unknown, ): { success: true; data: T } | { success: false; error: AgentError } { const result = schema.safeParse(input); @@ -185,7 +192,7 @@ export function validateInput( code: 'VALIDATION_ERROR', message: 'Input validation failed', details: { - issues: result.error.issues.map(i => ({ + issues: result.error.issues.map((i) => ({ path: i.path.join('.'), message: i.message, })), @@ -202,9 +209,9 @@ export function validateInput( export async function hashInputs(inputs: unknown): Promise { const encoder = new TextEncoder(); const data = encoder.encode(JSON.stringify(inputs)); - const hashBuffer = await crypto.subtle.digest('SHA-256', data); + const hashBuffer = await webcrypto.subtle.digest('SHA-256', data); const hashArray = Array.from(new Uint8Array(hashBuffer)); - return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); + return hashArray.map((b) => b.toString(16).padStart(2, '0')).join(''); } // ============================================================================= diff --git a/agents/golden-dataset-validator/tests/smoke.test.ts b/agents/golden-dataset-validator/tests/smoke.test.ts index bd80e28..c389068 100644 --- a/agents/golden-dataset-validator/tests/smoke.test.ts +++ b/agents/golden-dataset-validator/tests/smoke.test.ts @@ -4,7 +4,7 @@ * Basic integration tests to verify the agent works correctly. */ -import { describe, it, expect, beforeEach } from 'vitest'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; import { randomUUID } from 'crypto'; import { handler, @@ -15,6 +15,22 @@ import { type GoldenDatasetValidatorInput, } from '../handler'; +vi.mock('../../services', () => ({ + getRuVectorClient: () => ({ + persistDecisionEvent: vi.fn().mockResolvedValue(undefined), + flush: vi.fn().mockResolvedValue(undefined), + }), + createTelemetryEmitter: () => ({ + emitInvoked: vi.fn(), + emitCompleted: vi.fn(), + emitDecision: vi.fn(), + emitError: vi.fn(), + emitValidationFailed: vi.fn(), + emitConstraintApplied: vi.fn(), + flush: vi.fn().mockResolvedValue(undefined), + }), +})); + describe('Golden Dataset Validator Agent', () => { describe('Agent Metadata', () => { it('should have correct agent_id', () => { @@ -282,12 +298,8 @@ describe('Golden Dataset Validator Agent', () => { it('should include response headers', async () => { const input: GoldenDatasetValidatorInput = { - golden_samples: [ - { sample_id: 'header-1', input: 'Test', golden_output: 'Test' }, - ], - model_outputs: [ - { sample_id: 'header-1', model_output: 'Test' }, - ], + golden_samples: [{ sample_id: 'header-1', input: 'Test', golden_output: 'Test' }], + model_outputs: [{ sample_id: 'header-1', model_output: 'Test' }], }; const request: EdgeFunctionRequest = { @@ -299,18 +311,16 @@ describe('Golden Dataset Validator Agent', () => { const response = await handler(request); expect(response.headers['X-Agent-Id']).toBe(GOLDEN_DATASET_VALIDATOR_AGENT.agent_id); - expect(response.headers['X-Agent-Version']).toBe(GOLDEN_DATASET_VALIDATOR_AGENT.agent_version); + expect(response.headers['X-Agent-Version']).toBe( + GOLDEN_DATASET_VALIDATOR_AGENT.agent_version, + ); expect(response.headers['X-Decision-Id']).toBeDefined(); }); it('should handle case-insensitive matching', async () => { const input: GoldenDatasetValidatorInput = { - golden_samples: [ - { sample_id: 'case-1', input: 'Test', golden_output: 'HELLO WORLD' }, - ], - model_outputs: [ - { sample_id: 'case-1', model_output: 'hello world' }, - ], + golden_samples: [{ sample_id: 'case-1', input: 'Test', golden_output: 'HELLO WORLD' }], + model_outputs: [{ sample_id: 'case-1', model_output: 'hello world' }], validation_config: { case_insensitive: true, }, @@ -335,12 +345,8 @@ describe('Golden Dataset Validator Agent', () => { describe('Output Validation', () => { it('should produce valid output schema', async () => { const input: GoldenDatasetValidatorInput = { - golden_samples: [ - { sample_id: 'schema-1', input: 'Test', golden_output: 'Output' }, - ], - model_outputs: [ - { sample_id: 'schema-1', model_output: 'Output' }, - ], + golden_samples: [{ sample_id: 'schema-1', input: 'Test', golden_output: 'Output' }], + model_outputs: [{ sample_id: 'schema-1', model_output: 'Output' }], dataset: { name: 'schema-test', version: '1.0', @@ -364,12 +370,8 @@ describe('Golden Dataset Validator Agent', () => { it('should include quality assessment', async () => { const input: GoldenDatasetValidatorInput = { - golden_samples: [ - { sample_id: 'qa-1', input: 'Test', golden_output: 'Output' }, - ], - model_outputs: [ - { sample_id: 'qa-1', model_output: 'Output' }, - ], + golden_samples: [{ sample_id: 'qa-1', input: 'Test', golden_output: 'Output' }], + model_outputs: [{ sample_id: 'qa-1', model_output: 'Output' }], }; const request: EdgeFunctionRequest = { @@ -426,7 +428,7 @@ describe('Golden Dataset Validator Agent', () => { golden_output: `Answer ${i}`, })); - const modelOutputs = goldenSamples.map(s => ({ + const modelOutputs = goldenSamples.map((s) => ({ sample_id: s.sample_id, model_output: s.golden_output, })); diff --git a/agents/hallucination-detector/handler.ts b/agents/hallucination-detector/handler.ts index 6b6bdbd..ad162f6 100644 --- a/agents/hallucination-detector/handler.ts +++ b/agents/hallucination-detector/handler.ts @@ -29,13 +29,14 @@ import { hashInputs, getAgentIdentity, sanitizeConfidence, + HallucinationDetectorInputSchema as PublicInputSchema, + DetectionConfigSchema as PublicDetectionConfigSchema, + type HallucinationDetectorInput as PublicInput, + type HallucinationDetectorOutput as PublicOutput, + type DetectionConfig as PublicDetectionConfig, } from '../contracts'; -import { - getRuVectorClient, - createTelemetryEmitter, - TelemetryEmitter, -} from '../services'; +import { getRuVectorClient, createTelemetryEmitter, TelemetryEmitter } from '../services'; // ============================================================================= // AGENT METADATA @@ -105,15 +106,17 @@ export const ReferenceContextSchema = z.object({ content: z.string().min(1), /** Type of reference material */ - content_type: z.enum([ - 'document', - 'knowledge_base', - 'api_response', - 'database_result', - 'user_provided', - 'web_source', - 'other', - ]).default('document'), + content_type: z + .enum([ + 'document', + 'knowledge_base', + 'api_response', + 'database_result', + 'user_provided', + 'web_source', + 'other', + ]) + .default('document'), /** Optional: title or name of the reference */ title: z.string().optional(), @@ -191,12 +194,12 @@ export type HallucinationDetectorInput = z.infer; @@ -329,11 +332,13 @@ export const HallucinationDetectorOutputSchema = z.object({ stats: DetectionStatsSchema, /** Reference contexts used */ - references_used: z.array(z.object({ - reference_id: z.string(), - title: z.string().optional(), - content_type: z.string(), - })), + references_used: z.array( + z.object({ + reference_id: z.string(), + title: z.string().optional(), + content_type: z.string(), + }), + ), /** Detection configuration used */ detection_config_used: DetectionConfigSchema, @@ -358,11 +363,15 @@ export const HallucinationDetectorDecisionEventSchema = z.object({ inputs_summary: z.record(z.unknown()).optional(), outputs: HallucinationDetectorOutputSchema, confidence: z.number().min(0).max(1), - confidence_factors: z.array(z.object({ - factor: z.string(), - weight: z.number().min(0).max(1), - value: z.number().min(0).max(1), - })).optional(), + confidence_factors: z + .array( + z.object({ + factor: z.string(), + weight: z.number().min(0).max(1), + value: z.number().min(0).max(1), + }), + ) + .optional(), constraints_applied: z.array(z.string()), execution_ref: z.object({ execution_id: z.string().uuid(), @@ -374,19 +383,21 @@ export const HallucinationDetectorDecisionEventSchema = z.object({ duration_ms: z.number().nonnegative(), }); -export type HallucinationDetectorDecisionEvent = z.infer; +export type HallucinationDetectorDecisionEvent = z.infer< + typeof HallucinationDetectorDecisionEventSchema +>; // ============================================================================= // CONSTRAINTS // ============================================================================= export const VALID_CONSTRAINTS = [ - 'max_claims_exceeded', // Claim count exceeded limit - 'timeout_exceeded', // Processing timeout reached + 'max_claims_exceeded', // Claim count exceeded limit + 'timeout_exceeded', // Processing timeout reached 'semantic_analysis_unavailable', // Embeddings not available - 'reference_context_empty', // Reference context has no usable content + 'reference_context_empty', // Reference context has no usable content 'low_confidence_classification', // Classification confidence below threshold - 'partial_analysis_only', // Some claims could not be fully analyzed + 'partial_analysis_only', // Some claims could not be fully analyzed ] as const; // ============================================================================= @@ -399,9 +410,7 @@ export const VALID_CONSTRAINTS = [ * This is the main entry point for the agent. * Deployed as a Google Cloud Edge Function. */ -export async function handler( - request: EdgeFunctionRequest -): Promise { +export async function handler(request: EdgeFunctionRequest): Promise { const executionId = randomUUID(); const startedAt = new Date(); @@ -409,7 +418,7 @@ export async function handler( const telemetry = createTelemetryEmitter( HALLUCINATION_DETECTOR_AGENT.agent_id, HALLUCINATION_DETECTOR_AGENT.agent_version, - executionId + executionId, ); const context: ExecutionContext = { @@ -429,28 +438,38 @@ export async function handler( } // Parse and validate input - const inputValidation = validateInput(HallucinationDetectorInputSchema, request.body); + const inputValidation = validateInput(PublicInputSchema, request.body); if (!inputValidation.success) { - telemetry.emitValidationFailed('input', (inputValidation as { success: false; error: AgentError }).error.message); + telemetry.emitValidationFailed( + 'input', + (inputValidation as { success: false; error: AgentError }).error.message, + ); await telemetry.flush(); - return createErrorResponse(400, 'Validation Error', (inputValidation as { success: false; error: AgentError }).error); + return createErrorResponse( + 400, + 'Validation Error', + (inputValidation as { success: false; error: AgentError }).error, + ); } - const input = inputValidation.data; + const publicInput = inputValidation.data; + const publicConfig = PublicDetectionConfigSchema.parse(publicInput.detection_config ?? {}); + const input = normalizePublicInput(publicInput, publicConfig); // Execute hallucination detection - const output = await detectHallucinations(input, context); + const internalOutput = await detectHallucinations(input, context); + const output = toPublicOutput(internalOutput, publicInput, publicConfig); // Calculate confidence - const overallConfidence = calculateOverallConfidence(output); + const overallConfidence = calculateOverallConfidence(internalOutput); // Create DecisionEvent const decisionEvent = await createDecisionEvent( - input, + publicInput, output, overallConfidence, - context + context, ); // Persist DecisionEvent (async, non-blocking) @@ -461,8 +480,9 @@ export async function handler( telemetry.emitDecision(decisionEvent.decision_id, overallConfidence); telemetry.emitCompleted({ duration_ms: Date.now() - startedAt.getTime(), - success_count: output.stats.total_claims - output.stats.hallucinations_detected, - failure_count: output.stats.hallucinations_detected, + success_count: + internalOutput.stats.total_claims - internalOutput.stats.hallucinations_detected, + failure_count: internalOutput.stats.hallucinations_detected, }); // Flush telemetry @@ -470,7 +490,6 @@ export async function handler( // Return success response return createSuccessResponse(output, decisionEvent.decision_id); - } catch (err) { // Handle unexpected errors const error = err instanceof Error ? err : new Error(String(err)); @@ -487,13 +506,168 @@ export async function handler( } } +function normalizePublicInput( + input: PublicInput, + config: PublicDetectionConfig, +): HallucinationDetectorInput { + const claims = input.claim + ? [{ claim_id: 'claim-1', claim_text: input.claim }] + : (input.claims ?? []).map((claim) => ({ + claim_id: claim.claim_id, + claim_text: claim.text, + metadata: claim.metadata, + })); + + const references = + typeof input.reference_context === 'string' + ? [ + { + reference_id: 'reference-1', + content: input.reference_context, + content_type: 'user_provided' as const, + }, + ] + : input.reference_context.map((reference) => ({ + reference_id: reference.source_id, + content: reference.content, + content_type: normalizeReferenceType(reference.source_type), + metadata: reference.metadata, + })); + + const similarityThreshold = + config.sensitivity === 'high' + ? Math.max(config.confidence_threshold, 0.8) + : config.sensitivity === 'low' + ? Math.min(config.confidence_threshold, 0.6) + : config.confidence_threshold; + + return { + claims, + reference_contexts: references, + detection_config: { + similarity_threshold: similarityThreshold, + enable_semantic_analysis: config.methods.includes('semantic_similarity'), + enable_keyword_matching: true, + enable_contradiction_detection: config.detect_types.includes('contradiction'), + case_sensitive: false, + max_claims: 100, + timeout_ms: 30000, + include_detailed_analysis: true, + }, + caller_id: input.caller_id, + correlation_id: input.correlation_id, + }; +} + +function normalizeReferenceType( + sourceType: + | 'document' + | 'webpage' + | 'database' + | 'api_response' + | 'knowledge_base' + | 'transcript' + | 'other' + | undefined, +): ReferenceContext['content_type'] { + switch (sourceType) { + case 'database': + return 'database_result'; + case 'webpage': + return 'web_source'; + case 'transcript': + return 'other'; + default: + return sourceType ?? 'document'; + } +} + +function toPublicOutput( + output: HallucinationDetectorOutput, + input: PublicInput, + config: PublicDetectionConfig, +): PublicOutput { + const byConfidence = output.results.reduce( + (counts, result) => { + if (result.confidence >= 0.8) counts.high += 1; + else if (result.confidence >= 0.5) counts.medium += 1; + else counts.low += 1; + return counts; + }, + { high: 0, medium: 0, low: 0 }, + ); + + const referenceSources = + typeof input.reference_context === 'string' + ? [{ source_id: 'reference-1', content: input.reference_context }] + : input.reference_context; + + return { + execution_id: output.detection_id, + total_claims: output.stats.total_claims, + hallucinated_claims: output.stats.hallucinations_detected, + verified_claims: output.stats.total_claims - output.stats.hallucinations_detected, + overall_hallucination_rate: output.stats.hallucination_rate, + results: output.results.map((result) => ({ + claim_id: result.claim_id, + claim_text: result.claim_text, + is_hallucination: result.is_hallucination, + hallucination_type: + result.hallucination_type === null + ? 'none' + : result.hallucination_type === 'partial_support' + ? 'unsupported' + : result.hallucination_type, + confidence: result.confidence, + supporting_evidence: result.evidence + .filter((evidence) => !evidence.is_contradictory) + .map((evidence) => ({ + source_id: evidence.reference_id, + excerpt: evidence.relevant_excerpt ?? '', + relevance_score: evidence.similarity_score, + })), + contradicting_evidence: result.evidence + .filter((evidence) => evidence.is_contradictory) + .map((evidence) => ({ + source_id: evidence.reference_id, + excerpt: evidence.relevant_excerpt ?? '', + relevance_score: evidence.similarity_score, + })), + explanation: result.summary, + method_scores: { semantic_similarity: result.support_score }, + })), + summary: { + by_type: { + fabrication: output.stats.by_type.fabrication, + exaggeration: output.stats.by_type.exaggeration, + misattribution: output.stats.by_type.misattribution, + contradiction: output.stats.by_type.contradiction, + unsupported: output.stats.by_type.unsupported + output.stats.by_type.partial_support, + }, + by_confidence: byConfidence, + }, + detection_config: config, + reference_stats: { + total_sources: referenceSources.length, + total_characters: referenceSources.reduce( + (total, reference) => total + reference.content.length, + 0, + ), + sources_used: referenceSources.map((reference) => reference.source_id), + }, + started_at: output.started_at, + completed_at: output.completed_at, + total_duration_ms: output.duration_ms, + }; +} + // ============================================================================= // CORE DETECTION LOGIC // ============================================================================= async function detectHallucinations( input: HallucinationDetectorInput, - context: ExecutionContext + context: ExecutionContext, ): Promise { const config = input.detection_config ?? { similarity_threshold: 0.7, @@ -516,7 +690,7 @@ async function detectHallucinations( context.constraintsApplied.push('max_claims_exceeded'); context.telemetry.emitConstraintApplied( 'max_claims_exceeded', - `Processing ${config.max_claims} of ${input.claims.length} claims` + `Processing ${config.max_claims} of ${input.claims.length} claims`, ); } @@ -531,7 +705,7 @@ async function detectHallucinations( context.constraintsApplied.push('timeout_exceeded'); context.telemetry.emitConstraintApplied( 'timeout_exceeded', - `Elapsed: ${elapsed}ms, Max: ${config.timeout_ms}ms` + `Elapsed: ${elapsed}ms, Max: ${config.timeout_ms}ms`, ); break; } @@ -540,7 +714,7 @@ async function detectHallucinations( claim, preprocessedRefs, input.reference_contexts, - config + config, ); results.push(result); @@ -556,7 +730,7 @@ async function detectHallucinations( detection_id: context.executionId, results, stats, - references_used: input.reference_contexts.map(ref => ({ + references_used: input.reference_contexts.map((ref) => ({ reference_id: ref.reference_id, title: ref.title, content_type: ref.content_type, @@ -580,22 +754,16 @@ interface PreprocessedReference { function preprocessReferenceContexts( references: ReferenceContext[], - config: DetectionConfig + config: DetectionConfig, ): PreprocessedReference[] { - return references.map(ref => { - const normalizedContent = config.case_sensitive - ? ref.content - : ref.content.toLowerCase(); + return references.map((ref) => { + const normalizedContent = config.case_sensitive ? ref.content : ref.content.toLowerCase(); // Extract keywords (simple word tokenization) - const keywords = new Set( - normalizedContent - .split(/\W+/) - .filter(word => word.length > 2) - ); + const keywords = new Set(normalizedContent.split(/\W+/).filter((word) => word.length > 2)); // Split into sentences - const sentences = ref.content.split(/[.!?]+/).filter(s => s.trim().length > 0); + const sentences = ref.content.split(/[.!?]+/).filter((s) => s.trim().length > 0); return { reference_id: ref.reference_id, @@ -611,21 +779,17 @@ async function analyzeClaimAgainstContext( claim: Claim, preprocessedRefs: PreprocessedReference[], originalRefs: ReferenceContext[], - config: DetectionConfig + config: DetectionConfig, ): Promise { const evidence: Evidence[] = []; let bestSimilarity = 0; let bestMatchingRef: string | null = null; let hasContradiction = false; - const normalizedClaim = config.case_sensitive - ? claim.claim_text - : claim.claim_text.toLowerCase(); + const normalizedClaim = config.case_sensitive ? claim.claim_text : claim.claim_text.toLowerCase(); // Extract keywords from claim - const claimKeywords = new Set( - normalizedClaim.split(/\W+/).filter(word => word.length > 2) - ); + const claimKeywords = new Set(normalizedClaim.split(/\W+/).filter((word) => word.length > 2)); // Analyze against each reference for (const ref of preprocessedRefs) { @@ -634,7 +798,7 @@ async function analyzeClaimAgainstContext( const unmatchedKeywords: string[] = []; if (config.enable_keyword_matching) { - Array.from(claimKeywords).forEach(keyword => { + Array.from(claimKeywords).forEach((keyword) => { if (ref.keywords.has(keyword)) { matchedKeywords.push(keyword); } else { @@ -644,9 +808,8 @@ async function analyzeClaimAgainstContext( } // Calculate similarity score - const keywordSimilarity = claimKeywords.size > 0 - ? matchedKeywords.length / claimKeywords.size - : 0; + const keywordSimilarity = + claimKeywords.size > 0 ? matchedKeywords.length / claimKeywords.size : 0; // Semantic similarity (simplified - would use embeddings in production) let semanticSimilarity = 0; @@ -655,8 +818,10 @@ async function analyzeClaimAgainstContext( } // Combined similarity + // Exact keyword coverage is strong entailment evidence and must not be + // diluted merely because the reference contains additional context. const similarityScore = config.enable_semantic_analysis - ? (keywordSimilarity * 0.4 + semanticSimilarity * 0.6) + ? Math.max(keywordSimilarity, semanticSimilarity) : keywordSimilarity; // Find most relevant excerpt @@ -679,7 +844,12 @@ async function analyzeClaimAgainstContext( matched_keywords: matchedKeywords.length > 0 ? matchedKeywords : undefined, unmatched_keywords: unmatchedKeywords.length > 0 ? unmatchedKeywords : undefined, is_contradictory: isContradictory, - explanation: generateExplanation(similarityScore, matchedKeywords, unmatchedKeywords, isContradictory), + explanation: generateExplanation( + similarityScore, + matchedKeywords, + unmatchedKeywords, + isContradictory, + ), }); // Track best match @@ -694,7 +864,7 @@ async function analyzeClaimAgainstContext( bestSimilarity, hasContradiction, evidence, - config.similarity_threshold + config.similarity_threshold, ); // Calculate confidence for this classification @@ -738,7 +908,7 @@ function calculateSemanticSimilarity(text1: string, text2: string): number { if (ngrams1.size === 0 || ngrams2.size === 0) return 0; let intersection = 0; - Array.from(ngrams1).forEach(gram => { + Array.from(ngrams1).forEach((gram) => { if (ngrams2.has(gram)) { intersection++; } @@ -789,8 +959,8 @@ function detectContradiction(claim: string, reference: string): boolean { /\bweren't\b/, ]; - const claimHasNegation = negationPatterns.some(p => p.test(claim)); - const refHasNegation = negationPatterns.some(p => p.test(reference)); + const claimHasNegation = negationPatterns.some((p) => p.test(claim)); + const refHasNegation = negationPatterns.some((p) => p.test(reference)); // Very simplified: if claim has negation but reference doesn't (or vice versa) // and they share significant content, might be a contradiction @@ -800,14 +970,49 @@ function detectContradiction(claim: string, reference: string): boolean { return similarity > 0.3; // Threshold for considering it a potential contradiction } - return false; + const claimTokens = new Set(claim.match(/[a-z0-9]+/g) ?? []); + const referenceTokens = new Set(reference.match(/[a-z0-9]+/g) ?? []); + const sharedTerms = [...claimTokens].filter( + (token) => token.length > 2 && referenceTokens.has(token), + ); + + // Conflicting quantities are contradictory when both statements describe + // the same subject. This catches dates, temperatures, counts, and rates. + const claimNumbers = [...claimTokens].filter((token) => /^\d+(?:\.\d+)?$/.test(token)); + const referenceNumbers = [...referenceTokens].filter((token) => /^\d+(?:\.\d+)?$/.test(token)); + if ( + sharedTerms.length >= 2 && + claimNumbers.length > 0 && + referenceNumbers.length > 0 && + !claimNumbers.some((number) => referenceNumbers.includes(number)) + ) { + return true; + } + + const opposingTerms = [ + ['won', 'defeated'], + ['won', 'lost'], + ['increase', 'decrease'], + ['increased', 'decreased'], + ['higher', 'lower'], + ['true', 'false'], + ] as const; + + return ( + sharedTerms.length >= 2 && + opposingTerms.some( + ([left, right]) => + (claimTokens.has(left) && referenceTokens.has(right)) || + (claimTokens.has(right) && referenceTokens.has(left)), + ) + ); } function generateExplanation( similarity: number, matched: string[], unmatched: string[], - isContradictory: boolean + isContradictory: boolean, ): string { const parts: string[] = []; @@ -845,7 +1050,7 @@ function classifyHallucination( bestSimilarity: number, hasContradiction: boolean, evidence: Evidence[], - threshold: number + threshold: number, ): Classification { // Priority 1: Contradiction if (hasContradiction) { @@ -880,12 +1085,13 @@ function classifyHallucination( } // Priority 5: Exaggeration check (high similarity but with unmatched content) - const avgUnmatchedRatio = evidence.reduce((sum, e) => { - const unmatched = e.unmatched_keywords?.length ?? 0; - const matched = e.matched_keywords?.length ?? 0; - const total = matched + unmatched; - return sum + (total > 0 ? unmatched / total : 0); - }, 0) / evidence.length; + const avgUnmatchedRatio = + evidence.reduce((sum, e) => { + const unmatched = e.unmatched_keywords?.length ?? 0; + const matched = e.matched_keywords?.length ?? 0; + const total = matched + unmatched; + return sum + (total > 0 ? unmatched / total : 0); + }, 0) / evidence.length; if (bestSimilarity >= threshold && avgUnmatchedRatio > 0.4) { return { @@ -909,11 +1115,12 @@ function calculateClaimConfidence(evidence: Evidence[], classification: Classifi // 2. Similarity scores are consistent // 3. Classification is clear-cut - const similarities = evidence.map(e => e.similarity_score); + const similarities = evidence.map((e) => e.similarity_score); const avgSimilarity = similarities.reduce((a, b) => a + b, 0) / similarities.length; // Variance in similarity scores (lower = more confident) - const variance = similarities.reduce((sum, s) => sum + Math.pow(s - avgSimilarity, 2), 0) / similarities.length; + const variance = + similarities.reduce((sum, s) => sum + Math.pow(s - avgSimilarity, 2), 0) / similarities.length; const consistencyScore = 1 - Math.min(1, variance * 4); // Classification clarity @@ -936,16 +1143,15 @@ function calculateClaimConfidence(evidence: Evidence[], classification: Classifi const referenceFactor = Math.min(1, evidence.length / 3); // Weighted combination - return Math.min(1, Math.max(0, - consistencyScore * 0.3 + - clarityScore * 0.5 + - referenceFactor * 0.2 - )); + return Math.min( + 1, + Math.max(0, consistencyScore * 0.3 + clarityScore * 0.5 + referenceFactor * 0.2), + ); } function determineSeverity( type: HallucinationTypeValue, - supportScore: number + supportScore: number, ): 'low' | 'medium' | 'high' | 'critical' { // Severity based on type and support score if (type === 'contradiction') { @@ -975,7 +1181,7 @@ function determineSeverity( function generateSummary( classification: Classification, similarity: number, - bestRef: string | null + bestRef: string | null, ): string { if (!classification.isHallucination) { return `Claim is supported by reference context with ${(similarity * 100).toFixed(0)}% confidence.`; @@ -1022,9 +1228,9 @@ function calculateDetectionStats(results: HallucinationClaimResult[]): Detection }; } - const hallucinations = results.filter(r => r.is_hallucination); - const fullySupported = results.filter(r => !r.is_hallucination && r.support_score >= 0.7); - const partiallySupported = results.filter(r => !r.is_hallucination && r.support_score < 0.7); + const hallucinations = results.filter((r) => r.is_hallucination); + const fullySupported = results.filter((r) => !r.is_hallucination && r.support_score >= 0.7); + const partiallySupported = results.filter((r) => !r.is_hallucination && r.support_score < 0.7); const byType = { fabrication: 0, @@ -1112,7 +1318,8 @@ function calculateOverallConfidence(output: HallucinationDetectorOutput): number // Classification consistency (inverse of hallucination rate variance from extreme) // Higher confidence when results are clearly hallucinated or clearly not const hallucinationRate = output.stats.hallucination_rate; - const consistencyValue = 1 - 4 * Math.abs(hallucinationRate - 0.5) * Math.abs(hallucinationRate - 0.5); + const consistencyValue = + 1 - 4 * Math.abs(hallucinationRate - 0.5) * Math.abs(hallucinationRate - 0.5); // This peaks at 0 and 1, lowest at 0.5 (most uncertain) factors.push({ factor: 'classification_consistency', @@ -1128,10 +1335,7 @@ function calculateOverallConfidence(output: HallucinationDetectorOutput): number }); // Calculate weighted confidence - const confidence = factors.reduce( - (sum, f) => sum + f.weight * f.value, - 0 - ); + const confidence = factors.reduce((sum, f) => sum + f.weight * f.value, 0); return Math.min(1, Math.max(0, confidence)); } @@ -1141,10 +1345,10 @@ function calculateOverallConfidence(output: HallucinationDetectorOutput): number // ============================================================================= async function createDecisionEvent( - input: HallucinationDetectorInput, - output: HallucinationDetectorOutput, + input: PublicInput, + output: PublicOutput, confidence: number, - context: ExecutionContext + context: ExecutionContext, ): Promise { const inputsHash = await hashInputs(input); @@ -1156,15 +1360,33 @@ async function createDecisionEvent( decision_id: randomUUID(), inputs_hash: inputsHash, inputs_summary: { - total_claims: input.claims.length, - reference_count: input.reference_contexts.length, + total_claims: input.claim ? 1 : (input.claims?.length ?? 0), + reference_count: + typeof input.reference_context === 'string' ? 1 : input.reference_context.length, }, outputs: output, confidence: sanitizeConfidence(confidence), confidence_factors: [ - { factor: 'sample_size', weight: 0.2, value: sanitizeConfidence(Math.min(1, Math.log10(output.results.length + 1) / 2)) }, - { factor: 'reference_coverage', weight: 0.25, value: sanitizeConfidence(Math.min(1, output.references_used.length / 5)) }, - { factor: 'avg_claim_confidence', weight: 0.3, value: sanitizeConfidence(output.stats.avg_confidence) }, + { + factor: 'sample_size', + weight: 0.2, + value: sanitizeConfidence(Math.min(1, Math.log10(output.results.length + 1) / 2)), + }, + { + factor: 'reference_coverage', + weight: 0.25, + value: sanitizeConfidence(Math.min(1, (output.reference_stats?.total_sources ?? 0) / 5)), + }, + { + factor: 'avg_claim_confidence', + weight: 0.3, + value: sanitizeConfidence( + output.results.length > 0 + ? output.results.reduce((sum, result) => sum + result.confidence, 0) / + output.results.length + : 0, + ), + }, ], constraints_applied: context.constraintsApplied, execution_ref: { @@ -1179,10 +1401,7 @@ async function createDecisionEvent( // RESPONSE HELPERS // ============================================================================= -function createSuccessResponse( - output: HallucinationDetectorOutput, - decisionId: string -): EdgeFunctionResponse { +function createSuccessResponse(output: PublicOutput, decisionId: string): EdgeFunctionResponse { return { statusCode: 200, headers: { @@ -1202,7 +1421,7 @@ function createSuccessResponse( function createErrorResponse( statusCode: number, message: string, - error?: AgentError + error?: AgentError, ): EdgeFunctionResponse { return { statusCode, diff --git a/agents/hallucination-detector/tests/smoke.test.ts b/agents/hallucination-detector/tests/smoke.test.ts index 2585591..8afd558 100644 --- a/agents/hallucination-detector/tests/smoke.test.ts +++ b/agents/hallucination-detector/tests/smoke.test.ts @@ -4,7 +4,7 @@ * Verification checklist and smoke tests for the hallucination-detector agent. */ -import { describe, it, expect, beforeAll } from 'vitest'; +import { describe, it, expect, beforeAll, vi } from 'vitest'; import { handler, HALLUCINATION_DETECTOR_AGENT, @@ -12,6 +12,22 @@ import { HallucinationDetectorOutputSchema, } from '../index'; +vi.mock('../../services', () => ({ + getRuVectorClient: () => ({ + persistDecisionEvent: vi.fn().mockResolvedValue(undefined), + flush: vi.fn().mockResolvedValue(undefined), + }), + createTelemetryEmitter: () => ({ + emitInvoked: vi.fn(), + emitCompleted: vi.fn(), + emitDecision: vi.fn(), + emitError: vi.fn(), + emitValidationFailed: vi.fn(), + emitConstraintApplied: vi.fn(), + flush: vi.fn().mockResolvedValue(undefined), + }), +})); + // ============================================================================= // VERIFICATION CHECKLIST // ============================================================================= @@ -137,14 +153,15 @@ describe('Hallucination Detector Agent', () => { const response = await handler({ body: { claim: 'Napoleon won the Battle of Waterloo', - reference_context: 'Napoleon was defeated at the Battle of Waterloo in 1815 by the Duke of Wellington.', + reference_context: + 'Napoleon was defeated at the Battle of Waterloo in 1815 by the Duke of Wellington.', }, headers: {}, method: 'POST', path: '/api/v1/agents/hallucination-detector', }); - expect(response.statusCode).toBe(200); + expect(response.statusCode, response.body).toBe(200); const body = JSON.parse(response.body); expect(body.success).toBe(true); expect(body.decision_id).toBeDefined(); @@ -158,7 +175,8 @@ describe('Hallucination Detector Agent', () => { const response = await handler({ body: { claim: 'The Earth orbits the Sun', - reference_context: 'The Earth orbits the Sun once every 365.25 days. This is known as a solar year.', + reference_context: + 'The Earth orbits the Sun once every 365.25 days. This is known as a solar year.', }, headers: {}, method: 'POST', @@ -239,7 +257,8 @@ describe('Hallucination Detector Agent', () => { { claim_id: 'c2', text: 'Python was invented in 1850' }, { claim_id: 'c3', text: 'Python uses indentation for code blocks' }, ], - reference_context: 'Python is a high-level programming language created by Guido van Rossum in 1991. It uses indentation to define code blocks.', + reference_context: + 'Python is a high-level programming language created by Guido van Rossum in 1991. It uses indentation to define code blocks.', }, headers: {}, method: 'POST', diff --git a/agents/output-consistency/handler.ts b/agents/output-consistency/handler.ts index 8691b98..749f00c 100644 --- a/agents/output-consistency/handler.ts +++ b/agents/output-consistency/handler.ts @@ -20,7 +20,7 @@ * Part of: LLM-Test-Bench unified GCP service */ -import { randomUUID } from 'crypto'; +import { randomUUID, webcrypto } from 'crypto'; import { // Contracts OutputConsistencyInputSchema, @@ -51,11 +51,7 @@ import { SimilarityMethod, } from '../contracts'; -import { - getRuVectorClient, - createTelemetryEmitter, - TelemetryEmitter, -} from '../services'; +import { getRuVectorClient, createTelemetryEmitter, TelemetryEmitter } from '../services'; // ============================================================================= // TYPES @@ -91,9 +87,7 @@ interface ExecutionContext { * This is the main entry point for the agent. * Deployed as a Google Cloud Edge Function. */ -export async function handler( - request: EdgeFunctionRequest -): Promise { +export async function handler(request: EdgeFunctionRequest): Promise { const executionId = randomUUID(); const startedAt = new Date(); @@ -101,7 +95,7 @@ export async function handler( const telemetry = createTelemetryEmitter( OUTPUT_CONSISTENCY_AGENT.agent_id, OUTPUT_CONSISTENCY_AGENT.agent_version, - executionId + executionId, ); const context: ExecutionContext = { @@ -151,13 +145,7 @@ export async function handler( const { confidence, factors } = calculateConsistencyConfidence(output, config); // Create DecisionEvent - const decisionEvent = await createDecisionEvent( - input, - output, - confidence, - factors, - context - ); + const decisionEvent = await createDecisionEvent(input, output, confidence, factors, context); // Persist DecisionEvent (async, non-blocking) const ruVectorClient = getRuVectorClient(); @@ -176,7 +164,6 @@ export async function handler( // Return success response return createSuccessResponse(output, decisionEvent.decision_id); - } catch (err) { // Handle unexpected errors const error = err instanceof Error ? err : new Error(String(err)); @@ -199,7 +186,7 @@ export async function handler( async function executeConsistencyAnalysis( input: OutputConsistencyInput, - context: ExecutionContext + context: ExecutionContext, ): Promise { const config: ConsistencyConfig = { similarity_method: 'jaccard_tokens', @@ -221,7 +208,7 @@ async function executeConsistencyAnalysis( context.constraintsApplied.push('max_groups_exceeded'); context.telemetry.emitConstraintApplied( 'max_groups_exceeded', - `Received ${groups.length} groups, max is 500` + `Received ${groups.length} groups, max is 500`, ); } @@ -263,30 +250,31 @@ async function executeConsistencyAnalysis( async function analyzeGroup( group: PromptExecutionGroup, config: ConsistencyConfig, - context: ExecutionContext + context: ExecutionContext, ): Promise { const outputs = group.outputs; // Normalize all outputs - const normalizedOutputs = outputs.map(o => normalizeContent(o.content, config)); + const normalizedOutputs = outputs.map((o) => normalizeContent(o.content, config)); // Check for identical outputs - const allIdentical = normalizedOutputs.every(o => o === normalizedOutputs[0]); + const allIdentical = normalizedOutputs.every((o) => o === normalizedOutputs[0]); if (allIdentical) { context.constraintsApplied.push('identical_outputs_detected'); context.telemetry.emitConstraintApplied( 'identical_outputs_detected', - `All ${outputs.length} outputs in group ${group.group_id} are identical` + `All ${outputs.length} outputs in group ${group.group_id} are identical`, ); } // Check for very short outputs - const avgLength = normalizedOutputs.reduce((sum, o) => sum + o.length, 0) / normalizedOutputs.length; + const avgLength = + normalizedOutputs.reduce((sum, o) => sum + o.length, 0) / normalizedOutputs.length; if (avgLength < 10) { context.constraintsApplied.push('outputs_too_short'); context.telemetry.emitConstraintApplied( 'outputs_too_short', - `Average output length is ${avgLength.toFixed(1)} characters` + `Average output length is ${avgLength.toFixed(1)} characters`, ); } @@ -330,14 +318,14 @@ async function analyzeGroup( context.constraintsApplied.push('pairwise_matrix_too_large'); context.telemetry.emitConstraintApplied( 'pairwise_matrix_too_large', - `${normalizedOutputs.length} outputs would produce ${(normalizedOutputs.length * (normalizedOutputs.length - 1)) / 2} pairs` + `${normalizedOutputs.length} outputs would produce ${(normalizedOutputs.length * (normalizedOutputs.length - 1)) / 2} pairs`, ); } // Find representative and most divergent outputs const { representativeIndex, divergentIndex, maxDivergence } = findOutliers( normalizedOutputs, - config + config, ); // Compute prompt hash @@ -387,7 +375,7 @@ function normalizeContent(content: string, config: ConsistencyConfig): string { function computeSimilarity( outputs: string[], method: SimilarityMethod, - config: ConsistencyConfig + config: ConsistencyConfig, ): number { if (outputs.length < 2) return 1.0; @@ -421,7 +409,7 @@ function computeSimilarity( function computeExactMatchSimilarity(outputs: string[]): number { const first = outputs[0]; - const allMatch = outputs.every(o => o === first); + const allMatch = outputs.every((o) => o === first); return allMatch ? 1.0 : 0.0; } @@ -460,9 +448,9 @@ function levenshteinDistance(a: string, b: string): number { for (let j = 1; j <= n; j++) { const cost = a[i - 1] === b[j - 1] ? 0 : 1; curr[j] = Math.min( - prev[j] + 1, // deletion - curr[j - 1] + 1, // insertion - prev[j - 1] + cost // substitution + prev[j] + 1, // deletion + curr[j - 1] + 1, // insertion + prev[j - 1] + cost, // substitution ); } [prev, curr] = [curr, prev]; @@ -473,14 +461,14 @@ function levenshteinDistance(a: string, b: string): number { function computeJaccardTokenSimilarity(outputs: string[]): number { // Tokenize all outputs - const tokenSets = outputs.map(o => new Set(o.split(/\s+/).filter(t => t.length > 0))); + const tokenSets = outputs.map((o) => new Set(o.split(/\s+/).filter((t) => t.length > 0))); // Compute intersection and union across all sets const allTokens = new Set(); const tokenCounts = new Map(); for (const tokenSet of tokenSets) { - Array.from(tokenSet).forEach(token => { + Array.from(tokenSet).forEach((token) => { allTokens.add(token); tokenCounts.set(token, (tokenCounts.get(token) ?? 0) + 1); }); @@ -498,13 +486,9 @@ function computeJaccardTokenSimilarity(outputs: string[]): number { return union > 0 ? intersection / union : 1.0; } -function computeNgramSimilarity( - outputs: string[], - n: number, - type: 'char' | 'word' -): number { +function computeNgramSimilarity(outputs: string[], n: number, type: 'char' | 'word'): number { // Generate n-grams for each output - const ngramSets = outputs.map(o => new Set(generateNgrams(o, n, type))); + const ngramSets = outputs.map((o) => new Set(generateNgrams(o, n, type))); // Compute average pairwise Jaccard let totalSimilarity = 0; @@ -514,7 +498,7 @@ function computeNgramSimilarity( for (let j = i + 1; j < ngramSets.length; j++) { const setI = Array.from(ngramSets[i]); const setJ = Array.from(ngramSets[j]); - const intersection = new Set(setI.filter(x => ngramSets[j].has(x))); + const intersection = new Set(setI.filter((x) => ngramSets[j].has(x))); const unionArr = [...setI, ...setJ]; const union = new Set(unionArr); const similarity = union.size > 0 ? intersection.size / union.size : 1; @@ -534,7 +518,7 @@ function generateNgrams(text: string, n: number, type: 'char' | 'word'): string[ ngrams.push(text.slice(i, i + n)); } } else { - const words = text.split(/\s+/).filter(w => w.length > 0); + const words = text.split(/\s+/).filter((w) => w.length > 0); for (let i = 0; i <= words.length - n; i++) { ngrams.push(words.slice(i, i + n).join(' ')); } @@ -545,7 +529,7 @@ function generateNgrams(text: string, n: number, type: 'char' | 'word'): string[ function computeTfidfSimilarity(outputs: string[]): number { // Simple TF-IDF cosine similarity - const documents = outputs.map(o => o.split(/\s+/).filter(t => t.length > 0)); + const documents = outputs.map((o) => o.split(/\s+/).filter((t) => t.length > 0)); // Build vocabulary const vocab = new Set(); @@ -569,7 +553,7 @@ function computeTfidfSimilarity(outputs: string[]): number { const vector: number[] = []; for (const term of vocabArray) { const termFreq = (tf.get(term) ?? 0) / doc.length; - const docsWithTerm = documents.filter(d => d.includes(term)).length; + const docsWithTerm = documents.filter((d) => d.includes(term)).length; const idf = Math.log((docCount + 1) / (docsWithTerm + 1)) + 1; vector.push(termFreq * idf); } @@ -611,20 +595,20 @@ function cosineSimilarity(a: number[], b: number[]): number { // ============================================================================= function computeTokenAnalysis(outputs: string[]): TokenAnalysis { - const tokenCounts = outputs.map(o => o.split(/\s+/).filter(t => t.length > 0).length); - const tokenSets = outputs.map(o => new Set(o.split(/\s+/).filter(t => t.length > 0))); + const tokenCounts = outputs.map((o) => o.split(/\s+/).filter((t) => t.length > 0).length); + const tokenSets = outputs.map((o) => new Set(o.split(/\s+/).filter((t) => t.length > 0))); // Common tokens (intersection) const allTokenSets = tokenSets.slice(); let commonTokens = new Set(Array.from(allTokenSets[0])); for (let i = 1; i < allTokenSets.length; i++) { - commonTokens = new Set(Array.from(commonTokens).filter(x => allTokenSets[i].has(x))); + commonTokens = new Set(Array.from(commonTokens).filter((x) => allTokenSets[i].has(x))); } // Total unique tokens (union) const totalUniqueTokens = new Set(); for (const tokenSet of tokenSets) { - Array.from(tokenSet).forEach(token => { + Array.from(tokenSet).forEach((token) => { totalUniqueTokens.add(token); }); } @@ -644,7 +628,7 @@ function computeTokenAnalysis(outputs: string[]): TokenAnalysis { } function computeCharVariance(outputs: string[]): CharVariance { - const charCounts = outputs.map(o => o.length); + const charCounts = outputs.map((o) => o.length); const avg = mean(charCounts); const std = stddev(charCounts); @@ -670,7 +654,11 @@ function computePairwiseMatrix(outputs: string[], config: ConsistencyConfig): nu for (let i = 0; i < outputs.length; i++) { for (let j = i + 1; j < outputs.length; j++) { - const similarity = computeSimilarity([outputs[i], outputs[j]], config.similarity_method, config); + const similarity = computeSimilarity( + [outputs[i], outputs[j]], + config.similarity_method, + config, + ); similarities.push(similarity); } } @@ -680,7 +668,7 @@ function computePairwiseMatrix(outputs: string[], config: ConsistencyConfig): nu function findOutliers( outputs: string[], - config: ConsistencyConfig + config: ConsistencyConfig, ): { representativeIndex: number; divergentIndex: number; maxDivergence: number } { if (outputs.length < 2) { return { representativeIndex: 0, divergentIndex: 0, maxDivergence: 0 }; @@ -693,7 +681,11 @@ function findOutliers( let totalSimilarity = 0; for (let j = 0; j < outputs.length; j++) { if (i !== j) { - totalSimilarity += computeSimilarity([outputs[i], outputs[j]], config.similarity_method, config); + totalSimilarity += computeSimilarity( + [outputs[i], outputs[j]], + config.similarity_method, + config, + ); } } avgSimilarities.push(totalSimilarity / (outputs.length - 1)); @@ -729,9 +721,12 @@ function findOutliers( async function computePromptHash(prompt: string): Promise { const encoder = new TextEncoder(); const data = encoder.encode(prompt); - const hashBuffer = await crypto.subtle.digest('SHA-256', data); + const hashBuffer = await webcrypto.subtle.digest('SHA-256', data); const hashArray = Array.from(new Uint8Array(hashBuffer)); - return hashArray.map(b => b.toString(16).padStart(2, '0')).join('').slice(0, 16); + return hashArray + .map((b) => b.toString(16).padStart(2, '0')) + .join('') + .slice(0, 16); } // ============================================================================= @@ -754,14 +749,14 @@ function calculateModelStats(results: GroupConsistencyResult[]): ModelConsistenc Array.from(groups.entries()).forEach(([key, groupResults]) => { const [providerName, modelId] = key.split(':'); - const consistencyScores = groupResults.map(r => r.consistency_score).sort((a, b) => a - b); + const consistencyScores = groupResults.map((r) => r.consistency_score).sort((a, b) => a - b); const totalOutputs = groupResults.reduce((sum, r) => sum + r.output_count, 0); // Token variance let avgTokenVariance: number | undefined; const tokenVariances = groupResults - .filter(r => r.token_analysis) - .map(r => r.token_analysis!.cv_token_count); + .filter((r) => r.token_analysis) + .map((r) => r.token_analysis!.cv_token_count); if (tokenVariances.length > 0) { avgTokenVariance = mean(tokenVariances); } @@ -778,8 +773,8 @@ function calculateModelStats(results: GroupConsistencyResult[]): ModelConsistenc p50_consistency_score: percentile(consistencyScores, 50), p95_consistency_score: percentile(consistencyScores, 95), p99_consistency_score: percentile(consistencyScores, 99), - consistent_groups: groupResults.filter(r => r.is_consistent).length, - consistency_rate: groupResults.filter(r => r.is_consistent).length / groupResults.length, + consistent_groups: groupResults.filter((r) => r.is_consistent).length, + consistency_rate: groupResults.filter((r) => r.is_consistent).length / groupResults.length, avg_token_variance: avgTokenVariance, }); }); @@ -790,17 +785,21 @@ function calculateModelStats(results: GroupConsistencyResult[]): ModelConsistenc function calculateSummary( results: GroupConsistencyResult[], modelStats: ModelConsistencyStats[], - config: ConsistencyConfig + config: ConsistencyConfig, ): ConsistencySummary { - const consistencyScores = results.map(r => r.consistency_score); + const consistencyScores = results.map((r) => r.consistency_score); const totalOutputs = results.reduce((sum, r) => sum + r.output_count, 0); // Find most/least consistent models - let mostConsistentModel: { provider_name: string; model_id: string; avg_score: number } | null = null; - let leastConsistentModel: { provider_name: string; model_id: string; avg_score: number } | null = null; + let mostConsistentModel: { provider_name: string; model_id: string; avg_score: number } | null = + null; + let leastConsistentModel: { provider_name: string; model_id: string; avg_score: number } | null = + null; if (modelStats.length > 0) { - const sorted = [...modelStats].sort((a, b) => b.avg_consistency_score - a.avg_consistency_score); + const sorted = [...modelStats].sort( + (a, b) => b.avg_consistency_score - a.avg_consistency_score, + ); mostConsistentModel = { provider_name: sorted[0].provider_name, model_id: sorted[0].model_id, @@ -815,11 +814,11 @@ function calculateSummary( // Calculate distribution const consistencyDistribution = { - highly_consistent: consistencyScores.filter(s => s >= 0.95).length, - consistent: consistencyScores.filter(s => s >= 0.85 && s < 0.95).length, - moderate: consistencyScores.filter(s => s >= 0.70 && s < 0.85).length, - inconsistent: consistencyScores.filter(s => s >= 0.50 && s < 0.70).length, - highly_inconsistent: consistencyScores.filter(s => s < 0.50).length, + highly_consistent: consistencyScores.filter((s) => s >= 0.95).length, + consistent: consistencyScores.filter((s) => s >= 0.85 && s < 0.95).length, + moderate: consistencyScores.filter((s) => s >= 0.7 && s < 0.85).length, + inconsistent: consistencyScores.filter((s) => s >= 0.5 && s < 0.7).length, + highly_inconsistent: consistencyScores.filter((s) => s < 0.5).length, }; return { @@ -827,7 +826,7 @@ function calculateSummary( total_outputs_analyzed: totalOutputs, total_models_evaluated: modelStats.length, overall_avg_consistency: mean(consistencyScores), - overall_consistency_rate: results.filter(r => r.is_consistent).length / results.length, + overall_consistency_rate: results.filter((r) => r.is_consistent).length / results.length, most_consistent_model: mostConsistentModel, least_consistent_model: leastConsistentModel, consistency_distribution: consistencyDistribution, @@ -852,7 +851,7 @@ function mean(values: number[]): number { function stddev(values: number[]): number { if (values.length === 0) return 0; const avg = mean(values); - const squareDiffs = values.map(v => Math.pow(v - avg, 2)); + const squareDiffs = values.map((v) => Math.pow(v - avg, 2)); return Math.sqrt(mean(squareDiffs)); } @@ -865,7 +864,7 @@ async function createDecisionEvent( output: OutputConsistencyOutput, confidence: number, factors: Array<{ factor: string; weight: number; value: number }>, - context: ExecutionContext + context: ExecutionContext, ): Promise { const inputsHash = await hashInputs(input); @@ -883,7 +882,7 @@ async function createDecisionEvent( }, outputs: output, confidence: sanitizeConfidence(confidence), - confidence_factors: factors.map(f => ({ + confidence_factors: factors.map((f) => ({ ...f, value: sanitizeConfidence(f.value), weight: sanitizeConfidence(f.weight), @@ -903,7 +902,7 @@ async function createDecisionEvent( function createSuccessResponse( output: OutputConsistencyOutput, - decisionId: string + decisionId: string, ): EdgeFunctionResponse { return { statusCode: 200, @@ -924,7 +923,7 @@ function createSuccessResponse( function createErrorResponse( statusCode: number, message: string, - error?: AgentError + error?: AgentError, ): EdgeFunctionResponse { return { statusCode, diff --git a/agents/quality-scoring/tests/smoke.test.ts b/agents/quality-scoring/tests/smoke.test.ts index 05209a6..1ca92b7 100644 --- a/agents/quality-scoring/tests/smoke.test.ts +++ b/agents/quality-scoring/tests/smoke.test.ts @@ -4,7 +4,7 @@ * Basic integration tests to verify the agent works correctly. */ -import { describe, it, expect, beforeAll } from 'vitest'; +import { describe, it, expect, beforeAll, vi } from 'vitest'; import { handler, QUALITY_SCORING_AGENT } from '../handler'; import { executeCLI } from '../cli'; import { @@ -13,6 +13,22 @@ import { PRESET_PROFILES, } from '../../contracts'; +vi.mock('../../services', () => ({ + getRuVectorClient: () => ({ + persistDecisionEvent: vi.fn().mockResolvedValue(undefined), + flush: vi.fn().mockResolvedValue(undefined), + }), + createTelemetryEmitter: () => ({ + emitInvoked: vi.fn(), + emitCompleted: vi.fn(), + emitDecision: vi.fn(), + emitError: vi.fn(), + emitValidationFailed: vi.fn(), + emitConstraintApplied: vi.fn(), + flush: vi.fn().mockResolvedValue(undefined), + }), +})); + // ============================================================================= // TEST DATA // ============================================================================= @@ -432,11 +448,7 @@ describe('Quality Scoring CLI', () => { }); it('should return 0 for dry-run with valid input', async () => { - const code = await executeCLI([ - '--dry-run', - '--input-json', - JSON.stringify(validInput), - ]); + const code = await executeCLI(['--dry-run', '--input-json', JSON.stringify(validInput)]); expect(code).toBe(0); }); }); diff --git a/agents/stress-test/tests/smoke.test.ts b/agents/stress-test/tests/smoke.test.ts index 2170498..6d383f5 100644 --- a/agents/stress-test/tests/smoke.test.ts +++ b/agents/stress-test/tests/smoke.test.ts @@ -4,7 +4,7 @@ * Verification checklist and smoke tests for platform wiring. */ -import { describe, it, expect, beforeAll, afterAll } from 'vitest'; +import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'; import { handler, STRESS_TEST_AGENT } from '../handler'; import { StressTestInputSchema, @@ -15,10 +15,23 @@ import { FAILURE_MODE_METADATA, STRESS_TEST_NON_RESPONSIBILITIES, } from '../../contracts'; -import { - getRegistrationMetadata, - validateRegistration, -} from '../../registry/stress-test'; +import { getRegistrationMetadata, validateRegistration } from '../../registry/stress-test'; + +vi.mock('../../services', () => ({ + getRuVectorClient: () => ({ + persistDecisionEvent: vi.fn().mockResolvedValue(undefined), + flush: vi.fn().mockResolvedValue(undefined), + }), + createTelemetryEmitter: () => ({ + emitInvoked: vi.fn(), + emitCompleted: vi.fn(), + emitDecision: vi.fn(), + emitError: vi.fn(), + emitValidationFailed: vi.fn(), + emitConstraintApplied: vi.fn(), + flush: vi.fn().mockResolvedValue(undefined), + }), +})); // ============================================================================= // TEST FIXTURES @@ -137,7 +150,7 @@ describe('Verification Checklist', () => { const metadata = getRegistrationMetadata(); expect(metadata.test_types.length).toBe(10); - const testTypes = metadata.test_types.map(t => t.type); + const testTypes = metadata.test_types.map((t) => t.type); expect(testTypes).toContain('load_ramp'); expect(testTypes).toContain('spike'); expect(testTypes).toContain('soak'); @@ -179,12 +192,60 @@ describe('Verification Checklist', () => { it('should validate all test type configs', () => { const configs = [ - { test_type: 'load_ramp', load_ramp_config: { initial_concurrency: 1, max_concurrency: 10, step_size: 2, step_duration_ms: 1000, requests_per_step: 5 } }, - { test_type: 'spike', spike_config: { baseline_concurrency: 0, spike_concurrency: 50, spike_duration_ms: 5000, recovery_observation_ms: 10000 } }, - { test_type: 'soak', soak_config: { concurrency: 10, duration_ms: 60000, request_interval_ms: 1000, metrics_sample_interval_ms: 5000 } }, - { test_type: 'extreme_input', extreme_input_config: { input_sizes: [1000, 5000], character_types: ['ascii'], include_edge_cases: true } }, - { test_type: 'adversarial', adversarial_config: { test_categories: ['encoding_tricks'], severity_level: 'medium', samples_per_category: 3 } }, - { test_type: 'rate_limit_probe', rate_limit_probe_config: { initial_rps: 1, max_rps: 50, increment: 5, duration_per_level_ms: 3000, detect_throttling: true } }, + { + test_type: 'load_ramp', + load_ramp_config: { + initial_concurrency: 1, + max_concurrency: 10, + step_size: 2, + step_duration_ms: 1000, + requests_per_step: 5, + }, + }, + { + test_type: 'spike', + spike_config: { + baseline_concurrency: 0, + spike_concurrency: 50, + spike_duration_ms: 5000, + recovery_observation_ms: 10000, + }, + }, + { + test_type: 'soak', + soak_config: { + concurrency: 10, + duration_ms: 60000, + request_interval_ms: 1000, + metrics_sample_interval_ms: 5000, + }, + }, + { + test_type: 'extreme_input', + extreme_input_config: { + input_sizes: [1000, 5000], + character_types: ['ascii'], + include_edge_cases: true, + }, + }, + { + test_type: 'adversarial', + adversarial_config: { + test_categories: ['encoding_tricks'], + severity_level: 'medium', + samples_per_category: 3, + }, + }, + { + test_type: 'rate_limit_probe', + rate_limit_probe_config: { + initial_rps: 1, + max_rps: 50, + increment: 5, + duration_per_level_ms: 3000, + detect_throttling: true, + }, + }, ]; for (const config of configs) { @@ -322,8 +383,12 @@ describe('Verification Checklist', () => { for (const mode of modes) { expect(FAILURE_MODE_METADATA[mode as keyof typeof FAILURE_MODE_METADATA]).toBeDefined(); - expect(FAILURE_MODE_METADATA[mode as keyof typeof FAILURE_MODE_METADATA].description).toBeDefined(); - expect(typeof FAILURE_MODE_METADATA[mode as keyof typeof FAILURE_MODE_METADATA].recoverable).toBe('boolean'); + expect( + FAILURE_MODE_METADATA[mode as keyof typeof FAILURE_MODE_METADATA].description, + ).toBeDefined(); + expect( + typeof FAILURE_MODE_METADATA[mode as keyof typeof FAILURE_MODE_METADATA].recoverable, + ).toBe('boolean'); } }); }); @@ -460,13 +525,15 @@ describe('Integration Smoke Tests', () => { // Requires OPENAI_API_KEY const input = { ...VALID_INPUT, - providers: [{ - provider_name: 'openai' as const, - model_id: 'gpt-4o-mini', - api_key_ref: 'openai', - timeout_ms: 60000, - max_retries: 1, - }], + providers: [ + { + provider_name: 'openai' as const, + model_id: 'gpt-4o-mini', + api_key_ref: 'openai', + timeout_ms: 60000, + max_retries: 1, + }, + ], execution_config: { ...VALID_INPUT.execution_config, max_total_requests: 10, // Limit for smoke test diff --git a/deploy/main.ts b/deploy/main.ts index caf5e2f..24945e7 100644 --- a/deploy/main.ts +++ b/deploy/main.ts @@ -10,7 +10,7 @@ */ import { createServer, IncomingMessage, ServerResponse } from 'http'; -import { randomUUID } from 'crypto'; +import { randomUUID, webcrypto } from 'crypto'; // ============================================================================= // REQUIRED ENVIRONMENT VARIABLES (PHASE 1 / LAYER 1) @@ -30,29 +30,35 @@ const REQUIRED_ENV_VARS = [ // ============================================================================= function logAgentStarted(config: Record): void { - console.log(JSON.stringify({ - event: 'agent_started', - ...config, - timestamp: new Date().toISOString(), - })); + console.log( + JSON.stringify({ + event: 'agent_started', + ...config, + timestamp: new Date().toISOString(), + }), + ); } function logAgentAbort(reason: string, details?: Record): void { - console.error(JSON.stringify({ - event: 'agent_abort', - reason, - details, - timestamp: new Date().toISOString(), - })); + console.error( + JSON.stringify({ + event: 'agent_abort', + reason, + details, + timestamp: new Date().toISOString(), + }), + ); } function logDecisionEventEmitted(agentId: string, decisionId: string): void { - console.log(JSON.stringify({ - event: 'decision_event_emitted', - agent_id: agentId, - decision_id: decisionId, - timestamp: new Date().toISOString(), - })); + console.log( + JSON.stringify({ + event: 'decision_event_emitted', + agent_id: agentId, + decision_id: decisionId, + timestamp: new Date().toISOString(), + }), + ); } // ============================================================================= @@ -178,7 +184,7 @@ async function parseRequestBody(req: IncomingMessage): Promise { async function handleAgentRequest( agentName: string, - body: unknown + body: unknown, ): Promise<{ statusCode: number; body: unknown }> { const executionId = randomUUID(); const decisionId = randomUUID(); @@ -295,9 +301,9 @@ async function handleAgentRequest( async function hashInput(input: unknown): Promise { const encoder = new TextEncoder(); const data = encoder.encode(JSON.stringify(input ?? {})); - const hashBuffer = await crypto.subtle.digest('SHA-256', data); + const hashBuffer = await webcrypto.subtle.digest('SHA-256', data); const hashArray = Array.from(new Uint8Array(hashBuffer)); - return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); + return hashArray.map((b) => b.toString(16).padStart(2, '0')).join(''); } // ============================================================================= @@ -326,19 +332,21 @@ const server = createServer(async (req: IncomingMessage, res: ServerResponse) => const statusCode = ruvectorHealthy ? 200 : 503; res.writeHead(statusCode); - res.end(JSON.stringify({ - status, - service: SERVICE_NAME, - version: SERVICE_VERSION, - environment: PLATFORM_ENV, - // Agent Identity (PHASE 1 / LAYER 1) - agent_name: AGENT_NAME, - domain: AGENT_DOMAIN, - phase: AGENT_PHASE, - layer: AGENT_LAYER, - ruvector_healthy: ruvectorHealthy, - timestamp: new Date().toISOString(), - })); + res.end( + JSON.stringify({ + status, + service: SERVICE_NAME, + version: SERVICE_VERSION, + environment: PLATFORM_ENV, + // Agent Identity (PHASE 1 / LAYER 1) + agent_name: AGENT_NAME, + domain: AGENT_DOMAIN, + phase: AGENT_PHASE, + layer: AGENT_LAYER, + ruvector_healthy: ruvectorHealthy, + timestamp: new Date().toISOString(), + }), + ); return; } @@ -349,20 +357,22 @@ const server = createServer(async (req: IncomingMessage, res: ServerResponse) => const statusCode = ready ? 200 : 503; res.writeHead(statusCode); - res.end(JSON.stringify({ - ready, - checks: { - ruvector_service: ruvectorHealthy, - environment_configured: true, - // Agent Identity validation - agent_identity: { - source_agent: AGENT_NAME, - domain: AGENT_DOMAIN, - phase: AGENT_PHASE, - layer: AGENT_LAYER, + res.end( + JSON.stringify({ + ready, + checks: { + ruvector_service: ruvectorHealthy, + environment_configured: true, + // Agent Identity validation + agent_identity: { + source_agent: AGENT_NAME, + domain: AGENT_DOMAIN, + phase: AGENT_PHASE, + layer: AGENT_LAYER, + }, }, - }, - })); + }), + ); return; } @@ -377,12 +387,14 @@ const server = createServer(async (req: IncomingMessage, res: ServerResponse) => })); res.writeHead(200); - res.end(JSON.stringify({ - service: SERVICE_NAME, - version: SERVICE_VERSION, - agents, - total: agents.length, - })); + res.end( + JSON.stringify({ + service: SERVICE_NAME, + version: SERVICE_VERSION, + agents, + total: agents.length, + }), + ); return; } @@ -393,7 +405,7 @@ const server = createServer(async (req: IncomingMessage, res: ServerResponse) => const executionId = typeof event.execution_id === 'string' ? event.execution_id : 'unknown'; console.log( - `[Telemetry] source=${event.source} type=${event.event_type} execution_id=${executionId} ts=${event.timestamp}` + `[Telemetry] source=${event.source} type=${event.event_type} execution_id=${executionId} ts=${event.timestamp}`, ); res.writeHead(202); @@ -408,10 +420,12 @@ const server = createServer(async (req: IncomingMessage, res: ServerResponse) => if (method !== 'POST') { res.writeHead(405); - res.end(JSON.stringify({ - error: 'Method Not Allowed', - message: 'Agent endpoints only accept POST requests', - })); + res.end( + JSON.stringify({ + error: 'Method Not Allowed', + message: 'Agent endpoints only accept POST requests', + }), + ); return; } @@ -428,26 +442,29 @@ const server = createServer(async (req: IncomingMessage, res: ServerResponse) => // Not found res.writeHead(404); - res.end(JSON.stringify({ - error: 'Not Found', - message: `Endpoint ${path} not found`, - available_endpoints: [ - '/health', - '/ready', - '/api/v1/agents', - '/api/v1/telemetry', - ...Object.keys(AGENT_METADATA).map(k => `/api/v1/agents/${k}`), - ], - })); - + res.end( + JSON.stringify({ + error: 'Not Found', + message: `Endpoint ${path} not found`, + available_endpoints: [ + '/health', + '/ready', + '/api/v1/agents', + '/api/v1/telemetry', + ...Object.keys(AGENT_METADATA).map((k) => `/api/v1/agents/${k}`), + ], + }), + ); } catch (err) { console.error('[Server] Error:', err); res.writeHead(500); - res.end(JSON.stringify({ - error: 'Internal Server Error', - message: err instanceof Error ? err.message : String(err), - timestamp: new Date().toISOString(), - })); + res.end( + JSON.stringify({ + error: 'Internal Server Error', + message: err instanceof Error ? err.message : String(err), + timestamp: new Date().toISOString(), + }), + ); } }); @@ -489,7 +506,7 @@ async function performStartupChecks(): Promise { const response = await fetch(`${RUVECTOR_SERVICE_URL}/health`, { method: 'GET', headers: { - 'Authorization': `Bearer ${RUVECTOR_API_KEY}`, + Authorization: `Bearer ${RUVECTOR_API_KEY}`, 'X-API-Key': RUVECTOR_API_KEY!, }, signal: AbortSignal.timeout(5000), @@ -516,26 +533,28 @@ async function performStartupChecks(): Promise { // ============================================================================= // Perform mandatory startup checks BEFORE listening -performStartupChecks().then(() => { - server.listen(PORT, () => { - // Log successful startup (minimal observability) - logAgentStarted({ - service: SERVICE_NAME, - version: SERVICE_VERSION, - environment: PLATFORM_ENV, - agent_name: AGENT_NAME, - domain: AGENT_DOMAIN, - phase: AGENT_PHASE, - layer: AGENT_LAYER, - port: String(PORT), - agent_count: String(Object.keys(AGENT_METADATA).length), - ruvector_healthy: String(ruvectorHealthy), +performStartupChecks() + .then(() => { + server.listen(PORT, () => { + // Log successful startup (minimal observability) + logAgentStarted({ + service: SERVICE_NAME, + version: SERVICE_VERSION, + environment: PLATFORM_ENV, + agent_name: AGENT_NAME, + domain: AGENT_DOMAIN, + phase: AGENT_PHASE, + layer: AGENT_LAYER, + port: String(PORT), + agent_count: String(Object.keys(AGENT_METADATA).length), + ruvector_healthy: String(ruvectorHealthy), + }); }); + }) + .catch((err) => { + logAgentAbort('startup_failed', { error: String(err) }); + process.exit(1); }); -}).catch((err) => { - logAgentAbort('startup_failed', { error: String(err) }); - process.exit(1); -}); // Graceful shutdown process.on('SIGTERM', () => { diff --git a/docs/metaharness/2026-10-17/README.md b/docs/metaharness/2026-10-17/README.md new file mode 100644 index 0000000..247f640 --- /dev/null +++ b/docs/metaharness/2026-10-17/README.md @@ -0,0 +1,154 @@ +# Test-bench dependency-security cycle β€” October 17, 2026 + +**EXECUTED / component VALIDATED / repository BLOCKED β€” not merged.** + +Resumed [existing non-draft PR #24](https://github.com/LLM-Dev-Ops/test-bench/pull/24). Baseline +recovery head: `1c4f445288f360120ebae6fb00c6fbf312c16931`. Implementation: +`a97c8aface1480232fa24b36524f798979617253`, tree `c2e6119165368b10ae40a0891d0112e5e44204df`. Main +stayed at `4d58c46426fe085d25fef3fcb35fa5e2cce83b30`. The evidence-only follow-up changes no SDK +dependency, test or CI source. No conflict resolution, force push or merge was required/performed. + +## What changed + +- Raise same-major minimums for AJV, Express, glob and YAML; refresh the compatible locked graph. + All changed dependency majors stayed unchanged. Resolved versions include AJV 8.20.0, Express + 4.22.3, glob 10.5.0, YAML 2.9.1, and proxy-addr 2.0.8. +- Reproduce and prevent the + [proxy-addr trust-subnet spoofing defect](https://github.com/advisories/GHSA-jqcg-44mw-7w3h) with + five real loopback HTTP cases against the installed Express graph. The vulnerable baseline + accepted a forged `X-Forwarded-For` address with `::ffff:10.0.0.0/8`; the patched graph returns + the actual peer. Four ordinary trust configurations retain their behavior. This is a + dependency-level fixture, **not evidence that a production deployment enables that trust + configuration or was exploited**. +- Add a pinned Ubuntu 24.04 / Node 20.19.5 production-security job using immutable + checkout/setup-node action SHAs, real HTTP regression execution, production audit and lockfile + checksum/diff verification. +- Make `CI Success` depend on integration and production security as well as the existing gates, and + reject failures, cancellations **and skips**. Twenty-six tests exercise the aggregate's actual + result expression/dependency list. These are unit gate checks, not simulated hosted execution + proof. + +## Actual measurements + +The [contract](contract.json) was frozen before dependency changes. The native HTTP fixture is +byte-identical in baseline/candidate; no existing test, coverage threshold or exclusion was +weakened. The Flywheel anchor checks every one of the original 411 passing assertion names remains +passing. + +| Measurement | Baseline | Candidate | +| --------------------------------- | --------------: | ----------------: | +| Production advisories | 14 | 3 | +| Production critical / high | 1 / 6 | 0 / 0 | +| Production moderate / low | 6 / 1 | 3 / 0 | +| Frozen holdout | 0/3 | 3/3 | +| Frozen anchors | 5/5 | 5/5 | +| Native HTTP spoof-resistance case | fail, forged IP | pass, actual peer | +| Native HTTP compatibility cases | 4/4 | 4/4 | +| Unit tests actually passed | 411 | 438 | +| Pre-existing skips | 31 | 31 | +| ESLint / typecheck / build-all | pass | pass | + +Candidate `npm ci --ignore-scripts`, `npm test`, `npm run lint`, `npm run typecheck`, +`npm run build:all` and `npm run format:check` exited **0**, both locally and on an exact +implementation-commit RuOS checkout (Node 20.20.2). Its status was clean and lock checksum +unchanged. `npm audit --omit=dev --audit-level=high` exited **0**; full production audit exited +**1** because three moderate findings remain. Do not label this a zero-advisory result. + +The **all-dependencies** audit, including development tools, exited **1** with **29 findings: four +critical, 19 high, six moderate**. This is separate from the production-only improvement. The +suggested `npm audit fix --force` was not executed: its proposed Functions Framework 3β†’2 downgrade +violates the frozen compatibility boundary. Production Functions Framework/CloudEvents/uuid +remediation and development-tool advisories remain work. + +The **unchanged 80% coverage gate remains red**. The initial local baseline reported 42.46% lines, +52.84% functions, 69.4% branches; the clean implementation-commit hosted job reported 42.11% lines, +54.98% functions, 69.54% branches. Local generated tooling/assets and new fixture files alter the +broad `all: true` population, so these are not a controlled coverage-lift measurement. No coverage +improvement is claimed, no exclusions were added, and full-repository acceptance is rejected. The +final evidence checkout receives its own gate run rather than inheriting an earlier CI conclusion. + +## Hosted evidence and Rust limits + +[Implementation CI run 39056681265](https://github.com/LLM-Dev-Ops/test-bench/actions/runs/39056681265) +completed: + +- PASS: Node 18, 20 and 22 (**438 actual passes + 31 skips each**), formatting, lint, typecheck, + build, integration, production security. +- FAIL: coverage and, consequently, `CI Success`. The new security job verified the committed + lockfile stayed unchanged. + +RuOS bootstrap was executed again; OpenSSL **3.0.13** was verified. The durable research-lab +checkout was inspected at `6454d374a939f2b5f94709b6909f4251b7204252` against upstream main +`83c4850c04d6243c1f700ec4a6a0e406a7d7198a` before using its recovery tooling. + +`cargo test --workspace --locked` began real compilation but consumed remaining desktop disk. Its +owned process was stopped (exit **143**, not a compiler/test verdict). Only this run's generated +`/home/ruv/work/test-bench-oct17c/target` artifacts were cleaned: 3579 files / 2.2 GiB; source and +logs were retained and artifacts can be rebuilt. A retry with +`timeout 240s env CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=2 cargo test --workspace --locked` +exited **124**, still compiling, with **zero completed Rust tests**. `cargo fmt --all -- --check` +exited **1**. Separate Rust build/Clippy were deferred, not reported passing. Rust sources, +manifests and lockfile are unchanged by this cycle. No missing-OpenSSL or current +private-authentication failure is inferred from the timeout. + +## Real tool execution and reproducibility + +Pinned versions: **Ruflo 3.56.3**, **Transformers 4.3.1**, **MetaHarness 0.4.17**, **Darwin +0.10.3**, **Flywheel 0.1.12**. Upstream refreshed revision: +`e0dfd44da72b7adfb7c57fdd42d124be58ed7086`. Local isolated tools: +`/workspace/scratch/4f25900b71ff/cycle-tools-20261017`. + +- Ruflo initialized hierarchical/specialized coordination, max-agents 1, swarm + `swarm-1792259929105-ypiqot`, actual task `test-bench-security-oct17c`. No delegated workers are + claimed. Actual implementation is the dependency/test/CI change above, not the coordination + invocation. +- `metaharness score . --json`: **82β†’82**, hard constraints **6/6**, exit 0. Static compile + confidence is not Rust validation. +- `darwin evolve . --generations 1 --children 2 --concurrency 1 --seed 2026101714 --sandbox real --selection pareto`: + baseline, `g1_v0` (toolPolicy), `g1_v1` (memoryPolicy) tied **0.985**. Nine real `npm test` + invocations passed, each at the earlier 412-pass/31-skip stage before aggregate tests were added. + Both children were rejected: **NO_IMPROVEMENT**. This substrate cannot discriminate harness + surfaces; initialization is not improvement proof. +- `node docs/metaharness/2026-10-17/evaluate.mjs ../test-bench-baseline-oct17c . ../cycle-tools-20261017 docs/metaharness/2026-10-17/flywheel-results.json`: + exit **0**. Flywheel actually reran audits, native HTTP and repository commands, promoted the + **component only** from 0β†’1, retained anchors 1β†’1, and passed **8/8** signed replay checks. The + first attempt failed closed because Vitest 1's aggregate JSON called all 442 assertions passed, + although individual statuses were 411 passed/31 skipped. The corrected parser uses individual + statuses, preserves the frozen criteria, and reran the evaluator; no score from the rejected + attempt is used. + +Gate fingerprint: `c5942e7c9bf8f28fe7af47a6ec3887d11eeb3f8c8e8601cc6a7a54969ea0b981`. Lineage: +`gen1(dependencies) β†’ gen0(root)`. See [compact results](flywheel-summary.json) and +[complete gzip-compressed JSON](flywheel-results.json.gz), including executed output, signed +receipts, lineage and exact parent dependency bytes. Independent replay verified the compressed file +after decompression. Generate plain JSON again with the evaluator, or decode with +`gzip -dc flywheel-results.json.gz`. No speed, paid-cost, energy or LLM efficacy improvement is +claimed; HTTP durations are observations, not a load benchmark. + +Offline post-task learning used the current research-lab kernel-restricted launcher/preload; both +blob hashes matched its upstream main. Checksum-pinned MiniLM revision +`751bff37182d3f1213fa05d7196b954e230abad9` generated real **384-dimensional** embeddings with remote +model loading disabled. `learningUpdates.available`, `outcomePersisted`, `feedback.recorded`, and +`trajectory.recorded` were **all true**, with two learning/feedback updates. The task outcome was +explicitly `success=false` because whole-repository gates remain blocked. No active pheromone swarm, +hash embeddings, task-data egress or approval workaround is claimed. Exact invocations and outcomes +are in the ledger. + +## Coverage, architecture and rollback + +Fully paginated **58 accessible nonarchived repositories** (offsets 0/100 β†’ 58/0), refreshed each +main/latest CI, and paginated **117 open PRs** (100+17). Deep-worked only test-bench; observatory +#11, sentinel #22 and inference-gateway #1 received read-only PR inspection. All **57 named +deferrals**, SHAs, CI states and reasons are in the [ledger](ledger.json); metadata coverage is not +a claim of source/build coverage for every repository. + +Core-memory returned no playbook entries or anti-patterns and marked the response unscreened. +Explicit user constraints governed the implementation: Rust/TypeScript retained; no persistence, +service database, IAM, deployment, publication or paid-provisioning changes. Existing CI/test +constraints remain intact or stricter. No branch protection was bypassed. + +Rollback: revert this cycle's evidence commit, then `a97c8aface1480232fa24b36524f798979617253`, to +return to the prior recovery head while retaining its earlier fixes. After a future squash merge, +revert that merge commit. The signed inverse retains exact parent package/lock bytes and hashes; +reverse-patch applicability passed for package and CI changes. No production rollback or data +migration was performed. diff --git a/docs/metaharness/2026-10-17/contract.json b/docs/metaharness/2026-10-17/contract.json new file mode 100644 index 0000000..1969575 --- /dev/null +++ b/docs/metaharness/2026-10-17/contract.json @@ -0,0 +1,36 @@ +{ + "baseline": "1c4f445288f360120ebae6fb00c6fbf312c16931", + "holdout": [ + "zero-critical-production-advisories", + "zero-high-production-advisories", + "mapped-ipv6-trust-cannot-spoof-http-client" + ], + "anchor": [ + "existing-unit-tests-retained", + "lint", + "typecheck", + "build-all", + "ordinary-proxy-trust-semantics" + ], + "limits": { "darwinGenerations": 1, "darwinChildren": 2, "concurrency": 1 }, + "acceptance": "No dependency major upgrades or Node18 compatibility loss; all existing 411 passing tests retained, 31 pre-existing skips unchanged; identical live HTTP test in both checkouts; no tests, 80% coverage thresholds, exclusions, or security gates weakened. Every repository gate still independently blocks merge.", + "baselineMeasurements": { + "productionAdvisories": { + "critical": 1, + "high": 6, + "moderate": 6, + "low": 1, + "total": 14 + }, + "testsPassed": 411, + "testsSkipped": 31, + "coverage": { + "lines": 42.46, + "functions": 52.84, + "statements": 42.46, + "branches": 69.4 + }, + "coverageExit": 1 + }, + "note": "Coverage values include the original broad all-files configuration and generated test-results assets; no exclusions will be changed to inflate the score." +} diff --git a/docs/metaharness/2026-10-17/evaluate.mjs b/docs/metaharness/2026-10-17/evaluate.mjs new file mode 100644 index 0000000..384babc --- /dev/null +++ b/docs/metaharness/2026-10-17/evaluate.mjs @@ -0,0 +1,186 @@ +import assert from 'node:assert/strict'; +import { createHash } from 'node:crypto'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { resolve, join } from 'node:path'; +import { pathToFileURL } from 'node:url'; +import { spawnSync } from 'node:child_process'; + +// node evaluate.mjs BASELINE CANDIDATE PINNED_TOOLS OUTPUT +const [baseline, candidate, runtime, output] = process.argv.slice(2).map((x) => resolve(x)); +const fw = await import( + pathToFileURL(join(runtime, 'node_modules/@metaharness/flywheel/dist/index.js')) +); +assert.equal( + JSON.parse(readFileSync(join(runtime, 'node_modules/@metaharness/flywheel/package.json'))) + .version, + '0.1.12', +); +const contract = JSON.parse(readFileSync(new URL('./contract.json', import.meta.url))); +const hash = (bytes) => createHash('sha256').update(bytes).digest('hex'); +const fixture = 'scripts/verify-proxy-boundary.mjs'; +assert.equal( + hash(readFileSync(join(baseline, fixture))), + hash(readFileSync(join(candidate, fixture))), +); +const lockHash = (dir) => hash(readFileSync(join(dir, 'package-lock.json'))); +const rootHash = lockHash(baseline), + fixedHash = lockHash(candidate); +assert.notEqual(rootHash, fixedHash); +const parentBytes = JSON.stringify( + Object.fromEntries( + ['package.json', 'package-lock.json'].map((file) => [ + file, + readFileSync(join(baseline, file), 'utf8'), + ]), + ), +); +const measurements = []; +let baselineNames; +const run = (dir, command, args) => { + const result = spawnSync(command, args, { + cwd: dir, + encoding: 'utf8', + timeout: 120000, + maxBuffer: 8 * 1024 * 1024, + }); + assert.equal(result.signal, null, `${command}: timeout/signal is not an evaluation result`); + assert.notEqual(result.status, null); + return { + command: [command, ...args], + exit: result.status, + stdout: result.stdout, + stderr: result.stderr, + }; +}; +const compact = (command) => ({ + ...command, + stdout: command.stdout.slice(-5000), + stderr: command.stderr.slice(-3000), +}); +const evaluator = async (policy, suite) => { + const dir = policy.dependencies === rootHash ? baseline : candidate; + assert.equal(lockHash(dir), policy.dependencies); + const native = run(dir, process.execPath, [fixture, dir]); + assert.ok(native.exit === 0 || native.exit === 1); + const http = JSON.parse(native.stdout); + assert.equal(http.results.length, 5, 'all native cases executed'); + const commands = [compact(native)]; + let itemWins, detail; + if (suite.id === 'holdout') { + const audit = run(dir, 'npm', ['audit', '--omit=dev', '--json']); + assert.ok(audit.exit === 0 || audit.exit === 1); + const report = JSON.parse(audit.stdout); + assert.ok(!report.error && report.metadata?.vulnerabilities, 'actual audit response required'); + detail = { audit: report, http }; + commands.push({ command: audit.command, exit: audit.exit, stderr: audit.stderr }); + itemWins = [ + report.metadata.vulnerabilities.critical === 0, + report.metadata.vulnerabilities.high === 0, + http.results.find((x) => x.suite === 'holdout').passed, + ]; + } else { + const tests = run(dir, 'npm', ['test']); + commands.push(compact(tests)); + const testReport = JSON.parse(readFileSync(join(dir, 'test-results/results.json'))); + const passedNames = testReport.testResults + .flatMap((x) => + x.assertionResults.filter((y) => y.status === 'passed').map((y) => y.fullName), + ) + .sort(); + // Vitest 1's aggregate JSON counter includes skipped assertions as passed. + // Derive execution counts from individual assertion statuses, never totals. + const assertions = testReport.testResults.flatMap((x) => x.assertionResults); + const skipped = assertions.filter( + (x) => x.status === 'skipped' || x.status === 'pending', + ).length; + if (dir === baseline) { + assert.equal(passedNames.length, 411); + assert.equal(skipped, 31); + baselineNames = passedNames; + } + assert.ok(baselineNames, 'baseline anchor must execute first'); + const retained = baselineNames.every((name) => passedNames.includes(name)); + const gates = [['lint'], ['typecheck'], ['build:all']].map((args) => + run(dir, 'npm', ['run', ...args]), + ); + commands.push(...gates.map(compact)); + itemWins = [ + tests.exit === 0 && retained && skipped === 31, + ...gates.map((x) => x.exit === 0), + http.results.filter((x) => x.suite === 'anchor').every((x) => x.passed), + ]; + detail = { + passed: passedNames.length, + skipped, + retainedExistingNames: retained, + existingNamesSha256: hash(JSON.stringify(baselineNames)), + http, + }; + } + const primary = itemWins.filter(Boolean).length / itemWins.length; + const score = { + primary, + noopRate: 1 - primary, + costPerWin: 0, + regressed: suite.id === 'anchor' && itemWins.some((x) => !x), + itemWins, + }; + measurements.push({ source: policy.dependencies, suite: suite.id, score, detail, commands }); + assert.equal(lockHash(dir), policy.dependencies, 'evaluation must not rewrite lockfile'); + return score; +}; +const fingerprint = fw.gateFingerprint(fw.meetsPromotionRule); +const result = await fw.runFlywheelGenerations({ + rootPolicy: { dependencies: rootHash }, + proposer: async () => ({ + value: fixedHash, + summary: 'Same-major security floor and lockfile refresh; native proxy-trust regression fixed', + inverse: { path: 'dependency-parent-files.json', parentBytes, hash: hash(parentBytes) }, + }), + evaluator, + holdout: { id: 'holdout', items: contract.holdout }, + anchor: { id: 'anchor', items: contract.anchor }, + maxGenerations: 1, + signer: fw.makeSigner(), + promotionRule: fw.meetsPromotionRule, + dataSource: 'LIVE_NPM_AUDIT_NATIVE_LOOPBACK_HTTP_AND_REPOSITORY_COMMANDS', +}); +const replay = fw.verifyReplayBundle(result.replayBundle, { pinnedGateFingerprint: fingerprint }); +assert.equal(replay.pass, true); +assert.equal(result.promotions.length, 1); +writeFileSync( + output, + JSON.stringify( + { + contract, + baselineLock: rootHash, + candidateLock: fixedHash, + fixtureSha256: hash(readFileSync(join(candidate, fixture))), + measurements, + promotions: result.promotions.length, + fingerprint, + replay, + replayBundle: result.replayBundle, + boundary: + 'component dependency security only; coverage, moderate advisories and Rust remain independent merge gates; cost/latency/energy unmeasured', + }, + null, + 2, + ) + '\n', +); +console.log( + JSON.stringify( + { + promotions: result.promotions.length, + replay, + measurements: measurements.map((m) => ({ + suite: m.suite, + score: m.score, + passed: m.detail.passed, + advisories: m.detail.audit?.metadata.vulnerabilities, + })), + }, + null, + 2, + ), +); diff --git a/docs/metaharness/2026-10-17/flywheel-results.json.gz b/docs/metaharness/2026-10-17/flywheel-results.json.gz new file mode 100644 index 0000000..519557d Binary files /dev/null and b/docs/metaharness/2026-10-17/flywheel-results.json.gz differ diff --git a/docs/metaharness/2026-10-17/flywheel-summary.json b/docs/metaharness/2026-10-17/flywheel-summary.json new file mode 100644 index 0000000..e4e80f3 --- /dev/null +++ b/docs/metaharness/2026-10-17/flywheel-summary.json @@ -0,0 +1,410 @@ +{ + "contract": { + "baseline": "1c4f445288f360120ebae6fb00c6fbf312c16931", + "holdout": [ + "zero-critical-production-advisories", + "zero-high-production-advisories", + "mapped-ipv6-trust-cannot-spoof-http-client" + ], + "anchor": [ + "existing-unit-tests-retained", + "lint", + "typecheck", + "build-all", + "ordinary-proxy-trust-semantics" + ], + "limits": { + "darwinGenerations": 1, + "darwinChildren": 2, + "concurrency": 1 + }, + "acceptance": "No dependency major upgrades or Node18 compatibility loss; all existing 411 passing tests retained, 31 pre-existing skips unchanged; identical live HTTP test in both checkouts; no tests, 80% coverage thresholds, exclusions, or security gates weakened. Every repository gate still independently blocks merge.", + "baselineMeasurements": { + "productionAdvisories": { + "critical": 1, + "high": 6, + "moderate": 6, + "low": 1, + "total": 14 + }, + "testsPassed": 411, + "testsSkipped": 31, + "coverage": { + "lines": 42.46, + "functions": 52.84, + "statements": 42.46, + "branches": 69.4 + }, + "coverageExit": 1 + }, + "note": "Coverage values include the original broad all-files configuration and generated test-results assets; no exclusions will be changed to inflate the score." + }, + "baselineLock": "8707cbaf5bab21a5026b13eb4b392bb9eef5910b440b14bc6c75282cfc0c2bab", + "candidateLock": "39d3850c6bc15eea32ee8ef835cdb1b472a40e927c8ef24fae8180a9fb483766", + "fixtureSha256": "aa75658a31587e40e2aedfaca470cabe4d3967adc7386d5977a01753c7405304", + "fingerprint": "c5942e7c9bf8f28fe7af47a6ec3887d11eeb3f8c8e8601cc6a7a54969ea0b981", + "promotions": 1, + "replay": { + "pass": true, + "checks": { + "receipts": true, + "reachesRoot": true, + "contiguousParents": true, + "allPromoted": true, + "gateUnchanged": true, + "gateReExecutes": true, + "allCommitsReceipts": true, + "sealedFieldsAuthentic": true + }, + "failures": [], + "chainSummary": "gen1(dependencies) β†’ gen0(root)" + }, + "measurements": [ + { + "source": "8707cbaf5bab21a5026b13eb4b392bb9eef5910b440b14bc6c75282cfc0c2bab", + "suite": "holdout", + "score": { + "primary": 0, + "noopRate": 1, + "costPerWin": 0, + "regressed": false, + "itemWins": [false, false, false] + }, + "http": { + "results": [ + { + "id": "mapped-ipv6-trust-cannot-spoof-http-client", + "trust": "::ffff:10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "holdout", + "observed": "203.0.113.7", + "passed": false, + "durationMs": 28.035239999999988 + }, + { + "id": "default-untrusted-peer", + "trust": false, + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 2.5336130000000026 + }, + { + "id": "plain-ipv4-subnet", + "trust": "10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 13.862245000000001 + }, + { + "id": "explicit-loopback-proxy", + "trust": "loopback", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 3.724767999999983 + }, + { + "id": "correctly-mapped-loopback-proxy", + "trust": "::ffff:127.0.0.0/104", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 3.548265999999984 + } + ], + "boundary": "Dependency-level live HTTP fixture; does not assert this deployment enables proxy trust or claim production exploitability/latency improvement" + }, + "advisories": { + "info": 0, + "low": 1, + "moderate": 6, + "high": 6, + "critical": 1, + "total": 14 + }, + "commands": [ + { + "command": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/node/bin/node", + "scripts/verify-proxy-boundary.mjs", + "/workspace/scratch/4f25900b71ff/test-bench-baseline-oct17c" + ], + "exit": 1 + }, + { + "command": ["npm", "audit", "--omit=dev", "--json"], + "exit": 1 + } + ] + }, + { + "source": "8707cbaf5bab21a5026b13eb4b392bb9eef5910b440b14bc6c75282cfc0c2bab", + "suite": "anchor", + "score": { + "primary": 1, + "noopRate": 0, + "costPerWin": 0, + "regressed": false, + "itemWins": [true, true, true, true, true] + }, + "passed": 411, + "skipped": 31, + "retained": true, + "http": { + "results": [ + { + "id": "mapped-ipv6-trust-cannot-spoof-http-client", + "trust": "::ffff:10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "holdout", + "observed": "203.0.113.7", + "passed": false, + "durationMs": 11.229375000000019 + }, + { + "id": "default-untrusted-peer", + "trust": false, + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 2.6878220000000113 + }, + { + "id": "plain-ipv4-subnet", + "trust": "10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 1.51123800000002 + }, + { + "id": "explicit-loopback-proxy", + "trust": "loopback", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 1.9146159999999952 + }, + { + "id": "correctly-mapped-loopback-proxy", + "trust": "::ffff:127.0.0.0/104", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 1.7589159999999993 + } + ], + "boundary": "Dependency-level live HTTP fixture; does not assert this deployment enables proxy trust or claim production exploitability/latency improvement" + }, + "commands": [ + { + "command": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/node/bin/node", + "scripts/verify-proxy-boundary.mjs", + "/workspace/scratch/4f25900b71ff/test-bench-baseline-oct17c" + ], + "exit": 1 + }, + { + "command": ["npm", "test"], + "exit": 0 + }, + { + "command": ["npm", "run", "lint"], + "exit": 0 + }, + { + "command": ["npm", "run", "typecheck"], + "exit": 0 + }, + { + "command": ["npm", "run", "build:all"], + "exit": 0 + } + ] + }, + { + "source": "39d3850c6bc15eea32ee8ef835cdb1b472a40e927c8ef24fae8180a9fb483766", + "suite": "holdout", + "score": { + "primary": 1, + "noopRate": 0, + "costPerWin": 0, + "regressed": false, + "itemWins": [true, true, true] + }, + "http": { + "results": [ + { + "id": "mapped-ipv6-trust-cannot-spoof-http-client", + "trust": "::ffff:10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "holdout", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 11.722754000000009 + }, + { + "id": "default-untrusted-peer", + "trust": false, + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 1.8999450000000024 + }, + { + "id": "plain-ipv4-subnet", + "trust": "10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 1.4728510000000057 + }, + { + "id": "explicit-loopback-proxy", + "trust": "loopback", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 1.840125999999998 + }, + { + "id": "correctly-mapped-loopback-proxy", + "trust": "::ffff:127.0.0.0/104", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 2.079640999999995 + } + ], + "boundary": "Dependency-level live HTTP fixture; does not assert this deployment enables proxy trust or claim production exploitability/latency improvement" + }, + "advisories": { + "info": 0, + "low": 0, + "moderate": 3, + "high": 0, + "critical": 0, + "total": 3 + }, + "commands": [ + { + "command": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/node/bin/node", + "scripts/verify-proxy-boundary.mjs", + "/workspace/scratch/4f25900b71ff/test-bench-cycle-oct17c" + ], + "exit": 0 + }, + { + "command": ["npm", "audit", "--omit=dev", "--json"], + "exit": 1 + } + ] + }, + { + "source": "39d3850c6bc15eea32ee8ef835cdb1b472a40e927c8ef24fae8180a9fb483766", + "suite": "anchor", + "score": { + "primary": 1, + "noopRate": 0, + "costPerWin": 0, + "regressed": false, + "itemWins": [true, true, true, true, true] + }, + "passed": 438, + "skipped": 31, + "retained": true, + "http": { + "results": [ + { + "id": "mapped-ipv6-trust-cannot-spoof-http-client", + "trust": "::ffff:10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "holdout", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 11.311906000000008 + }, + { + "id": "default-untrusted-peer", + "trust": false, + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 1.6034250000000014 + }, + { + "id": "plain-ipv4-subnet", + "trust": "10.0.0.0/8", + "expected": "127.0.0.1", + "suite": "anchor", + "observed": "127.0.0.1", + "passed": true, + "durationMs": 1.5997100000000017 + }, + { + "id": "explicit-loopback-proxy", + "trust": "loopback", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 1.4375890000000027 + }, + { + "id": "correctly-mapped-loopback-proxy", + "trust": "::ffff:127.0.0.0/104", + "expected": "203.0.113.7", + "suite": "anchor", + "observed": "203.0.113.7", + "passed": true, + "durationMs": 1.9234790000000004 + } + ], + "boundary": "Dependency-level live HTTP fixture; does not assert this deployment enables proxy trust or claim production exploitability/latency improvement" + }, + "commands": [ + { + "command": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/node/bin/node", + "scripts/verify-proxy-boundary.mjs", + "/workspace/scratch/4f25900b71ff/test-bench-cycle-oct17c" + ], + "exit": 0 + }, + { + "command": ["npm", "test"], + "exit": 0 + }, + { + "command": ["npm", "run", "lint"], + "exit": 0 + }, + { + "command": ["npm", "run", "typecheck"], + "exit": 0 + }, + { + "command": ["npm", "run", "build:all"], + "exit": 0 + } + ] + } + ] +} diff --git a/docs/metaharness/2026-10-17/ledger.json b/docs/metaharness/2026-10-17/ledger.json new file mode 100644 index 0000000..78f0be1 --- /dev/null +++ b/docs/metaharness/2026-10-17/ledger.json @@ -0,0 +1,1131 @@ +{ + "date": "2026-10-17", + "status": ["EXECUTED", "COMPONENT_VALIDATED", "REPOSITORY_BLOCKED"], + "worked": ["LLM-Dev-Ops/test-bench"], + "readOnlyPRInspection": [ + "LLM-Dev-Ops/observatory#11", + "LLM-Dev-Ops/sentinel#22", + "LLM-Dev-Ops/inference-gateway#1" + ], + "inventory": { + "installation": 168979216, + "pages": [ + { + "offset": 0, + "count": 58 + }, + { + "offset": 100, + "count": 0 + } + ], + "repositories": 58, + "nonarchived": 58, + "openPRPages": [100, 17] + }, + "coverage": [ + { + "repo": "LLM-Dev-Ops/test-bench", + "main": "4d58c46426fe085d25fef3fcb35fa5e2cce83b30", + "protected": false, + "ci": { + "id": 38139330512, + "sha": "1c4f445288f360120ebae6fb00c6fbf312c16931", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/test-bench/actions/runs/38139330512" + }, + "disposition": "WORKED", + "reason": "Resumed PR24 in isolated worktree" + }, + { + "repo": "LLM-Dev-Ops/observatory", + "main": "020f9031a2f1272d55deef0d6c715650b6647150", + "protected": false, + "ci": { + "id": 38326924256, + "sha": "6806b2266882c081ec05dc0ab8350b32c34caf3d", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/observatory/actions/runs/38326924256" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/shield", + "main": "1c46282495b94bb1fcae2d9e63cf34f495226699", + "protected": false, + "ci": { + "id": 38398421866, + "sha": "60bcd3c463228ee8c8ccadc4c7c560502d73e273", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/shield/actions/runs/38398421866" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/memory-graph", + "main": "d9b9dc5eb7ac313eedc2831dce6af46641bfaaa7", + "protected": false, + "ci": { + "id": 38985101510, + "sha": "a1268650619d3ee7b58d833fa9a7ea727206d66f", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/memory-graph/actions/runs/38985101510" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/sentinel", + "main": "504b0ea466620ffacfd7ea19993d5a62b71babdd", + "protected": false, + "ci": { + "id": 38445143556, + "sha": "16249d00b5ebaca889ac6ea372c8acc1b867579f", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/sentinel/actions/runs/38445143556" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/latency-lens", + "main": "8370e90fa788959a0b80e3f9c4140422f3eccd69", + "protected": false, + "ci": { + "id": 22300475883, + "sha": "ea8a15eb987f18e59f8d448f0bf48c2ef0891e7e", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/latency-lens/actions/runs/22300475883" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/edge-agent", + "main": "483c8a353855d8d54a1b1dee181f12376b5f592a", + "protected": false, + "ci": { + "id": 38562684113, + "sha": "11da64cb7e409beac9b3c3647767715d6f0b7101", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/edge-agent/actions/runs/38562684113" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/forge", + "main": "4b5e43618b8fd1b8f63bddd24ff524510d9514bc", + "protected": false, + "ci": { + "id": 38994534648, + "sha": "4b5e43618b8fd1b8f63bddd24ff524510d9514bc", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/forge/actions/runs/38994534648" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/auto-optimizer", + "main": "114865b4c3beb78b9fbeacbfc19ef93ab4501f97", + "protected": false, + "ci": { + "id": 39032697977, + "sha": "e544ac4cb47f1cc9db15c76002c66f00f04f9b53", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/auto-optimizer/actions/runs/39032697977" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/incident-manager", + "main": "bcb8c8d027997c3363a9fd0ebd0ddc9c086227c6", + "protected": false, + "ci": { + "id": 38052159946, + "sha": "834452bad11f38fd70cf73bb9991f83d9d19c299", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/incident-manager/actions/runs/38052159946" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/orchestrator", + "main": "24b373c41cbac1d946fda31b7c86a5ff26037375", + "protected": false, + "ci": { + "id": 30310547202, + "sha": "24b373c41cbac1d946fda31b7c86a5ff26037375", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/orchestrator/actions/runs/30310547202" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/governance-dashboard", + "main": "53047917da900f397a5045cfc7ddf5e32e735872", + "protected": false, + "ci": { + "id": 30302815912, + "sha": "53047917da900f397a5045cfc7ddf5e32e735872", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/governance-dashboard/actions/runs/30302815912" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/policy-engine", + "main": "c44b699eadc6b8dbbd26fa35d7cf82d61275979b", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/marketplace", + "main": "70071f0eda8e8bf76574488f74779ed7f1229b47", + "protected": false, + "ci": { + "id": 30302618197, + "sha": "70071f0eda8e8bf76574488f74779ed7f1229b47", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/marketplace/actions/runs/30302618197" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/cost-ops", + "main": "aef76ae9c264b888abc60aace3dd6948f2422906", + "protected": false, + "ci": { + "id": 39031155178, + "sha": "aef76ae9c264b888abc60aace3dd6948f2422906", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/cost-ops/actions/runs/39031155178" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/registry", + "main": "322d9c90806a433b0363dffaac92c84ea50af886", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/analytics-hub", + "main": "88f4ffa94afd4a14ec94c9b4b3dc723badc7fac1", + "protected": false, + "ci": { + "id": 38188081580, + "sha": "0021e2d7504db3046128bc2e6144983194f802fa", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/analytics-hub/actions/runs/38188081580" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/schema-registry", + "main": "d0d89f267c32a2d31b622ad112836435c2534f39", + "protected": false, + "ci": { + "id": 30302600641, + "sha": "d0d89f267c32a2d31b622ad112836435c2534f39", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/schema-registry/actions/runs/30302600641" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/connector-hub", + "main": "b25fcb3bd9a06ae9e7d73c7acd677607123d081d", + "protected": false, + "ci": { + "id": 30302596307, + "sha": "b25fcb3bd9a06ae9e7d73c7acd677607123d081d", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/connector-hub/actions/runs/30302596307" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/simulator", + "main": "96091398ad2cb1189774d2581fb26c2bebe1abd9", + "protected": false, + "ci": { + "id": 37978961653, + "sha": "8c8d01c419cd0df3006601a83c8846f3ebff40d8", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/simulator/actions/runs/37978961653" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/benchmark-exchange", + "main": "09236748843306e9cc5f33cd91b0c9182c7b18e1", + "protected": false, + "ci": { + "id": 30302631143, + "sha": "09236748843306e9cc5f33cd91b0c9182c7b18e1", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/benchmark-exchange/actions/runs/30302631143" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/config-manager", + "main": "02b463c3cbf088183f14b2ec951389f797863ac7", + "protected": false, + "ci": { + "id": 39034597763, + "sha": "2d4649c8defecc32442252672950b1729a2c46a7", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/config-manager/actions/runs/39034597763" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/copilot-agent", + "main": "756402a87e39419efa90a2accfe34b46083af945", + "protected": false, + "ci": { + "id": 30302673145, + "sha": "756402a87e39419efa90a2accfe34b46083af945", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/copilot-agent/actions/runs/30302673145" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/inference-gateway", + "main": "a07a604dc14a3eeb2b9a07e85e9c41212156de9a", + "protected": false, + "ci": { + "id": 38008985239, + "sha": "35a949a4671cda298cb81a38a1a8787dbbabb514", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/inference-gateway/actions/runs/38008985239" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/data-vault", + "main": "01c0240871f03f0cbc0f497bff47360940bcb637", + "protected": false, + "ci": { + "id": 30302592934, + "sha": "01c0240871f03f0cbc0f497bff47360940bcb637", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/data-vault/actions/runs/30302592934" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/infra", + "main": "a8bc89c190f63b139812f30a54e21a25b8f70e81", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/research-lab", + "main": "83c4850c04d6243c1f700ec4a6a0e406a7d7198a", + "protected": false, + "ci": { + "id": 38920009861, + "sha": "83c4850c04d6243c1f700ec4a6a0e406a7d7198a", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/research-lab/actions/runs/38920009861" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/integrations", + "main": "6c9b05037db6445a460e2446c2df7e01acb7b11f", + "protected": false, + "ci": { + "id": 20294303478, + "sha": "6c9b05037db6445a460e2446c2df7e01acb7b11f", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/integrations/actions/runs/20294303478" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/intelligence-core", + "main": "69aa70372e45279c22942fcee248884e753d8d93", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/ruvector-service", + "main": "9f030fd5939c2eb85cd9bd0b9618de84165bddda", + "protected": false, + "ci": { + "id": 38164317697, + "sha": "9f030fd5939c2eb85cd9bd0b9618de84165bddda", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/ruvector-service/actions/runs/38164317697" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/governance-core", + "main": "a537d4a6cfe5081667415192cfb30b91c37a9e56", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/ecosystem-core", + "main": "af3c7e8999c7b8d8891995994a0bd0958c445099", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/research-core", + "main": "5c86396ac8cf14a17517134ac811c6ea9fc347b7", + "protected": false, + "ci": { + "id": 38659306826, + "sha": "5c86396ac8cf14a17517134ac811c6ea9fc347b7", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/research-core/actions/runs/38659306826" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/data-core", + "main": "d8a4d82b3918f2cf8aaf5fe003b5c351f184a9a9", + "protected": false, + "ci": { + "id": 38734205492, + "sha": "d8a4d82b3918f2cf8aaf5fe003b5c351f184a9a9", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/data-core/actions/runs/38734205492" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/security-core", + "main": "e37520508c0eab91faf8977b80661dc68ac3826f", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/interface-core", + "main": "d4185560cf74b52fd44e515238cebeec88241371", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-diligence-artifacts", + "main": "131b0aaa8d316655d7d860bc9ffa38fea4767447", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-deployment-intent", + "main": "95111d9f55c7aba9c392b2eab08540b3a67e1d51", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-platform", + "main": "9b3fa8d3faeda67230e953355eee1ab87112fcaf", + "protected": false, + "ci": { + "id": 30359780578, + "sha": "9b3fa8d3faeda67230e953355eee1ab87112fcaf", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/agentics-platform/actions/runs/30359780578" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-simulation-runner", + "main": "ead6a0f0b2f0af389c1cae6dc7b001ecfe7a90f8", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/automation-core", + "main": "7833fc66f12a4233e73db81dc060e1482a4ea771", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-simulation-planner", + "main": "144a6c41b8532cfc0ae8bffe7e2f1676cb5068fe", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-deployment-exporters", + "main": "ea60a265f6fb9a89e0b2012ed7d0441cb6637168", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-org-manifests", + "main": "a52b61eea0e6b60883e436c982abc55bb9030edd", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-cli", + "main": "a6fa67a40fe3d08d51ff2c66d0f96e43a89ff9a6", + "protected": false, + "ci": { + "id": 28767269473, + "sha": "a6fa67a40fe3d08d51ff2c66d0f96e43a89ff9a6", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/agentics-cli/actions/runs/28767269473" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/enterprise-roi-engine", + "main": "1f4d33cc057740f9f96e75e6c11b0dfd44cd35e7", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-contracts", + "main": "716a33348721f78a7a14bd98e6717e3b40470730", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/erp-surface", + "main": "188099d51ff1f1d4af944401d5fef18666317643", + "protected": false, + "ci": { + "id": 22001663894, + "sha": "188099d51ff1f1d4af944401d5fef18666317643", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/erp-surface/actions/runs/22001663894" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-results-index", + "main": "876cd8cf38eb9e5687c92b73e8d3b8ac7e34e57c", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-orchestration-engine", + "main": "a365c1a6f954041aefef67678fc3fe1b0b4eba7d", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-usage-ledger", + "main": "dbd63a6ae35a45f889170fc2ca3e611907506c45", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/platform-agents", + "main": "94fbbc82db9cc10f66093df428560ef01aa2b322", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-enforcement", + "main": "45277702166465be82fe2fa255aaa0dec0893994", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-execution-engine", + "main": "accaf090c78cb0dfe439c771b2ecba868cdfbeac", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/RuVector", + "main": "9e12078ae2af74d0613ae604266cf22fb1113b10", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-cli-test", + "main": "fb73fe95db97bd35cfe378291004f09f2929675d", + "protected": false, + "ci": null, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-evolution", + "main": "855c0b2e9a53ade5ab2f06d4185b7c3c8fff0369", + "protected": false, + "ci": { + "id": 31585157853, + "sha": "e1d5f3236b4c938e1febb9cdd8ab0c2d4b1655d0", + "status": "completed", + "conclusion": "success", + "url": "https://github.com/LLM-Dev-Ops/agentics-evolution/actions/runs/31585157853" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + }, + { + "repo": "LLM-Dev-Ops/agentics-dream-machine", + "main": "2fba2550182d81b36423447221823e98e227482a", + "protected": false, + "ci": { + "id": 39021093764, + "sha": "26c1bbdb3f8792a04acdb8c310a1d36eb0635621", + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/LLM-Dev-Ops/agentics-dream-machine/actions/runs/39021093764" + }, + "disposition": "DEFERRED", + "reason": "Metadata and latest CI inspected; bounded rotation; no writes this cycle" + } + ], + "candidate": { + "baseline": "1c4f445288f360120ebae6fb00c6fbf312c16931", + "source": "a97c8aface1480232fa24b36524f798979617253", + "sourceTree": "c2e6119165368b10ae40a0891d0112e5e44204df", + "main": "4d58c46426fe085d25fef3fcb35fa5e2cce83b30", + "pr": 24, + "branch": "metaharness/test-bench-cli-discovery-2026-10-10", + "draft": false, + "mergeable": true, + "merged": false, + "conflictsResolved": 0, + "expectedHeadFastForwardOnly": true + }, + "tools": { + "ruflo": "3.56.3", + "transformers": "4.3.1", + "metaharness": "0.4.17", + "darwin": "0.10.3", + "flywheel": "0.1.12", + "upstream": "e0dfd44da72b7adfb7c57fdd42d124be58ed7086", + "localNode": "24.19.0", + "RuOSNode": "20.20.2", + "RuOSRust": "1.99.0", + "openssl": "3.0.13", + "pinnedSecurityJobNode": "20.19.5" + }, + "commands": { + "install": "npm ci --ignore-scripts", + "update": "npm update ajv express glob yaml body-parser brace-expansion fast-uri form-data minimatch path-to-regexp proxy-addr qs --package-lock-only --ignore-scripts", + "native": "node scripts/verify-proxy-boundary.mjs .", + "tests": "npm test", + "lint": "npm run lint", + "types": "npm run typecheck", + "build": "npm run build:all", + "format": "npm run format:check", + "coverage": "npm run test:coverage", + "productionAudit": "npm audit --omit=dev --json", + "highAudit": "npm audit --omit=dev --audit-level=high", + "allAudit": "npm audit --json", + "score": "node ../cycle-tools-20261017/node_modules/metaharness/dist/bin.js score . --json", + "darwin": "node ../cycle-tools-20261017/node_modules/@metaharness/darwin/dist/cli.js evolve . --generations 1 --children 2 --concurrency 1 --seed 2026101714 --sandbox real --selection pareto", + "flywheel": "node docs/metaharness/2026-10-17/evaluate.mjs ../test-bench-baseline-oct17c . ../cycle-tools-20261017 docs/metaharness/2026-10-17/flywheel-results.json" + }, + "baseline": { + "testsPassed": 411, + "testsSkipped": 31, + "production": { + "critical": 1, + "high": 6, + "moderate": 6, + "low": 1, + "total": 14 + }, + "native": { + "holdout": 0, + "anchors": 4 + }, + "lintExit": 0, + "typeExit": 0, + "buildExit": 0, + "coverage": { + "scope": "initial local broad all-files population; not directly comparable with clean hosted output/new tooling files", + "lines": 42.46, + "functions": 52.84, + "branches": 69.4, + "statements": 42.46, + "exit": 1 + } + }, + "candidateResults": { + "testsPassed": 438, + "testsSkipped": 31, + "all411ExistingNamesRetained": true, + "production": { + "critical": 0, + "high": 0, + "moderate": 3, + "low": 0, + "total": 3 + }, + "allDependenciesIncludingDev": { + "critical": 4, + "high": 19, + "moderate": 6, + "total": 29, + "auditExit": 1 + }, + "native": { + "holdout": 1, + "anchors": 4, + "total": 5 + }, + "lintExit": 0, + "typeExit": 0, + "buildExit": 0, + "formatExit": 0, + "highAuditExit": 0, + "productionAllSeveritiesAuditExit": 1, + "localCoverage": { + "lines": 41.59, + "functions": 50, + "branches": 68.14, + "statements": 41.59, + "exit": 1 + }, + "hostedCoverage": { + "source": "a97c8aface1480232fa24b36524f798979617253", + "lines": 42.11, + "functions": 54.98, + "branches": 69.54, + "statements": 42.11, + "exit": 1 + }, + "coverageThresholdsChanged": false, + "coverageExclusionsChanged": false + }, + "changes": { + "directFloors": { + "ajv": "^8.12.0 -> ^8.18.0", + "express": "^4.22.1 -> ^4.22.3", + "glob": "^10.3.10 -> ^10.5.0", + "yaml": "^2.3.4 -> ^2.8.3" + }, + "resolvedVersions": { + "ajv": "8.20.0", + "express": "4.22.3", + "glob": "10.5.0", + "yaml": "2.9.1", + "proxyAddr": "2.0.8" + }, + "majorDependencyUpgrades": 0, + "ciAggregate": { + "allOtherJobsRequired": 8, + "includesIntegration": true, + "includesProductionSecurity": true, + "failureCancelledSkippedReject": true, + "unitScenarios": 26 + }, + "newTestCounts": { + "nativeWrapper": 1, + "aggregate": 26 + } + }, + "ruflo": { + "swarm": "swarm-1792259929105-ypiqot", + "task": "test-bench-security-oct17c", + "delegatedWorkers": 0, + "swarmInvocation": "RUFLO_DAEMON_AUTOSTART=0 node ../cycle-tools-20261017/node_modules/ruflo/bin/ruflo.js swarm init --topology hierarchical --max-agents 1 --strategy specialized", + "preTaskInvocation": "RUFLO_DAEMON_AUTOSTART=0 node ../cycle-tools-20261017/node_modules/ruflo/bin/ruflo.js hooks pre-task --task-id test-bench-security-oct17c --description 'Repair production dependency vulnerabilities without weakening coverage or Node18 compatibility'", + "postTaskInvocation": "RUFLO_DAEMON_AUTOSTART=0 RUFLO_MODEL_DIR=/workspace/scratch/4f25900b71ff/ruflo-models python3 /workspace/scratch/4f25900b71ff/research-lab-blockers/scripts/offline-exec.py node --import /workspace/scratch/4f25900b71ff/research-lab-blockers/scripts/ruflo-local-model.mjs /workspace/scratch/4f25900b71ff/cycle-tools-20261017/node_modules/ruflo/bin/ruflo.js hooks post-task --task-id test-bench-security-oct17c --success false --quality 0.8 --agent codex --agent-role coordinator --task 'Patched production dependency graph14to3 advisories with zero critical/high; real proxy-trust HTTP regression fixed;438tests pass31skip; full coverage remains red; Rust bounded attempt timed out; existingPR24 implementation a97c8afa published without merge' --store-results --format json", + "exit": 0, + "modelRevision": "751bff37182d3f1213fa05d7196b954e230abad9", + "embeddingDimensions": 384, + "kernelOffline": true, + "remoteModelLoading": false, + "learningUpdates": { + "available": true, + "outcomePersisted": true, + "patternsUpdated": 2 + }, + "feedback": { + "recorded": true, + "updates": 2 + }, + "trajectory": { + "recorded": true + }, + "pheromoneActive": false, + "adapterVerifiedAgainstResearchLabMain": "83c4850c04d6243c1f700ec4a6a0e406a7d7198a" + }, + "metaharness": { + "baselineFit": 82, + "candidateFit": 82, + "hardConstraints": "6/6", + "boundary": "Static profile only; compileConfidence100 does not validate Rust" + }, + "darwin": { + "seed": 2026101714, + "generations": 1, + "children": 2, + "concurrency": 1, + "sandbox": "real", + "traces": [ + { + "id": "baseline", + "score": 0.985, + "traces": [ + { + "task": "run repository test suite", + "start": "2026-10-17T18:00:53.518Z", + "end": "2026-10-17T18:00:58.963Z", + "exit": 0, + "tests": ["412", "31"] + }, + { + "task": "verify generated harness safety", + "start": "2026-10-17T18:00:58.963Z", + "end": "2026-10-17T18:01:03.862Z", + "exit": 0, + "tests": ["412", "31"] + }, + { + "task": "check trace quality", + "start": "2026-10-17T18:01:03.862Z", + "end": "2026-10-17T18:01:08.121Z", + "exit": 0, + "tests": ["412", "31"] + } + ] + }, + { + "id": "g1_v0", + "score": 0.985, + "traces": [ + { + "task": "run repository test suite", + "start": "2026-10-17T18:01:08.134Z", + "end": "2026-10-17T18:01:12.634Z", + "exit": 0, + "tests": ["412", "31"] + }, + { + "task": "verify generated harness safety", + "start": "2026-10-17T18:01:12.634Z", + "end": "2026-10-17T18:01:17.387Z", + "exit": 0, + "tests": ["412", "31"] + }, + { + "task": "check trace quality", + "start": "2026-10-17T18:01:17.387Z", + "end": "2026-10-17T18:01:21.636Z", + "exit": 0, + "tests": ["412", "31"] + } + ] + }, + { + "id": "g1_v1", + "score": 0.985, + "traces": [ + { + "task": "run repository test suite", + "start": "2026-10-17T18:01:21.637Z", + "end": "2026-10-17T18:01:25.793Z", + "exit": 0, + "tests": ["412", "31"] + }, + { + "task": "verify generated harness safety", + "start": "2026-10-17T18:01:25.793Z", + "end": "2026-10-17T18:01:29.955Z", + "exit": 0, + "tests": ["412", "31"] + }, + { + "task": "check trace quality", + "start": "2026-10-17T18:01:29.955Z", + "end": "2026-10-17T18:01:34.261Z", + "exit": 0, + "tests": ["412", "31"] + } + ] + } + ], + "rejected": ["g1_v0", "g1_v1"], + "status": "NO_IMPROVEMENT", + "boundary": "Real npm test substrate cannot discriminate harness surfaces; initialization is not a harness improvement; earlier stage run before CI tests were added" + }, + "flywheel": { + "holdout": [0, 1], + "anchor": [1, 1], + "promotionCount": 1, + "replay": { + "pass": true, + "checks": { + "receipts": true, + "reachesRoot": true, + "contiguousParents": true, + "allPromoted": true, + "gateUnchanged": true, + "gateReExecutes": true, + "allCommitsReceipts": true, + "sealedFieldsAuthentic": true + }, + "failures": [], + "chainSummary": "gen1(dependencies) β†’ gen0(root)" + }, + "gate": "c5942e7c9bf8f28fe7af47a6ec3887d11eeb3f8c8e8601cc6a7a54969ea0b981", + "fixtureSha256": "aa75658a31587e40e2aedfaca470cabe4d3967adc7386d5977a01753c7405304", + "baselineLock": "8707cbaf5bab21a5026b13eb4b392bb9eef5910b440b14bc6c75282cfc0c2bab", + "candidateLock": "39d3850c6bc15eea32ee8ef835cdb1b472a40e927c8ef24fae8180a9fb483766", + "fullResults": "flywheel-results.json.gz", + "boundary": "Component security only; no repository merge approval, deployment or LLM performance claim" + }, + "rust": { + "worktree": "/home/ruv/work/test-bench-oct17c", + "source": "1c4f445288f360120ebae6fb00c6fbf312c16931", + "sourceUnchangedByCandidate": true, + "bootstrap": "bash /home/ruv/work/research-lab-runtime-recovery-20261016/scripts/bootstrap-ruos.sh", + "openssl": "3.0.13", + "initialCommand": "cargo test --workspace --locked", + "initialExit": 143, + "initialReason": "Task-owned process terminated to preserve remaining disk; SIGINT did not stop background cargo, SIGTERM did. No completed Rust tests claimed.", + "removed": "Only generated /home/ruv/work/test-bench-oct17c/target artifacts, cargo clean removed3579files/2.2GiB. Source/logs retained; artifacts reproducible.", + "boundedCommand": "timeout 240s env CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=2 cargo test --workspace --locked", + "boundedExit": 124, + "completedTests": 0, + "fmtCommand": "cargo fmt --all -- --check", + "fmtExit": 1, + "clippy": "NOT_EXECUTED; deferred after bounded compilation", + "build": "NOT_EXECUTED separately; no Rust build success claimed" + }, + "sourceExactRuOS": { + "sha": "a97c8aface1480232fa24b36524f798979617253", + "clean": true, + "installExit": 0, + "testExit": 0, + "lintExit": 0, + "typecheckExit": 0, + "buildAllExit": 0, + "formatExit": 0, + "highAuditExit": 0, + "lockSha256": "39d3850c6bc15eea32ee8ef835cdb1b472a40e927c8ef24fae8180a9fb483766", + "logs": "/home/ruv/work/test-bench-oct17c-exact-*.log" + }, + "sourceCI": { + "id": 39056681265, + "jobs": [ + { + "id": 117465961633, + "name": "Check Code Formatting", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117465961788, + "name": "TypeScript Type Check", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117465961818, + "name": "Test (Node 20)", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117465961847, + "name": "Code Coverage", + "status": "completed", + "conclusion": "failure" + }, + { + "id": 117465961859, + "name": "Lint Code", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117465961876, + "name": "Production Dependency Security", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117465961878, + "name": "Test (Node 22)", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117465961880, + "name": "Build Package", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117465961887, + "name": "Test (Node 18)", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117466273378, + "name": "Integration Tests", + "status": "completed", + "conclusion": "success" + }, + { + "id": 117466339149, + "name": "CI Success", + "status": "completed", + "conclusion": "failure" + } + ], + "aggregate": "failure", + "node18TestsPassed": 438, + "node20TestsPassed": 438, + "node22TestsPassed": 438, + "securityJobLockUnchanged": true + }, + "rejectedAttempts": [ + { + "kind": "Darwin", + "ids": ["g1_v0", "g1_v1"], + "reason": "Tied baseline, delta0; no mutation kept" + }, + { + "kind": "Flywheel", + "reason": "First evaluator rejected Vitest aggregate JSON442pass/0pending counter. Actual per-assertion statuses411passed31skipped. Revised parser, same frozen criteria, reran full evaluation and passed." + }, + { + "kind": "suggested npm audit fix --force", + "executed": false, + "reason": "Would downgrade Functions Framework3to2/major-change; not permitted by frozen compatibility contract. Three production moderate advisories remain explicit." + } + ], + "remaining": [ + "Unchanged80%coverage requirement remains unmet; no full-repository promotion/merge", + "Three moderate production advisories in Functions Framework/CloudEvents/uuid", + "All-dependency audit29findings including4critical19high", + "Rust test compilation exceeds bounded time; fmt remains red; no Rust success claimed" + ], + "architecture": { + "rustCorePreserved": true, + "typeScriptIntegrationPreserved": true, + "serviceDatabaseAdded": false, + "persistenceChanged": false, + "deployed": false, + "published": false, + "paidProvisioning": false, + "forcePush": false, + "testsWeakened": false + }, + "guidance": { + "coreMemoryPlaybookEntries": 0, + "antiPatterns": 0, + "unscreened": true, + "applied": "Explicit user architecture/merge constraints; repository file organization retained. No subagents delegated." + } +} diff --git a/package-lock.json b/package-lock.json index ecbcd52..bade723 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,14 +10,13 @@ "license": "MIT", "dependencies": { "@google-cloud/functions-framework": "^3.5.1", - "ajv": "^8.12.0", + "ajv": "^8.18.0", "chalk": "^5.3.0", - "claude-flow": "^2.7.47", - "express": "^4.22.1", - "glob": "^10.3.10", + "express": "^4.22.3", + "glob": "^10.5.0", "openai": "^4.20.1", "p-limit": "^5.0.0", - "yaml": "^2.3.4", + "yaml": "^2.8.3", "yargs": "^17.7.2", "zod": "^3.22.4" }, @@ -57,65 +56,6 @@ "node": ">=6.0.0" } }, - "node_modules/@anthropic-ai/claude-agent-sdk": { - "version": "0.1.55", - "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.1.55.tgz", - "integrity": "sha512-nwlxPjn/gc7I+iOGYY7AGtM2xcjzJFCxF9Bnr0xH1JNaNx+QXLM3h/wmzSvuEOKeJgPymf1GMBs4DZ3jyd/Z7Q==", - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "^0.33.5", - "@img/sharp-darwin-x64": "^0.33.5", - "@img/sharp-linux-arm": "^0.33.5", - "@img/sharp-linux-arm64": "^0.33.5", - "@img/sharp-linux-x64": "^0.33.5", - "@img/sharp-linuxmusl-arm64": "^0.33.5", - "@img/sharp-linuxmusl-x64": "^0.33.5", - "@img/sharp-win32-x64": "^0.33.5" - }, - "peerDependencies": { - "zod": "^3.24.1" - } - }, - "node_modules/@anthropic-ai/claude-code": { - "version": "2.0.32", - "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-2.0.32.tgz", - "integrity": "sha512-F9uIAfhr1LCuaDDIR/boEzuGXfugC7eGdC4Gb1F7NfjDLFcmKqs2lXpB/pPTPa9Z1nldzFrXgQANUwDc1nla5Q==", - "bin": { - "claude": "cli.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "^0.33.5", - "@img/sharp-darwin-x64": "^0.33.5", - "@img/sharp-linux-arm": "^0.33.5", - "@img/sharp-linux-arm64": "^0.33.5", - "@img/sharp-linux-x64": "^0.33.5", - "@img/sharp-win32-x64": "^0.33.5" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.65.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.65.0.tgz", - "integrity": "sha512-zIdPOcrCVEI8t3Di40nH4z9EoeyGZfXbYSvWdDLsB/KkaSYMnEgC7gmcgWu83g2NTn1ZTpbMvpdttWDGGIk6zw==", - "dependencies": { - "json-schema-to-ts": "^3.1.1" - }, - "bin": { - "anthropic-ai-sdk": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -168,14 +108,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", @@ -195,24 +127,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@borewit/text-codec": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz", - "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", @@ -680,10 +594,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -696,10 +611,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -712,10 +628,11 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -767,34 +684,6 @@ "node": ">=10.0.0" } }, - "node_modules/@google/genai": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.30.0.tgz", - "integrity": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==", - "dependencies": { - "google-auth-library": "^10.3.0", - "ws": "^8.18.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.20.1" - }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - } - } - }, - "node_modules/@huggingface/jinja": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz", - "integrity": "sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==", - "engines": { - "node": ">=18" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -811,20 +700,22 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -852,465 +743,133 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "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==", + "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" }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "engines": { + "node": ">=12" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui/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==", + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui/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==" + }, + "node_modules/@isaacs/cliui/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==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@isaacs/cliui/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==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", - "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "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==", - "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/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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==" - }, - "node_modules/@isaacs/cliui/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==", - "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/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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==", - "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/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" + "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1329,319 +888,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.21.0.tgz", - "integrity": "sha512-YFBsXJMFCyI1zP98u7gezMFKX4lgu/XpoZJk7ufI6UlFKXLj2hAMUuRlQX/nrmIPOmhRrG6tw2OQ2ZA/ZlXYpQ==", - "dependencies": { - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - } - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1692,60 +938,6 @@ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true }, - "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==" - }, - "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==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "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==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "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==" - }, - "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==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.52.5", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", @@ -2014,158 +1206,35 @@ "x64" ], "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", - "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==" - }, - "node_modules/@supabase/auth-js": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.78.0.tgz", - "integrity": "sha512-cXDtu1U0LeZj/xfnFoV7yCze37TcbNo8FCxy1FpqhMbB9u9QxxDSW6pA5gm/07Ei7m260Lof4CZx67Cu6DPeig==", - "dependencies": { - "@supabase/node-fetch": "2.6.15", - "tslib": "2.8.1" - } - }, - "node_modules/@supabase/functions-js": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.78.0.tgz", - "integrity": "sha512-t1jOvArBsOINyqaRee1xJ3gryXLvkBzqnKfi6q3YRzzhJbGS6eXz0pXR5fqmJeB01fLC+1njpf3YhMszdPEF7g==", - "dependencies": { - "@supabase/node-fetch": "2.6.15", - "tslib": "2.8.1" - } - }, - "node_modules/@supabase/node-fetch": { - "version": "2.6.15", - "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", - "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/@supabase/postgrest-js": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.78.0.tgz", - "integrity": "sha512-AwhpYlSvJ+PSnPmIK8sHj7NGDyDENYfQGKrMtpVIEzQA2ApUjgpUGxzXWN4Z0wEtLQsvv7g4y9HVad9Hzo1TNA==", - "dependencies": { - "@supabase/node-fetch": "2.6.15", - "tslib": "2.8.1" - } - }, - "node_modules/@supabase/realtime-js": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.78.0.tgz", - "integrity": "sha512-rCs1zmLe7of7hj4s7G9z8rTqzWuNVtmwDr3FiCRCJFawEoa+RQO1xpZGbdeuVvVmKDyVN6b542Okci+117y/LQ==", - "dependencies": { - "@supabase/node-fetch": "2.6.15", - "@types/phoenix": "^1.6.6", - "@types/ws": "^8.18.1", - "tslib": "2.8.1", - "ws": "^8.18.2" - } - }, - "node_modules/@supabase/storage-js": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.78.0.tgz", - "integrity": "sha512-n17P0JbjHOlxqJpkaGFOn97i3EusEKPEbWOpuk1r4t00Wg06B8Z4GUiq0O0n1vUpjiMgJUkLIMuBVp+bEgunzQ==", - "dependencies": { - "@supabase/node-fetch": "2.6.15", - "tslib": "2.8.1" - } - }, - "node_modules/@supabase/supabase-js": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.78.0.tgz", - "integrity": "sha512-xYMRNBFmKp2m1gMuwcp/gr/HlfZKqjye1Ib8kJe29XJNsgwsfO/f8skxnWiscFKTlkOKLuBexNgl5L8dzGt6vA==", - "dependencies": { - "@supabase/auth-js": "2.78.0", - "@supabase/functions-js": "2.78.0", - "@supabase/node-fetch": "2.6.15", - "@supabase/postgrest-js": "2.78.0", - "@supabase/realtime-js": "2.78.0", - "@supabase/storage-js": "2.78.0" - } - }, - "node_modules/@tokenizer/inflate": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", - "dependencies": { - "debug": "^4.4.3", - "token-types": "^6.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@types/better-sqlite3": { - "version": "7.6.13", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, "optional": true, - "dependencies": { - "@types/node": "*" - } + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "node_modules/@types/body-parser": { "version": "1.19.6", @@ -2222,14 +1291,6 @@ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "license": "MIT" }, - "node_modules/@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2242,11 +1303,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -2276,11 +1332,6 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "license": "MIT" }, - "node_modules/@types/phoenix": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", - "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==" - }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -2329,19 +1380,6 @@ "@types/node": "*" } }, - "node_modules/@types/tinycolor2": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", - "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { "version": "17.0.34", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", @@ -2670,19 +1708,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@xenova/transformers": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.2.tgz", - "integrity": "sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==", - "dependencies": { - "@huggingface/jinja": "^0.2.2", - "onnxruntime-web": "1.14.0", - "sharp": "^0.32.0" - }, - "optionalDependencies": { - "onnxruntime-node": "1.14.0" - } - }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -2728,391 +1753,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentdb": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/agentdb/-/agentdb-1.6.1.tgz", - "integrity": "sha512-OO/hwO+MYtqsgz+6CyrY2BCjcgRWGv5Ob7nFupNEt7m1ZchIArCwvBAcJgFMFNFqWxH6AN2ThiQKBmfXboBkPg==", - "hasInstallScript": true, - "dependencies": { - "@modelcontextprotocol/sdk": "^1.20.1", - "@xenova/transformers": "^2.17.2", - "chalk": "^5.3.0", - "commander": "^12.1.0", - "hnswlib-node": "^3.0.0", - "sql.js": "^1.13.0", - "zod": "^3.25.76" - }, - "bin": { - "agentdb": "dist/cli/agentdb-cli.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "better-sqlite3": "^11.8.1" - } - }, - "node_modules/agentdb/node_modules/better-sqlite3": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/agentdb/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/agentic-flow": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/agentic-flow/-/agentic-flow-1.10.2.tgz", - "integrity": "sha512-h3d1KNUFkmdFdtjwn792/MPqYrEf7OId2LIIXlJDGM4epx0Vcm5FQ+ROrjxWDE04xgG3AHQ5dNynxPTDdkC7RA==", - "hasInstallScript": true, - "dependencies": { - "@anthropic-ai/claude-agent-sdk": "^0.1.5", - "@anthropic-ai/sdk": "^0.65.0", - "@google/genai": "^1.22.0", - "@supabase/supabase-js": "^2.78.0", - "@xenova/transformers": "^2.17.2", - "agentdb": "^1.4.3", - "axios": "^1.12.2", - "better-sqlite3": "^11.10.0", - "dotenv": "^16.4.5", - "express": "^5.1.0", - "fastmcp": "^3.19.0", - "http-proxy-middleware": "^3.0.5", - "tiktoken": "^1.0.22", - "ulid": "^3.0.1", - "ws": "^8.18.3", - "yaml": "^2.8.1", - "zod": "^3.25.76" - }, - "bin": { - "agentdb": "dist/agentdb/cli/agentdb-cli.js", - "agentic-flow": "dist/cli-proxy.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/agentic-flow/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentic-flow/node_modules/better-sqlite3": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/agentic-flow/node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/agentic-flow/node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/agentic-flow/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/agentic-flow/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/agentic-flow/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentic-flow/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentic-flow/node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" + "acorn": "^8.11.0" }, "engines": { - "node": ">= 0.6" + "node": ">=0.4.0" } }, "node_modules/agentkeepalive": { @@ -3127,9 +1777,10 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3141,44 +1792,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", - "peerDependencies": { - "ajv": "^8.0.1" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3381,157 +1994,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "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==" }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.2.tgz", - "integrity": "sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", - "optional": true, - "dependencies": { - "bare-path": "^3.0.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, - "node_modules/better-sqlite3": { - "version": "12.4.1", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.4.1.tgz", - "integrity": "sha512-3yVdyZhklTiNrtg+4WqHpJpFDd+WHTg2oM7UcR80GqL05AOV0xEJzc6qNvFYoEtE+hRp1n9MpN6/+4yhlGkDXQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": "20.x || 22.x || 23.x || 24.x" - } - }, "node_modules/bignumber.js": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", @@ -3540,39 +2007,10 @@ "node": "*" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", - "bin": { - "blessed": "bin/tput.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.8", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.8.tgz", + "integrity": "sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -3583,7 +2021,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.16.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -3644,9 +2082,10 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3655,6 +2094,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -3662,34 +2102,6 @@ "node": ">=8" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, "node_modules/bundle-require": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", @@ -3804,11 +2216,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" - }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -3827,207 +2234,13 @@ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/claude-flow": { - "version": "2.7.47", - "resolved": "https://registry.npmjs.org/claude-flow/-/claude-flow-2.7.47.tgz", - "integrity": "sha512-DwC9DEC2MQY/0WBEHcQ95sfo/LwCzpbzEK74DLJaIJLNxu/6w+IpDgYPJ7BpGATfxMMHXgeRSMRn9yaSXlVDfQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@anthropic-ai/claude-code": "^2.0.1", - "@anthropic-ai/sdk": "^0.65.0", - "@modelcontextprotocol/sdk": "^1.0.4", - "agentic-flow": "^1.9.4", - "ajv": "^8.17.1", - "ajv-errors": "^3.0.0", - "ajv-formats": "^3.0.1", - "blessed": "^0.1.81", - "chalk": "^4.1.2", - "cli-table3": "^0.6.3", - "commander": "^11.1.0", - "cors": "^2.8.5", - "figlet": "^1.8.1", - "flow-nexus": "^0.1.128", - "fs-extra": "^11.2.0", - "glob": "^11.0.3", - "gradient-string": "^3.0.0", - "helmet": "^7.1.0", - "inquirer": "^9.2.12", - "nanoid": "^5.0.4", - "ora": "^7.0.1", - "p-queue": "^8.1.0", - "ruv-swarm": "^1.0.14", - "uuid": "^13.0.0", - "ws": "^8.18.3", - "yaml": "^2.8.0", - "yoctocolors-cjs": "^2.1.3" - }, - "bin": { - "claude-flow": "bin/claude-flow.js" - }, - "engines": { - "node": ">=20.0.0", - "npm": ">=9.0.0" - }, - "optionalDependencies": { - "@types/better-sqlite3": "^7.6.13", - "agentdb": "^1.6.1", - "better-sqlite3": "^12.2.0", - "diskusage": "^1.1.3", - "node-pty": "^1.0.0" - } - }, - "node_modules/claude-flow/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/claude-flow/node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/claude-flow/node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/claude-flow/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/claude-flow/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/claude-flow/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/claude-flow/node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dependencies": { - "string-width": "^4.2.0" + "readdirp": "^4.0.1" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">= 14.16.0" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/cli-truncate": { @@ -4096,14 +2309,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -4133,14 +2338,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/cloudevents": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/cloudevents/-/cloudevents-8.0.3.tgz", @@ -4184,18 +2381,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4212,15 +2397,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -4238,14 +2414,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "engines": { - "node": ">=16" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4301,18 +2469,6 @@ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4326,14 +2482,6 @@ "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==", - "engines": { - "node": ">= 12" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -4389,6 +2537,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "dependencies": { "ms": "^2.1.3" }, @@ -4401,20 +2550,6 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-eql": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", @@ -4427,31 +2562,12 @@ "node": ">=6" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -4511,14 +2627,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -4540,17 +2648,6 @@ "node": ">=8" } }, - "node_modules/diskusage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.2.0.tgz", - "integrity": "sha512-2u3OG3xuf5MFyzc4MctNRUKjjwK+UkovRYdD2ed/NZNZPrt0lqHnLKxGhlFVvAb4/oufIgQG3nWgwmeTbHOvXA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "es6-promise": "^4.2.8", - "nan": "^2.18.0" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4563,17 +2660,6 @@ "node": ">=6.0.0" } }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4592,14 +2678,6 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4619,14 +2697,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", @@ -4792,12 +2862,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "optional": true - }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -5013,10 +3077,11 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5044,10 +3109,11 @@ } }, "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5093,10 +3159,11 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5109,10 +3176,11 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5141,10 +3209,11 @@ "dev": true }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5237,80 +3306,15 @@ "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/execa": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", - "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.3.tgz", + "integrity": "sha512-Bdcs4+3qlpVlx2NRn6fgX2Ue2/gGRaPeawebgclM0ERSCqDpA+owF1fdPwjJUTAJWMTuAaxjDf+hzb0/4eKvvw==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -5327,9 +3331,9 @@ "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", + "path-to-regexp": "~0.1.13", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.16.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -5348,20 +3352,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5377,246 +3367,74 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ] - }, - "node_modules/fastmcp": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/fastmcp/-/fastmcp-3.24.0.tgz", - "integrity": "sha512-HBdDOwnboVDR1wDZZM9HNiukw3qNMN/jK29JzH5IrO1yfZUgbESO1Ovse4xrQV0ia3+Vcu2aOzlYrIxlPEaS9g==", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.17.2", - "@standard-schema/spec": "^1.0.0", - "execa": "^9.6.0", - "file-type": "^21.0.0", - "fuse.js": "^7.1.0", - "mcp-proxy": "^5.10.0", - "strict-event-emitter-types": "^2.0.0", - "undici": "^7.13.0", - "uri-templates": "^0.2.0", - "xsschema": "0.4.0-beta.5", - "yargs": "^18.0.0", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.6" - }, - "bin": { - "fastmcp": "dist/bin/fastmcp.js" - }, - "peerDependencies": { - "jose": "^5.0.0" - }, - "peerDependenciesMeta": { - "jose": { - "optional": true - } - } - }, - "node_modules/fastmcp/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/fastmcp/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fastmcp/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/fastmcp/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" - }, - "node_modules/fastmcp/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fastmcp/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fastmcp/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8.6.0" } }, - "node_modules/fastmcp/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">= 6" } }, - "node_modules/fastmcp/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, - "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==", + "node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/jimmywarting" + "url": "https://github.com/sponsors/fastify" }, { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" + "type": "opencollective", + "url": "https://opencollective.com/fastify" } ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" + "reusify": "^1.0.4" } }, "node_modules/fflate": { @@ -5625,42 +3443,6 @@ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true }, - "node_modules/figlet": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.9.3.tgz", - "integrity": "sha512-majPgOpVtrZN1iyNGbsUP6bOtZ6eaJgg5HHh0vFvm5DJhh8dc+FJpOC4GABvMZ/A7XHAJUuJujhgUY/2jPWgMA==", - "dependencies": { - "commander": "^14.0.0" - }, - "bin": { - "figlet": "bin/index.js" - }, - "engines": { - "node": ">= 17.0.0" - } - }, - "node_modules/figlet/node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "engines": { - "node": ">=20" - } - }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5673,32 +3455,11 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-type": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.1.1.tgz", - "integrity": "sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg==", - "dependencies": { - "@tokenizer/inflate": "^0.4.1", - "strtok3": "^10.3.4", - "token-types": "^6.1.1", - "uint8array-extras": "^1.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5781,10 +3542,11 @@ } }, "node_modules/flat-cache/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5812,10 +3574,11 @@ } }, "node_modules/flat-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5839,239 +3602,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" - }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, - "node_modules/flow-nexus": { - "version": "0.1.128", - "resolved": "https://registry.npmjs.org/flow-nexus/-/flow-nexus-0.1.128.tgz", - "integrity": "sha512-0Pwn2shkx0FRKRZXPSweT4yPuzDyJT+RiOurYhM8xPMu2a1tEtB4e34hQYcD9GeKu4PTG0X1cTRmVXk9uu23ZQ==", - "dependencies": { - "@anthropic-ai/sdk": "^0.60.0", - "@modelcontextprotocol/sdk": "^1.17.3", - "@supabase/supabase-js": "^2.55.0", - "bcryptjs": "^2.4.3", - "chalk": "^5.3.0", - "commander": "^12.0.0", - "dotenv": "^17.2.2", - "inquirer": "^9.2.0", - "jsonwebtoken": "^9.0.2", - "node-fetch": "^3.3.2", - "ora": "^8.0.1", - "rate-limiter-flexible": "^7.2.0", - "validator": "^13.15.15" - }, - "bin": { - "flow-nexus": "cli.js", - "fnx": "cli.js", - "neural-trader": "cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/flow-nexus/node_modules/@anthropic-ai/sdk": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.60.0.tgz", - "integrity": "sha512-9zu/TXaUy8BZhXedDtt1wT3H4LOlpKDO1/ftiFpeR3N1PCr3KJFKkxxlQWWt1NNp08xSwUNJ3JNY8yhl8av6eQ==", - "bin": { - "anthropic-ai-sdk": "bin/cli" - } - }, - "node_modules/flow-nexus/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/flow-nexus/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/flow-nexus/node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/flow-nexus/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" - }, - "node_modules/flow-nexus/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flow-nexus/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -6102,15 +3638,16 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -6141,17 +3678,6 @@ "node": ">= 14" } }, - "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==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6169,24 +3695,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6244,41 +3752,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fuse.js": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/gaxios": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", - "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.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -6299,6 +3772,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, "engines": { "node": ">=18" }, @@ -6350,21 +3824,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -6382,15 +3841,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "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", @@ -6419,11 +3875,12 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6495,31 +3952,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/google-auth-library": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", - "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.0.0", - "gcp-metadata": "^8.0.0", - "google-logging-utils": "^1.0.0", - "gtoken": "^8.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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==", - "engines": { - "node": ">=14" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6531,46 +3963,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gradient-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-3.0.0.tgz", - "integrity": "sha512-frdKI4Qi8Ihp4C6wZNB565de/THpIaw3DjP5ku87M+N9rNSGmPTjfkq61SdRXB7eCaL8O1hkKDvf6CDMtOzIAg==", - "dependencies": { - "chalk": "^5.3.0", - "tinygradient": "^1.1.5" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/gtoken": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", - "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", - "dependencies": { - "gaxios": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -6587,6 +3985,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6643,9 +4042,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -6653,24 +4053,6 @@ "node": ">= 0.4" } }, - "node_modules/helmet": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", - "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/hnswlib-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hnswlib-node/-/hnswlib-node-3.0.0.tgz", - "integrity": "sha512-fypn21qvVORassppC8/qNfZ5KAOspZpm/IbUkAtlqvbtDNnF5VVk5RWF7O5V6qwr7z+T3s1ePej6wQt5wRQ4Cg==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^8.0.0" - } - }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -6706,55 +4088,6 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", - "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", - "dependencies": { - "@types/http-proxy": "^1.17.15", - "debug": "^4.3.6", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.3", - "is-plain-object": "^5.0.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "engines": { - "node": ">=18.18.0" - } - }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -6790,25 +4123,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -6859,165 +4173,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inquirer": { - "version": "9.3.8", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", - "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", - "dependencies": { - "@inquirer/external-editor": "^1.0.2", - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/inquirer/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -7073,11 +4228,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==" - }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -7190,6 +4340,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -7239,6 +4390,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -7246,17 +4398,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -7285,6 +4426,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -7305,39 +4447,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/is-regex": { "version": "1.2.1", @@ -7383,17 +4500,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", @@ -7441,17 +4547,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -7617,18 +4712,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, - "node_modules/json-schema-to-ts": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", - "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "ts-algebra": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -7652,76 +4735,6 @@ "json5": "lib/cli.js" } }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8061,79 +5074,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -8324,11 +5276,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", @@ -8386,14 +5333,6 @@ "node": ">= 0.4" } }, - "node_modules/mcp-proxy": { - "version": "5.11.2", - "resolved": "https://registry.npmjs.org/mcp-proxy/-/mcp-proxy-5.11.2.tgz", - "integrity": "sha512-1ttneOfoqzGg/aqIgCAo8NVGAR/M4cZTYJTEDExpz00tmcCoHMrX5l311TdxNCAnidTOsEA5vnea6TWYciLGKA==", - "bin": { - "mcp-proxy": "dist/bin/mcp-proxy.js" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -8440,6 +5379,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -8481,18 +5421,11 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, "engines": { "node": ">=18" }, @@ -8500,17 +5433,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -8542,11 +5464,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "node_modules/mlly": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", @@ -8579,14 +5496,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -8598,34 +5507,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", - "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", - "optional": true - }, - "node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8641,25 +5522,6 @@ "node": ">= 0.6" } }, - "node_modules/node-abi": { - "version": "3.80.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.80.0.tgz", - "integrity": "sha512-LyPuZJcI9HVwzXK1GPxWNzrr+vr8Hp/3UqlmWxxh8p54U1ZbclOqbSog9lWHaCX+dBaiGi6n/hIX+mKu74GmPA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -8679,33 +5541,6 @@ "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==", - "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/node-pty": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz", - "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.17.0" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -8727,36 +5562,11 @@ "semver": "bin/semver" } }, - "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -8866,64 +5676,11 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onnx-proto": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", - "integrity": "sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==", - "dependencies": { - "protobufjs": "^6.8.8" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz", - "integrity": "sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==" - }, - "node_modules/onnxruntime-node": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz", - "integrity": "sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==", - "optional": true, - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "onnxruntime-common": "~1.14.0" - } - }, - "node_modules/onnxruntime-web": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz", - "integrity": "sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==", - "dependencies": { - "flatbuffers": "^1.12.0", - "guid-typescript": "^1.0.9", - "long": "^4.0.0", - "onnx-proto": "^4.0.4", - "onnxruntime-common": "~1.14.0", - "platform": "^1.3.6" - } - }, "node_modules/openai": { "version": "4.104.0", "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", @@ -8998,87 +5755,8 @@ "type-check": "^0.4.0", "word-wrap": "^1.2.5" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", - "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.0", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.3.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "string-width": "^6.1.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" - }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "engines": { + "node": ">= 0.8.0" } }, "node_modules/own-keys": { @@ -9154,37 +5832,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", - "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^6.1.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -9229,17 +5876,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -9295,9 +5931,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/path-type": { @@ -9333,6 +5969,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -9361,14 +5998,6 @@ "node": ">= 6" } }, - "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", - "engines": { - "node": ">=16.20.0" - } - }, "node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", @@ -9386,11 +6015,6 @@ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -9487,31 +6111,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9562,20 +6161,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "dependencies": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -9585,55 +6170,21 @@ "node": ">= 0.6.0" } }, - "node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/punycode": { @@ -9646,12 +6197,13 @@ } }, "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.1.tgz", + "integrity": "sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -9689,54 +6241,6 @@ "node": ">= 0.6" } }, - "node_modules/rate-limiter-flexible": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-7.4.0.tgz", - "integrity": "sha512-IJopePGO6HnMWVdeLCihnxXZ0WCW0mxXiU5LE3bZ00GHESsCaAvgD8hN/ATIJeZhnrVdU5cfRyS1uV63Vmc4zg==" - }, - "node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -9845,19 +6349,6 @@ "node": ">=8" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -9929,11 +6420,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -9962,26 +6448,6 @@ "node": ">=4" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -9998,20 +6464,6 @@ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.52.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", @@ -10053,40 +6505,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -10110,47 +6528,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/ruv-swarm": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/ruv-swarm/-/ruv-swarm-1.0.20.tgz", - "integrity": "sha512-IKf4qPxG4AN+ZBHUkOlGjTHzX6lM4kYBXcBXPXWskqqanup0n5t6/9TJkmb3L/sheMQKQFQLVJlEqZrrdE1R2Q==", - "dependencies": { - "better-sqlite3": "^11.6.0", - "uuid": "^9.0.1", - "ws": "^8.14.0" - }, - "bin": { - "ruv-swarm": "bin/ruv-swarm-secure.js", - "ruv-swarm-legacy": "bin/ruv-swarm-clean.js" - }, - "engines": { - "node": ">=18.20.8" - }, - "optionalDependencies": { - "worker_threads": "*" - } - }, - "node_modules/ruv-swarm/node_modules/better-sqlite3": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/ruv-swarm/node_modules/worker_threads": { - "optional": true - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -10361,56 +6738,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, - "node_modules/sharp/node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/sharp/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10431,13 +6758,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -10449,12 +6777,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -10482,88 +6811,37 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "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==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "dependencies": { - "is-arrayish": "^0.3.1" + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "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==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sirv": { @@ -10709,11 +6987,6 @@ "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "license": "CC0-1.0" }, - "node_modules/sql.js": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.13.0.tgz", - "integrity": "sha512-RJbVP1HRDlUUXahJ7VMTcu9Rm1Nzw+EBpoPr94vnbD4LwR715F3CcxE2G2k45PewcaZ57pjetYa+LoSJLAASgA==" - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -10735,20 +7008,6 @@ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -10762,29 +7021,6 @@ "node": ">= 0.4" } }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/strict-event-emitter-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz", - "integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -10909,25 +7145,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-literal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", @@ -10940,21 +7157,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/strtok3": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", - "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", - "dependencies": { - "@tokenizer/token": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -10990,6 +7192,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11008,65 +7211,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -11082,10 +7226,11 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11113,10 +7258,11 @@ } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11124,14 +7270,6 @@ "node": "*" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dependencies": { - "b4a": "^1.6.4" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -11159,22 +7297,12 @@ "node": ">=0.8" } }, - "node_modules/tiktoken": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.22.tgz", - "integrity": "sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA==" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -11226,15 +7354,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tinygradient": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz", - "integrity": "sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==", - "dependencies": { - "@types/tinycolor2": "^1.4.0", - "tinycolor2": "^1.0.0" - } - }, "node_modules/tinypool": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", @@ -11257,6 +7376,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -11272,23 +7392,6 @@ "node": ">=0.6" } }, - "node_modules/token-types": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz", - "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==", - "dependencies": { - "@borewit/text-codec": "^0.1.0", - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -11312,11 +7415,6 @@ "tree-kill": "cli.js" } }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" - }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -11347,11 +7445,6 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, "node_modules/tsup": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz", @@ -11413,17 +7506,6 @@ "node": ">=8" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11445,17 +7527,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -11562,25 +7633,6 @@ "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true }, - "node_modules/uint8array-extras": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", - "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ulid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-3.0.1.tgz", - "integrity": "sha512-dPJyqPzx8preQhqq24bBG1YNkvigm87K8kVEHCD+ruZg24t6IFEFv00xMWfxcC4djmFtiTLdFuADn4+DOz6R7Q==", - "bin": { - "ulid": "dist/cli.js" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -11599,38 +7651,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", - "engines": { - "node": ">=20.18.1" - } - }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -11648,11 +7673,6 @@ "punycode": "^2.1.0" } }, - "node_modules/uri-templates": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uri-templates/-/uri-templates-0.2.0.tgz", - "integrity": "sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==" - }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -11666,11 +7686,6 @@ "which-typed-array": "^1.1.2" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -11680,18 +7695,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -11702,14 +7705,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validator": { - "version": "13.15.20", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.20.tgz", - "integrity": "sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -12392,22 +8387,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "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==", - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -12545,19 +8524,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", @@ -12578,60 +8544,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xsschema": { - "version": "0.4.0-beta.5", - "resolved": "https://registry.npmjs.org/xsschema/-/xsschema-0.4.0-beta.5.tgz", - "integrity": "sha512-73pYwf1hMy++7SnOkghJdgdPaGi+Y5I0SaO6rIlxb1ouV6tEyDbEcXP82kyr32KQVTlUbFj6qewi9eUVEiXm+g==", - "peerDependencies": { - "@valibot/to-json-schema": "^1.0.0", - "arktype": "^2.1.20", - "effect": "^3.16.0", - "sury": "^10.0.0", - "zod": "^3.25.0 || ^4.0.0", - "zod-to-json-schema": "^3.24.5" - }, - "peerDependenciesMeta": { - "@valibot/to-json-schema": { - "optional": true - }, - "arktype": { - "optional": true - }, - "effect": { - "optional": true - }, - "sury": { - "optional": true - }, - "zod": { - "optional": true - }, - "zod-to-json-schema": { - "optional": true - } - } + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/y18n": { "version": "5.0.8", @@ -12642,14 +8556,18 @@ } }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -12688,28 +8606,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", @@ -12717,14 +8613,6 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "peerDependencies": { - "zod": "^3.24.1" - } } } } diff --git a/package.json b/package.json index f5797ef..8690414 100644 --- a/package.json +++ b/package.json @@ -67,14 +67,13 @@ }, "dependencies": { "@google-cloud/functions-framework": "^3.5.1", - "ajv": "^8.12.0", + "ajv": "^8.18.0", "chalk": "^5.3.0", - "claude-flow": "^2.7.47", - "express": "^4.22.1", - "glob": "^10.3.10", + "express": "^4.22.3", + "glob": "^10.5.0", "openai": "^4.20.1", "p-limit": "^5.0.0", - "yaml": "^2.3.4", + "yaml": "^2.8.3", "yargs": "^17.7.2", "zod": "^3.22.4" }, diff --git a/scripts/verify-proxy-boundary.mjs b/scripts/verify-proxy-boundary.mjs new file mode 100644 index 0000000..d872b59 --- /dev/null +++ b/scripts/verify-proxy-boundary.mjs @@ -0,0 +1,86 @@ +import assert from 'node:assert/strict'; +import { createRequire } from 'node:module'; +import { resolve, join } from 'node:path'; +import { request } from 'node:http'; + +// Real loopback HTTP against the dependency tree in ROOT; no mocked responses. +// See https://github.com/advisories/GHSA-jqcg-44mw-7w3h. +const root = resolve(process.argv[2] ?? '.'); +const require = createRequire(join(root, 'package.json')); +const express = require('express'); +const cases = [ + { + id: 'mapped-ipv6-trust-cannot-spoof-http-client', + trust: '::ffff:10.0.0.0/8', + expected: '127.0.0.1', + suite: 'holdout', + }, + { id: 'default-untrusted-peer', trust: false, expected: '127.0.0.1', suite: 'anchor' }, + { id: 'plain-ipv4-subnet', trust: '10.0.0.0/8', expected: '127.0.0.1', suite: 'anchor' }, + { id: 'explicit-loopback-proxy', trust: 'loopback', expected: '203.0.113.7', suite: 'anchor' }, + { + id: 'correctly-mapped-loopback-proxy', + trust: '::ffff:127.0.0.0/104', + expected: '203.0.113.7', + suite: 'anchor', + }, +]; +const results = []; +for (const item of cases) { + const app = express(); + app.set('trust proxy', item.trust); + app.get('/identity', (req, res) => res.json({ ip: req.ip })); + const server = app.listen(0, '127.0.0.1'); + await new Promise((ok, reject) => { + server.once('listening', ok); + server.once('error', reject); + }); + try { + const started = performance.now(); + const observed = await new Promise((ok, reject) => { + const req = request( + { + host: '127.0.0.1', + port: server.address().port, + path: '/identity', + headers: { 'X-Forwarded-For': '203.0.113.7', Connection: 'close' }, + }, + (res) => { + let bytes = ''; + res.setEncoding('utf8'); + res.on('data', (chunk) => { + bytes += chunk; + }); + res.on('error', reject); + res.on('end', () => { + try { + assert.equal(res.statusCode, 200); + ok(JSON.parse(bytes).ip); + } catch (e) { + reject(e); + } + }); + }, + ); + req.setTimeout(3000, () => req.destroy(new Error('HTTP deadline'))); + req.on('error', reject); + req.end(); + }); + results.push({ + ...item, + observed, + passed: observed === item.expected, + durationMs: performance.now() - started, + }); + } finally { + await new Promise((ok, reject) => server.close((error) => (error ? reject(error) : ok()))); + } +} +console.log( + JSON.stringify({ + results, + boundary: + 'Dependency-level live HTTP fixture; does not assert this deployment enables proxy trust or claim production exploitability/latency improvement', + }), +); +if (results.some((item) => !item.passed)) process.exitCode = 1; diff --git a/src/core/fleet-benchmark.ts b/src/core/fleet-benchmark.ts index b68ef95..ade12d4 100644 --- a/src/core/fleet-benchmark.ts +++ b/src/core/fleet-benchmark.ts @@ -5,8 +5,8 @@ * and automation tools. */ -import { executeCLI, findCLIPath } from '../utils/cli-executor.js'; import type { SDKConfig } from '../types/index.js'; +import { executeCLI, findCLIPath } from '../utils/cli-executor.js'; /** * Fleet configuration options @@ -131,7 +131,7 @@ export interface RepositoryResults { /** Provider used for this repository */ provider_name: string; /** Benchmark results for this repository */ - results: any; // BenchmarkResults + results: unknown; /** Repository-specific metadata */ repository_metadata: Record; } @@ -265,7 +265,8 @@ export interface FleetMetadata { */ export class FleetBenchmark { private cliPath: string; - private config: Required; + private config: FleetConfig & + Required>; /** * Create a new Fleet Benchmark SDK instance @@ -278,7 +279,7 @@ export class FleetBenchmark { const resolvedCliPath = sdkConfig?.cliPath ?? findCLIPath(); if (!resolvedCliPath) { throw new Error( - 'LLM Test Bench CLI not found. Please install it via cargo or npm, or provide cliPath in config.' + 'LLM Test Bench CLI not found. Please install it via cargo or npm, or provide cliPath in config.', ); } @@ -319,7 +320,7 @@ export class FleetBenchmark { options?: { wait?: boolean; format?: 'json' | 'summary' | 'quiet'; - } + }, ): Promise { const args = ['fleet', '--manifest', manifestPath, '--output', this.config.outputBaseDir]; @@ -361,7 +362,7 @@ export class FleetBenchmark { runId, artifactBaseDir: `${this.config.outputBaseDir}/${runId}`, metadata: { - fleetId: runId.split('-')[0] || 'unknown', + fleetId: runId.split('-')[0] ?? 'unknown', repositoryCount: 0, // Unknown until execution completes providers: [], startedAt: new Date().toISOString(), @@ -436,7 +437,8 @@ export class FleetBenchmark { const content = await fs.readFile(resultsPath, 'utf-8'); return JSON.parse(content) as FleetBenchmarkResults; } catch (error) { - throw new Error(`Failed to load fleet results for ${runId}: ${error}`); + const message = error instanceof Error ? error.message : String(error); + throw new Error(`Failed to load fleet results for ${runId}: ${message}`); } } @@ -460,7 +462,7 @@ export class FleetBenchmark { options?: { timeoutMs?: number; pollIntervalMs?: number; - } + }, ): Promise { const timeoutMs = options?.timeoutMs ?? 600000; // 10 minutes default const pollIntervalMs = options?.pollIntervalMs ?? 2000; // 2 seconds default diff --git a/src/core/llm-test-bench.ts b/src/core/llm-test-bench.ts index 71f5029..37c1125 100644 --- a/src/core/llm-test-bench.ts +++ b/src/core/llm-test-bench.ts @@ -63,7 +63,7 @@ export class LLMTestBench { const resolvedCliPath = config.cliPath ?? findCLIPath(); if (!resolvedCliPath) { throw new Error( - 'LLM Test Bench CLI not found. Please install it via cargo or npm, or provide cliPath in config.' + 'LLM Test Bench CLI not found. Please install it via cargo or npm, or provide cliPath in config.', ); } @@ -156,14 +156,7 @@ export class LLMTestBench { validateBenchmarkConfig(options.config); } - const args = [ - 'bench', - '--provider', - options.provider, - '--model', - options.model, - '--json', - ]; + const args = ['bench', '--provider', options.provider, '--model', options.model, '--json']; // Add prompts for (const prompt of options.prompts) { @@ -278,10 +271,7 @@ export class LLMTestBench { * @param config - Evaluation configuration * @returns Promise resolving to evaluation results */ - async evaluate( - text: string, - config: EvaluationConfig - ): Promise { + async evaluate(text: string, config: EvaluationConfig): Promise { if (!text || text.trim().length === 0) { throw new Error('Text to evaluate cannot be empty'); } diff --git a/src/core/provider-client.ts b/src/core/provider-client.ts index f16f227..245984a 100644 --- a/src/core/provider-client.ts +++ b/src/core/provider-client.ts @@ -35,7 +35,10 @@ export abstract class ProviderClient { /** * Complete a prompt using the provider's default model */ - async complete(prompt: string, options?: Partial): Promise { + async complete( + prompt: string, + options?: Partial, + ): Promise { const models = await this.listModels(); if (models.length === 0) { throw new Error(`No models available for provider: ${this.providerName}`); @@ -78,7 +81,10 @@ export class OpenAIClient extends ProviderClient { /** * Use GPT-4 Turbo */ - async gpt4Turbo(prompt: string, options?: Partial): Promise { + async gpt4Turbo( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'gpt-4-turbo', prompt, @@ -100,7 +106,10 @@ export class OpenAIClient extends ProviderClient { /** * Use GPT-3.5 Turbo */ - async gpt35Turbo(prompt: string, options?: Partial): Promise { + async gpt35Turbo( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'gpt-3.5-turbo', prompt, @@ -120,7 +129,10 @@ export class AnthropicClient extends ProviderClient { /** * Use Claude Opus 4 */ - async claudeOpus4(prompt: string, options?: Partial): Promise { + async claudeOpus4( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'claude-opus-4', prompt, @@ -131,7 +143,10 @@ export class AnthropicClient extends ProviderClient { /** * Use Claude Sonnet 4.5 */ - async claudeSonnet45(prompt: string, options?: Partial): Promise { + async claudeSonnet45( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'claude-sonnet-4.5', prompt, @@ -142,7 +157,10 @@ export class AnthropicClient extends ProviderClient { /** * Use Claude 3.5 Sonnet */ - async claude35Sonnet(prompt: string, options?: Partial): Promise { + async claude35Sonnet( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'claude-3-5-sonnet-latest', prompt, @@ -153,7 +171,10 @@ export class AnthropicClient extends ProviderClient { /** * Use Claude 3.5 Haiku */ - async claude35Haiku(prompt: string, options?: Partial): Promise { + async claude35Haiku( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'claude-3-5-haiku-latest', prompt, @@ -173,7 +194,10 @@ export class GoogleClient extends ProviderClient { /** * Use Gemini 2.5 Pro */ - async gemini25Pro(prompt: string, options?: Partial): Promise { + async gemini25Pro( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'gemini-2.5-pro', prompt, @@ -184,7 +208,10 @@ export class GoogleClient extends ProviderClient { /** * Use Gemini 1.5 Pro */ - async gemini15Pro(prompt: string, options?: Partial): Promise { + async gemini15Pro( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'gemini-1.5-pro', prompt, @@ -195,7 +222,10 @@ export class GoogleClient extends ProviderClient { /** * Use Gemini 1.5 Flash */ - async gemini15Flash(prompt: string, options?: Partial): Promise { + async gemini15Flash( + prompt: string, + options?: Partial, + ): Promise { return this.ltb.complete({ model: 'gemini-1.5-flash', prompt, diff --git a/src/evaluators/index.ts b/src/evaluators/index.ts index 99e9a3c..6df5759 100644 --- a/src/evaluators/index.ts +++ b/src/evaluators/index.ts @@ -5,11 +5,7 @@ */ import { LLMTestBench } from '../core/llm-test-bench.js'; -import type { - EvaluationConfig, - CombinedEvaluationResults, - EvaluatorType, -} from '../types/index.js'; +import type { EvaluationConfig, CombinedEvaluationResults, EvaluatorType } from '../types/index.js'; /** * Evaluator helper class @@ -20,10 +16,13 @@ export class Evaluator { /** * Evaluate text with all available evaluators */ - async evaluateAll(text: string, options?: { - referenceText?: string; - context?: string[]; - }): Promise { + async evaluateAll( + text: string, + options?: { + referenceText?: string; + context?: string[]; + }, + ): Promise { const config: EvaluationConfig = { evaluators: [ 'perplexity', @@ -75,7 +74,7 @@ export class Evaluator { options: { referenceText?: string; context?: string[]; - } + }, ): Promise { const config: EvaluationConfig = { evaluators: ['relevance', 'faithfulness'], @@ -95,7 +94,7 @@ export class Evaluator { criteria: string[]; judgeModel?: string; referenceText?: string; - } + }, ): Promise { const config: EvaluationConfig = { evaluators: ['llm-as-judge'], @@ -117,7 +116,7 @@ export class Evaluator { referenceText?: string; context?: string[]; judgeModel?: string; - } + }, ): Promise { const config: EvaluationConfig = { evaluators, diff --git a/src/execution/instrumented.ts b/src/execution/instrumented.ts index de19319..c42d10d 100644 --- a/src/execution/instrumented.ts +++ b/src/execution/instrumented.ts @@ -11,6 +11,7 @@ * This ensures the repository NEVER executes silently. */ +import { LLMTestBench } from '../core/llm-test-bench.js'; import type { SDKConfig, CompletionRequest, @@ -23,11 +24,11 @@ import type { ProviderName, ModelInfo, } from '../types/index.js'; -import { LLMTestBench } from '../core/llm-test-bench.js'; -import type { ExecutionContext, ExecutionResult } from './types.js'; + +import { PolicyGate } from './policy-gate.js'; import type { ExecutionPolicy } from './policy.js'; import { SpanManager } from './span-manager.js'; -import { PolicyGate } from './policy-gate.js'; +import type { ExecutionContext, ExecutionResult } from './types.js'; /** * Instrumented LLM Test Bench that emits execution spans. @@ -83,7 +84,7 @@ export class InstrumentedTestBench { */ async listModels( ctx: ExecutionContext, - provider?: ProviderName + provider?: ProviderName, ): Promise> { const { mgr } = this.gate.enforce('benchmark', ctx); const agent = mgr.startAgent('model-lister'); @@ -110,7 +111,7 @@ export class InstrumentedTestBench { model: string; prompts: string[]; config?: BenchmarkConfig; - } + }, ): Promise> { const { mgr } = this.gate.enforce('benchmark', ctx); @@ -162,7 +163,7 @@ export class InstrumentedTestBench { models: Array<{ provider: ProviderName; model: string }>; prompts: string[]; config?: BenchmarkConfig; - } + }, ): Promise> { const { mgr } = this.gate.enforce('compare', ctx); const agent = mgr.startAgent('model-comparator'); @@ -195,7 +196,7 @@ export class InstrumentedTestBench { async evaluate( ctx: ExecutionContext, text: string, - config: EvaluationConfig + config: EvaluationConfig, ): Promise> { const { mgr } = this.gate.enforce('evaluate', ctx); const agent = mgr.startAgent('evaluator'); @@ -227,7 +228,7 @@ export class InstrumentedTestBench { */ async complete( ctx: ExecutionContext, - request: CompletionRequest + request: CompletionRequest, ): Promise> { const { mgr } = this.gate.enforce('complete', ctx); const agent = mgr.startAgent('completion-agent'); @@ -263,10 +264,8 @@ export class InstrumentedTestBench { metric: 'latency' | 'cost' | 'quality'; maxCost?: number; minQuality?: number; - } - ): Promise< - ExecutionResult<{ provider: ProviderName; model: string; reason: string }> - > { + }, + ): Promise> { const { mgr } = this.gate.enforce('optimize', ctx); const agent = mgr.startAgent('optimizer'); @@ -323,7 +322,7 @@ export class InstrumentedTestBench { */ export async function executeWithSpans( ctx: ExecutionContext, - fn: (mgr: SpanManager) => Promise + fn: (mgr: SpanManager) => Promise, ): Promise> { const mgr = SpanManager.create(ctx); diff --git a/src/execution/policy-gate.ts b/src/execution/policy-gate.ts index 424b40b..caec89a 100644 --- a/src/execution/policy-gate.ts +++ b/src/execution/policy-gate.ts @@ -7,7 +7,7 @@ * first-class artifacts in the execution graph. */ -import type { ExecutionContext, ExecutionArtifact } from './types.js'; +import { DEFAULT_EXECUTION_POLICY } from './default-policy.js'; import type { SimulationIntent, GateDisposition, @@ -16,7 +16,7 @@ import type { ExemptionRecord, } from './policy.js'; import { SpanManager } from './span-manager.js'; -import { DEFAULT_EXECUTION_POLICY } from './default-policy.js'; +import type { ExecutionContext, ExecutionArtifact } from './types.js'; import { nowISO } from './types.js'; /** @@ -26,11 +26,7 @@ export class PolicyGateError extends Error { public readonly intent: SimulationIntent; public readonly disposition: GateDisposition; - constructor( - message: string, - intent: SimulationIntent, - disposition: GateDisposition, - ) { + constructor(message: string, intent: SimulationIntent, disposition: GateDisposition) { super(message); this.name = 'PolicyGateError'; this.intent = intent; @@ -131,10 +127,7 @@ export class PolicyGate { * LLMTestBench. Since ctx is always provided on this path, * this validates and creates the SpanManager. */ - enforce( - intent: SimulationIntent, - ctx: ExecutionContext, - ): { mgr: SpanManager } { + enforce(intent: SimulationIntent, ctx: ExecutionContext): { mgr: SpanManager } { const result = this.check(intent, ctx); if (!result.allowed) { throw new PolicyGateError( @@ -149,11 +142,7 @@ export class PolicyGate { /** * Record an exemption as a first-class artifact on a SpanManager. */ - recordExemption( - mgr: SpanManager, - agentSpanId: string, - exemption: ExemptionRecord, - ): void { + recordExemption(mgr: SpanManager, agentSpanId: string, exemption: ExemptionRecord): void { const artifact: ExecutionArtifact = { reference: `policy-exemption-${exemption.intent}-${Date.now()}.json`, artifact_type: 'policy_exemption', diff --git a/src/execution/policy.ts b/src/execution/policy.ts index c7e1977..3236de8 100644 --- a/src/execution/policy.ts +++ b/src/execution/policy.ts @@ -50,11 +50,7 @@ export type SimulationIntent = z.infer; * - 'recommended': Should run instrumented, but bypass does not fail. * - 'optional': No policy enforcement. */ -export const GateDispositionSchema = z.enum([ - 'mandatory', - 'recommended', - 'optional', -]); +export const GateDispositionSchema = z.enum(['mandatory', 'recommended', 'optional']); export type GateDisposition = z.infer; @@ -90,7 +86,7 @@ export const ExecutionPolicySchema = z.object({ const intents = rules.map((r: { intent: string }) => r.intent); return new Set(intents).size === intents.length; }, - { message: 'Duplicate intent in policy rules' } + { message: 'Duplicate intent in policy rules' }, ), default_disposition: GateDispositionSchema, }); diff --git a/src/execution/span-manager.ts b/src/execution/span-manager.ts index 9e19e7b..a4cfa70 100644 --- a/src/execution/span-manager.ts +++ b/src/execution/span-manager.ts @@ -12,6 +12,7 @@ * - All spans are append-only and causally ordered */ +import type { ExemptionRecord } from './policy.js'; import type { ExecutionContext, ExecutionSpan, @@ -20,14 +21,15 @@ import type { SpanStatus, } from './types.js'; import { generateSpanId, nowISO, REPO_NAME } from './types.js'; -import type { ExemptionRecord } from './policy.js'; /** * Validates that an ExecutionContext is structurally valid. * Rejects execution if parent_span_id is missing. */ export function validateExecutionContext(ctx: unknown): ctx is ExecutionContext { - if (!ctx || typeof ctx !== 'object') return false; + if (!ctx || typeof ctx !== 'object') { + return false; + } const c = ctx as Record; return ( typeof c['execution_id'] === 'string' && @@ -96,7 +98,7 @@ export class SpanManager { throw new ExecutionContextError( 'Execution rejected: parent_span_id is missing or invalid. ' + 'Every externally-invoked operation must provide a valid ExecutionContext ' + - 'with execution_id and parent_span_id.' + 'with execution_id and parent_span_id.', ); } return new SpanManager(ctx); @@ -140,18 +142,14 @@ export class SpanManager { /** * End an agent-level span. */ - endAgent( - spanId: string, - status: 'completed' | 'failed', - failureReasons?: string[] - ): void { + endAgent(spanId: string, status: 'completed' | 'failed', failureReasons?: string[]): void { const span = this.agentSpans.get(spanId); if (!span) { throw new ExecutionInvariantError(`Unknown agent span: ${spanId}`); } if (span.status !== 'running') { throw new ExecutionInvariantError( - `Agent span ${spanId} already ended with status ${span.status}` + `Agent span ${spanId} already ended with status ${span.status}`, ); } @@ -171,7 +169,7 @@ export class SpanManager { if (!this.agentSpans.has(artifact.agent_span_id)) { throw new ExecutionInvariantError( `Cannot attach artifact to unknown agent span: ${artifact.agent_span_id}. ` + - 'Artifacts must be attached to an existing agent-level span.' + 'Artifacts must be attached to an existing agent-level span.', ); } this.artifacts.push(artifact); @@ -203,9 +201,7 @@ export class SpanManager { // Enforce: at least one agent span must exist if (this.agentSpans.size === 0) { - validationErrors.push( - 'No agent-level spans were emitted. Execution is INVALID.' - ); + validationErrors.push('No agent-level spans were emitted. Execution is INVALID.'); } // Enforce: no running agents @@ -215,13 +211,11 @@ export class SpanManager { .join(', '); validationErrors.push( `Agents still running at finalization: ${running}. ` + - 'All agent spans must be ended before finalization.' + 'All agent spans must be ended before finalization.', ); // Force-end them as failed for (const id of this.activeAgents) { - this.endAgent(id, 'failed', [ - 'Agent was still running at finalization', - ]); + this.endAgent(id, 'failed', ['Agent was still running at finalization']); } } @@ -229,25 +223,19 @@ export class SpanManager { // This is enforced by the API: you cannot execute logic without calling startAgent // Determine repo span status - const anyFailed = Array.from(this.agentSpans.values()).some( - (s) => s.status === 'failed' - ); + const anyFailed = Array.from(this.agentSpans.values()).some((s) => s.status === 'failed'); const repoStatus: SpanStatus = - forceStatus ?? - (validationErrors.length > 0 - ? 'failed' - : anyFailed - ? 'failed' - : 'completed'); + forceStatus ?? (validationErrors.length > 0 ? 'failed' : anyFailed ? 'failed' : 'completed'); this.repoSpan.end_time = nowISO(); this.repoSpan.status = repoStatus; if (repoStatus === 'failed') { - this.repoSpan.failure_reasons = validationErrors.length > 0 - ? validationErrors - : Array.from(this.agentSpans.values()) - .filter((s) => s.status === 'failed') - .flatMap((s) => s.failure_reasons ?? ['Agent failed']); + this.repoSpan.failure_reasons = + validationErrors.length > 0 + ? validationErrors + : Array.from(this.agentSpans.values()) + .filter((s) => s.status === 'failed') + .flatMap((s) => s.failure_reasons ?? ['Agent failed']); } const valid = validationErrors.length === 0; diff --git a/src/execution/types.ts b/src/execution/types.ts index 10b61c2..fd891c2 100644 --- a/src/execution/types.ts +++ b/src/execution/types.ts @@ -12,6 +12,7 @@ */ import { randomUUID } from 'crypto'; + import type { ExemptionRecord } from './policy.js'; /** Span type discriminator */ diff --git a/src/index.ts b/src/index.ts index f0fab64..5e5a43d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -62,11 +62,7 @@ export type { } from './execution/index.js'; // Export policy gate (execution dependency enforcement) -export { - PolicyGate, - PolicyGateError, - DEFAULT_EXECUTION_POLICY, -} from './execution/index.js'; +export { PolicyGate, PolicyGateError, DEFAULT_EXECUTION_POLICY } from './execution/index.js'; export type { SimulationIntent, GateDisposition, diff --git a/src/types/providers.ts b/src/types/providers.ts index 14b1d03..1c593c8 100644 --- a/src/types/providers.ts +++ b/src/types/providers.ts @@ -180,7 +180,13 @@ export interface ModelInfo { */ export interface ProviderError { /** Error type */ - type: 'rate_limit' | 'authentication' | 'network' | 'invalid_request' | 'provider_error' | 'timeout'; + type: + | 'rate_limit' + | 'authentication' + | 'network' + | 'invalid_request' + | 'provider_error' + | 'timeout'; /** Error message */ message: string; diff --git a/src/utils/cli-executor.ts b/src/utils/cli-executor.ts index ad611b3..6e4720e 100644 --- a/src/utils/cli-executor.ts +++ b/src/utils/cli-executor.ts @@ -5,6 +5,8 @@ */ import { spawn } from 'child_process'; +import { accessSync, constants } from 'fs'; +import { delimiter, join } from 'path'; import { CLIResult } from '../types/index.js'; @@ -37,7 +39,7 @@ export interface ExecuteOptions { */ export async function executeCLI( cliPath: string, - options: ExecuteOptions + options: ExecuteOptions, ): Promise> { const startTime = Date.now(); @@ -144,27 +146,38 @@ export async function executeCLI( * * @returns Path to the CLI binary or undefined if not found */ -export function findCLIPath(): string | undefined { - // First check if installed globally via cargo +export function findCLIPath(cwd = process.cwd()): string | undefined { + const binaryName = process.platform === 'win32' ? 'llm-test-bench.exe' : 'llm-test-bench'; const cargoHome = process.env['CARGO_HOME']; const home = process.env['HOME']; const cargoPath = cargoHome - ? `${cargoHome}/bin/llm-test-bench` + ? join(cargoHome, 'bin', binaryName) : home - ? `${home}/.cargo/bin/llm-test-bench` - : undefined; + ? join(home, '.cargo', 'bin', binaryName) + : undefined; - // Also check common npm installation paths - const npmGlobalPath = '/usr/local/bin/llm-test-bench'; - const npmLocalPath = `${process.cwd()}/node_modules/.bin/llm-test-bench`; + const npmGlobalPath = join('/usr/local/bin', binaryName); + const npmLocalPath = join(cwd, 'node_modules', '.bin', binaryName); + const pathCandidates = (process.env['PATH'] ?? '') + .split(delimiter) + .filter(Boolean) + .map((directory) => join(directory, binaryName)); - // Try in order of preference - const paths = [cargoPath, npmGlobalPath, npmLocalPath].filter( - (p): p is string => p !== undefined + const paths = [cargoPath, npmLocalPath, npmGlobalPath, ...pathCandidates].filter( + (p): p is string => p !== undefined, ); - // For now, return the first path (in production, we'd check if it exists) - // This would require fs.existsSync which we can add if needed - return paths[0]; + const accessMode = process.platform === 'win32' ? constants.F_OK : constants.X_OK; + + for (const candidate of new Set(paths)) { + try { + accessSync(candidate, accessMode); + return candidate; + } catch { + // Keep searching: configured locations may legitimately be absent. + } + } + + return undefined; } diff --git a/src/utils/validators.ts b/src/utils/validators.ts index 514d207..c214cda 100644 --- a/src/utils/validators.ts +++ b/src/utils/validators.ts @@ -80,7 +80,7 @@ const evaluationConfigSchema = z.object({ 'toxicity', 'pii-detection', 'custom', - ]) + ]), ), referenceText: z.string().optional(), context: z.array(z.string()).optional(), diff --git a/tests/benchmarks.test.ts b/tests/benchmarks.test.ts index 5410c92..d7d761f 100644 --- a/tests/benchmarks.test.ts +++ b/tests/benchmarks.test.ts @@ -13,7 +13,7 @@ describe('Benchmark Runner', () => { model: 'gpt-4', prompts: ['Hello', 'How are you?'], iterations: 1, - parallel: false + parallel: false, }; expect(config.name).toBeTruthy(); @@ -28,11 +28,11 @@ describe('Benchmark Runner', () => { const validIterations = [1, 5, 10, 100]; const invalidIterations = [0, -1, -5]; - validIterations.forEach(n => { + validIterations.forEach((n) => { expect(n).toBeGreaterThan(0); }); - invalidIterations.forEach(n => { + invalidIterations.forEach((n) => { expect(n).not.toBeGreaterThan(0); }); }); @@ -41,7 +41,7 @@ describe('Benchmark Runner', () => { const batchConfig = { batch_size: 10, max_concurrent: 3, - timeout_seconds: 60 + timeout_seconds: 60, }; expect(batchConfig.batch_size).toBeGreaterThan(0); @@ -71,7 +71,7 @@ describe('Benchmark Runner', () => { mean: sum / sorted.length, median: sorted[Math.floor(sorted.length / 2)], p95: sorted[Math.floor(sorted.length * 0.95)], - p99: sorted[Math.floor(sorted.length * 0.99)] + p99: sorted[Math.floor(sorted.length * 0.99)], }; }; @@ -85,10 +85,7 @@ describe('Benchmark Runner', () => { }); it('should calculate throughput', () => { - const calculateThroughput = ( - requests: number, - durationSeconds: number - ): number => { + const calculateThroughput = (requests: number, durationSeconds: number): number => { if (durationSeconds === 0) return 0; return requests / durationSeconds; }; @@ -106,7 +103,9 @@ describe('Benchmark Runner', () => { avg_tokens_per_request: number; } - const aggregateTokens = (usages: Array<{ prompt: number; completion: number }>): TokenMetrics => { + const aggregateTokens = ( + usages: Array<{ prompt: number; completion: number }>, + ): TokenMetrics => { const total_prompt = usages.reduce((sum, u) => sum + u.prompt, 0); const total_completion = usages.reduce((sum, u) => sum + u.completion, 0); const total = total_prompt + total_completion; @@ -115,14 +114,14 @@ describe('Benchmark Runner', () => { total_prompt_tokens: total_prompt, total_completion_tokens: total_completion, total_tokens: total, - avg_tokens_per_request: usages.length > 0 ? total / usages.length : 0 + avg_tokens_per_request: usages.length > 0 ? total / usages.length : 0, }; }; const usages = [ { prompt: 10, completion: 20 }, { prompt: 15, completion: 25 }, - { prompt: 12, completion: 18 } + { prompt: 12, completion: 18 }, ]; const metrics = aggregateTokens(usages); @@ -143,7 +142,7 @@ describe('Benchmark Runner', () => { const calculateCost = ( promptTokens: number, completionTokens: number, - pricing: PricingConfig + pricing: PricingConfig, ): number => { const promptCost = (promptTokens / 1000) * pricing.prompt_tokens_per_1k; const completionCost = (completionTokens / 1000) * pricing.completion_tokens_per_1k; @@ -152,7 +151,7 @@ describe('Benchmark Runner', () => { const gpt4Pricing: PricingConfig = { prompt_tokens_per_1k: 0.03, - completion_tokens_per_1k: 0.06 + completion_tokens_per_1k: 0.06, }; const cost = calculateCost(1000, 500, gpt4Pricing); @@ -172,12 +171,10 @@ describe('Benchmark Runner', () => { const providerCosts = { 'openai-gpt4': 0.03, 'anthropic-claude': 0.015, - 'google-gemini': 0.001 + 'google-gemini': 0.001, }; - const cheapest = Object.entries(providerCosts).reduce((a, b) => - a[1] < b[1] ? a : b - ); + const cheapest = Object.entries(providerCosts).reduce((a, b) => (a[1] < b[1] ? a : b)); expect(cheapest[0]).toBe('google-gemini'); expect(cheapest[1]).toBe(0.001); @@ -196,8 +193,22 @@ describe('Benchmark Runner', () => { } const results: BenchmarkResult[] = [ - { provider: 'openai', model: 'gpt-4', success_count: 95, failure_count: 5, avg_latency: 1500, total_cost: 0.50 }, - { provider: 'anthropic', model: 'claude-3', success_count: 98, failure_count: 2, avg_latency: 1200, total_cost: 0.30 } + { + provider: 'openai', + model: 'gpt-4', + success_count: 95, + failure_count: 5, + avg_latency: 1500, + total_cost: 0.5, + }, + { + provider: 'anthropic', + model: 'claude-3', + success_count: 98, + failure_count: 2, + avg_latency: 1200, + total_cost: 0.3, + }, ]; const totalSuccess = results.reduce((sum, r) => sum + r.success_count, 0); @@ -206,7 +217,7 @@ describe('Benchmark Runner', () => { expect(totalSuccess).toBe(193); expect(totalFailure).toBe(7); - expect(totalCost).toBe(0.80); + expect(totalCost).toBe(0.8); }); it('should calculate success rate', () => { @@ -230,7 +241,10 @@ describe('Benchmark Runner', () => { cost: number; } - const rankModels = (models: ModelScore[], metric: keyof Pick): ModelScore[] => { + const rankModels = ( + models: ModelScore[], + metric: keyof Pick, + ): ModelScore[] => { return [...models].sort((a, b) => { if (metric === 'score') { return b[metric] - a[metric]; // Higher score is better @@ -242,7 +256,7 @@ describe('Benchmark Runner', () => { const models: ModelScore[] = [ { model: 'gpt-4', score: 0.92, latency: 1500, cost: 0.03 }, { model: 'claude-3', score: 0.95, latency: 1200, cost: 0.015 }, - { model: 'gemini-pro', score: 0.88, latency: 800, cost: 0.001 } + { model: 'gemini-pro', score: 0.88, latency: 800, cost: 0.001 }, ]; const byScore = rankModels(models, 'score'); @@ -259,13 +273,9 @@ describe('Benchmark Runner', () => { accuracy: number, speed: number, cost: number, - weights: { accuracy: number; speed: number; cost: number } + weights: { accuracy: number; speed: number; cost: number }, ): number => { - return ( - accuracy * weights.accuracy + - speed * weights.speed + - cost * weights.cost - ); + return accuracy * weights.accuracy + speed * weights.speed + cost * weights.cost; }; const weights = { accuracy: 0.5, speed: 0.3, cost: 0.2 }; @@ -282,9 +292,7 @@ describe('Report Generation', () => { const result = { benchmark_name: 'Test Benchmark', timestamp: new Date().toISOString(), - results: [ - { model: 'gpt-4', score: 0.92 } - ] + results: [{ model: 'gpt-4', score: 0.92 }], }; const json = JSON.stringify(result, null, 2); @@ -297,7 +305,7 @@ describe('Report Generation', () => { it('should format results as CSV', () => { const formatCSV = (headers: string[], rows: string[][]): string => { const headerLine = headers.join(','); - const dataLines = rows.map(row => row.join(',')); + const dataLines = rows.map((row) => row.join(',')); return [headerLine, ...dataLines].join('\n'); }; @@ -305,8 +313,8 @@ describe('Report Generation', () => { ['Model', 'Score', 'Latency'], [ ['gpt-4', '0.92', '1500'], - ['claude-3', '0.95', '1200'] - ] + ['claude-3', '0.95', '1200'], + ], ); expect(csv).toContain('Model,Score,Latency'); @@ -323,23 +331,23 @@ describe('Report Generation', () => { } const generateSummary = ( - results: Array<{ success: boolean; latency: number; cost: number }> + results: Array<{ success: boolean; latency: number; cost: number }>, ): Summary => { - const successful = results.filter(r => r.success); + const successful = results.filter((r) => r.success); return { total_requests: results.length, successful_requests: successful.length, failed_requests: results.length - successful.length, avg_latency_ms: successful.reduce((sum, r) => sum + r.latency, 0) / successful.length, - total_cost_usd: results.reduce((sum, r) => sum + r.cost, 0) + total_cost_usd: results.reduce((sum, r) => sum + r.cost, 0), }; }; const results = [ { success: true, latency: 1000, cost: 0.01 }, { success: true, latency: 1200, cost: 0.015 }, - { success: false, latency: 5000, cost: 0.0 } + { success: false, latency: 5000, cost: 0.0 }, ]; const summary = generateSummary(results); @@ -362,26 +370,26 @@ describe('Report Generation', () => { } const prepareChartData = ( - results: Array<{ model: string; score: number; latency: number }> + results: Array<{ model: string; score: number; latency: number }>, ): ChartData => { return { - labels: results.map(r => r.model), + labels: results.map((r) => r.model), datasets: [ { label: 'Score', - data: results.map(r => r.score) + data: results.map((r) => r.score), }, { label: 'Latency (ms)', - data: results.map(r => r.latency) - } - ] + data: results.map((r) => r.latency), + }, + ], }; }; const results = [ { model: 'gpt-4', score: 0.92, latency: 1500 }, - { model: 'claude-3', score: 0.95, latency: 1200 } + { model: 'claude-3', score: 0.95, latency: 1200 }, ]; const chartData = prepareChartData(results); @@ -401,15 +409,15 @@ describe('Dataset Management', () => { version: '1.0', prompts: [ { id: '1', text: 'Hello', category: 'greeting' }, - { id: '2', text: 'How are you?', category: 'question' } - ] + { id: '2', text: 'How are you?', category: 'question' }, + ], }; expect(dataset.name).toBeTruthy(); expect(dataset.version).toMatch(/\d+\.\d+/); expect(dataset.prompts.length).toBeGreaterThan(0); - dataset.prompts.forEach(prompt => { + dataset.prompts.forEach((prompt) => { expect(prompt.id).toBeTruthy(); expect(prompt.text).toBeTruthy(); expect(prompt.category).toBeTruthy(); @@ -419,7 +427,7 @@ describe('Dataset Management', () => { it('should support dataset categories', () => { const categories = ['coding', 'math', 'reasoning', 'creative', 'factual']; - categories.forEach(category => { + categories.forEach((category) => { expect(typeof category).toBe('string'); expect(category.length).toBeGreaterThan(0); }); diff --git a/tests/ci-gate.test.ts b/tests/ci-gate.test.ts new file mode 100644 index 0000000..881626f --- /dev/null +++ b/tests/ci-gate.test.ts @@ -0,0 +1,42 @@ +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { runInNewContext } from 'node:vm'; +import { describe, expect, it } from 'vitest'; +import YAML from 'yaml'; + +type Job = { needs?: string[]; steps?: { run?: string }[] }; +const file = fileURLToPath(new URL('../.github/workflows/ci.yml', import.meta.url)); +const workflow = YAML.parse(readFileSync(file, 'utf8')) as { jobs: Record }; +const required = Object.keys(workflow.jobs).filter((id) => id !== 'ci-success'); +const aggregate = workflow.jobs['ci-success']; +const expression = aggregate.steps?.[0].run?.match(/\$\{\{ (.*?) \}\}/)?.[1]; + +describe('aggregate CI fails closed on every required job', () => { + it('depends on every other job, including integration and production security', () => { + expect(new Set(aggregate.needs)).toEqual(new Set(required)); + expect(aggregate.needs).toContain('integration'); + expect(aggregate.needs).toContain('dependency-security'); + }); + + const evaluate = (results: string[]) => { + expect(expression).toBeDefined(); + const runnable = expression?.replaceAll('needs.*.result', 'results') ?? ''; + return runInNewContext( + runnable, + { results, contains: (values: string[], value: string) => values.includes(value) }, + { timeout: 100 }, + ) as boolean; + }; + + it('accepts only the all-success result vector', () => { + expect(evaluate(required.map(() => 'success'))).toBe(false); + }); + + for (const job of required) { + for (const status of ['failure', 'cancelled', 'skipped']) { + it(`rejects ${job} ${status}`, () => { + expect(evaluate(required.map((id) => (id === job ? status : 'success')))).toBe(true); + }); + } + } +}); diff --git a/tests/cli-executor.test.ts b/tests/cli-executor.test.ts new file mode 100644 index 0000000..6064ba1 --- /dev/null +++ b/tests/cli-executor.test.ts @@ -0,0 +1,63 @@ +import { chmodSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'fs'; +import { tmpdir } from 'os'; +import { delimiter, join } from 'path'; +import { afterEach, describe, expect, it } from 'vitest'; + +import { findCLIPath } from '../src/utils/cli-executor.js'; + +const originalEnv = { ...process.env }; +const temporaryDirectories: string[] = []; + +function makeExecutable(directory: string): string { + const binaryName = process.platform === 'win32' ? 'llm-test-bench.exe' : 'llm-test-bench'; + mkdirSync(directory, { recursive: true }); + const binaryPath = join(directory, binaryName); + writeFileSync(binaryPath, '#!/bin/sh\nexit 0\n'); + chmodSync(binaryPath, 0o755); + return binaryPath; +} + +function makeTemporaryDirectory(): string { + const directory = mkdtempSync(join(tmpdir(), 'test-bench-cli-')); + temporaryDirectories.push(directory); + return directory; +} + +afterEach(() => { + process.env = { ...originalEnv }; + for (const directory of temporaryDirectories.splice(0)) { + rmSync(directory, { recursive: true, force: true }); + } +}); + +describe('findCLIPath', () => { + it('skips a configured Cargo location when the binary is absent', () => { + const project = makeTemporaryDirectory(); + const localBinary = makeExecutable(join(project, 'node_modules', '.bin')); + process.env.CARGO_HOME = join(project, 'missing-cargo-home'); + process.env.HOME = join(project, 'missing-home'); + process.env.PATH = ''; + + expect(findCLIPath(project)).toBe(localBinary); + }); + + it('discovers an executable from PATH', () => { + const root = makeTemporaryDirectory(); + const pathDirectory = join(root, 'custom-bin'); + const pathBinary = makeExecutable(pathDirectory); + process.env.CARGO_HOME = join(root, 'missing-cargo-home'); + process.env.HOME = join(root, 'missing-home'); + process.env.PATH = [join(root, 'missing-bin'), pathDirectory].join(delimiter); + + expect(findCLIPath(root)).toBe(pathBinary); + }); + + it('returns undefined when no executable exists', () => { + const root = makeTemporaryDirectory(); + process.env.CARGO_HOME = join(root, 'missing-cargo-home'); + process.env.HOME = join(root, 'missing-home'); + process.env.PATH = join(root, 'missing-bin'); + + expect(findCLIPath(root)).toBeUndefined(); + }); +}); diff --git a/tests/config.test.ts b/tests/config.test.ts index 38af6ff..3c7cacf 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -54,7 +54,7 @@ enabled = true api_key_env: 'OPENAI_API_KEY', base_url: 'https://api.openai.com/v1', default_model: 'gpt-4', - enabled: true + enabled: true, }; expect(validProvider.name).toBeTruthy(); @@ -128,7 +128,7 @@ enabled = true log_level: 'info', timeout_seconds: 30, max_retries: 3, - output_format: 'json' + output_format: 'json', }; expect(defaults.log_level).toBe('info'); @@ -141,7 +141,7 @@ enabled = true const providerDefaults = { timeout_seconds: 30, max_retries: 3, - enabled: true + enabled: true, }; expect(providerDefaults.timeout_seconds).toBeGreaterThan(0); @@ -155,11 +155,11 @@ enabled = true const invalidLevels = ['verbose', 'critical', 'none', '']; const validLevels = ['error', 'warn', 'info', 'debug', 'trace']; - invalidLevels.forEach(level => { + invalidLevels.forEach((level) => { expect(validLevels).not.toContain(level); }); - validLevels.forEach(level => { + validLevels.forEach((level) => { expect(validLevels).toContain(level); }); }); @@ -168,20 +168,16 @@ enabled = true const validUrls = [ 'https://api.openai.com/v1', 'https://api.anthropic.com/v1', - 'http://localhost:8080' + 'http://localhost:8080', ]; - const invalidUrls = [ - 'not-a-url', - 'ftp://invalid.com', - '' - ]; + const invalidUrls = ['not-a-url', 'ftp://invalid.com', '']; - validUrls.forEach(url => { + validUrls.forEach((url) => { expect(url).toMatch(/^https?:\/\/.+/); }); - invalidUrls.forEach(url => { + invalidUrls.forEach((url) => { expect(url).not.toMatch(/^https?:\/\/.+/); }); }); diff --git a/tests/dependency-security.test.ts b/tests/dependency-security.test.ts new file mode 100644 index 0000000..b0fe71e --- /dev/null +++ b/tests/dependency-security.test.ts @@ -0,0 +1,16 @@ +import { execFileSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; + +describe('dependency proxy trust security and compatibility', () => { + const script = fileURLToPath(new URL('../scripts/verify-proxy-boundary.mjs', import.meta.url)); + it('retains the frozen real HTTP trust-boundary contract', () => { + const output = execFileSync(process.execPath, [script, process.cwd()], { + encoding: 'utf8', + timeout: 15000, + }); + const result = JSON.parse(output) as { results: { id: string; passed: boolean }[] }; + expect(result.results).toHaveLength(5); + expect(result.results.every((item) => item.passed)).toBe(true); + }); +}); diff --git a/tests/error-handling.test.ts b/tests/error-handling.test.ts index 5eecc6c..a0f0ab1 100644 --- a/tests/error-handling.test.ts +++ b/tests/error-handling.test.ts @@ -119,7 +119,7 @@ describe('Error Handling', () => { constructor( private maxRequests: number, - private windowMs: number + private windowMs: number, ) {} async add(fn: () => Promise): Promise { @@ -158,7 +158,10 @@ describe('Error Handling', () => { describe('Input Validation', () => { it('should validate prompt length', () => { - const validatePrompt = (prompt: string, maxLength = 10000): { valid: boolean; reason?: string } => { + const validatePrompt = ( + prompt: string, + maxLength = 10000, + ): { valid: boolean; reason?: string } => { if (!prompt || prompt.trim().length === 0) { return { valid: false, reason: 'Prompt is empty' }; } @@ -222,14 +225,14 @@ describe('Error Handling', () => { const checkContextLength = ( model: Model, promptTokens: number, - requestedTokens: number + requestedTokens: number, ): { valid: boolean; reason?: string } => { const totalTokens = promptTokens + requestedTokens; if (totalTokens > model.max_tokens) { return { valid: false, - reason: `Total tokens (${totalTokens}) exceeds model limit (${model.max_tokens})` + reason: `Total tokens (${totalTokens}) exceeds model limit (${model.max_tokens})`, }; } @@ -264,7 +267,7 @@ describe('Error Handling', () => { if (finishReason === 'content_filter') { return { safe: false, - action: 'Content was filtered due to safety policies' + action: 'Content was filtered due to safety policies', }; } @@ -292,8 +295,8 @@ describe('Error Handling', () => { error: { type: 'invalid_request_error', message: 'Invalid parameter value', - code: 'invalid_value' - } + code: 'invalid_value', + }, }; const message = parseError(error); @@ -345,7 +348,7 @@ describe('Error Handling', () => { activeRequests++; try { // Simulate async operation - await new Promise(resolve => setTimeout(resolve, 10)); + await new Promise((resolve) => setTimeout(resolve, 10)); } finally { activeRequests--; } @@ -353,11 +356,7 @@ describe('Error Handling', () => { // This should not throw expect(async () => { - await Promise.all([ - makeRequest(), - makeRequest(), - makeRequest() - ]); + await Promise.all([makeRequest(), makeRequest(), makeRequest()]); }).not.toThrow(); }); @@ -421,7 +420,7 @@ describe('Error Handling', () => { }; const clearAllTimeouts = (): void => { - timeouts.forEach(t => clearTimeout(t)); + timeouts.forEach((t) => clearTimeout(t)); timeouts.length = 0; }; diff --git a/tests/evaluators.test.ts b/tests/evaluators.test.ts index d140d56..9731153 100644 --- a/tests/evaluators.test.ts +++ b/tests/evaluators.test.ts @@ -61,11 +61,12 @@ describe('Evaluation Metrics', () => { const violations: CoherenceViolation[] = []; // Check for abrupt topic changes (simplified) - if (text.includes('however') && text.includes('but')) { + const normalized = text.toLowerCase(); + if (normalized.includes('however') && normalized.includes('but')) { violations.push({ type: 'contradictory_markers', - position: text.indexOf('but'), - severity: 'medium' + position: normalized.indexOf('but'), + severity: 'medium', }); } @@ -82,7 +83,7 @@ describe('Evaluation Metrics', () => { it('should calculate coherence score', () => { const calculateCoherence = (violations: number, textLength: number): number => { if (textLength === 0) return 0; - return Math.max(0, 1 - (violations / (textLength / 100))); + return Math.max(0, 1 - violations / (textLength / 100)); }; const score1 = calculateCoherence(0, 100); // No violations @@ -101,11 +102,11 @@ describe('Evaluation Metrics', () => { 'furthermore', 'consequently', 'meanwhile', - 'nevertheless' + 'nevertheless', ]; const text = 'The system works well. However, there are some issues.'; - const hasMarker = discourseMarkers.some(marker => text.toLowerCase().includes(marker)); + const hasMarker = discourseMarkers.some((marker) => text.toLowerCase().includes(marker)); expect(hasMarker).toBe(true); }); @@ -115,15 +116,19 @@ describe('Evaluation Metrics', () => { it('should detect hallucinations', () => { const detectHallucination = ( response: string, - context: string + context: string, ): { hasHallucination: boolean; confidence: number } => { // Simplified hallucination detection - const responseFacts = response.toLowerCase().split('.').filter(s => s.trim()); - const contextLower = context.toLowerCase(); + const tokenize = (value: string): Set => + new Set(value.toLowerCase().match(/[a-z0-9]+/g) ?? []); + const contextWords = tokenize(context); + const responseFacts = response.split('.').filter((s) => s.trim()); let unsupportedFacts = 0; - responseFacts.forEach(fact => { - if (fact.length > 10 && !contextLower.includes(fact.trim().substring(0, 20))) { + responseFacts.forEach((fact) => { + const factWords = tokenize(fact); + const supportedWords = [...factWords].filter((word) => contextWords.has(word)); + if (factWords.size > 0 && supportedWords.length / factWords.size < 0.5) { unsupportedFacts++; } }); @@ -131,7 +136,7 @@ describe('Evaluation Metrics', () => { const confidence = unsupportedFacts / Math.max(responseFacts.length, 1); return { hasHallucination: unsupportedFacts > 0, - confidence + confidence, }; }; @@ -146,10 +151,7 @@ describe('Evaluation Metrics', () => { }); it('should calculate faithfulness score', () => { - const calculateFaithfulness = ( - supportedClaims: number, - totalClaims: number - ): number => { + const calculateFaithfulness = (supportedClaims: number, totalClaims: number): number => { if (totalClaims === 0) return 1.0; return supportedClaims / totalClaims; }; @@ -167,16 +169,18 @@ describe('Evaluation Metrics', () => { const checkAttribution = (text: string): Attribution[] => { const attributions: Attribution[] = []; - const sentences = text.split('.').filter(s => s.trim()); + const sentences = text.split('.').filter((s) => s.trim()); - sentences.forEach(sentence => { - const hasAttribution = sentence.includes('according to') || - sentence.includes('states that') || - sentence.includes('reported that'); + sentences.forEach((sentence) => { + const normalized = sentence.toLowerCase(); + const hasAttribution = + normalized.includes('according to') || + normalized.includes('states that') || + normalized.includes('reported that'); attributions.push({ claim: sentence.trim(), - source: hasAttribution ? 'cited' : null + source: hasAttribution ? 'cited' : null, }); }); @@ -201,7 +205,7 @@ describe('Evaluation Metrics', () => { const words1 = new Set(text1.toLowerCase().split(/\s+/)); const words2 = new Set(text2.toLowerCase().split(/\s+/)); - const intersection = new Set([...words1].filter(w => words2.has(w))); + const intersection = new Set([...words1].filter((w) => words2.has(w))); const union = new Set([...words1, ...words2]); return intersection.size / union.size; @@ -219,9 +223,11 @@ describe('Evaluation Metrics', () => { it('should detect off-topic responses', () => { const isOnTopic = (prompt: string, response: string, threshold = 0.1): boolean => { - const words1 = new Set(prompt.toLowerCase().split(/\s+/)); - const words2 = new Set(response.toLowerCase().split(/\s+/)); - const intersection = new Set([...words1].filter(w => words2.has(w))); + const tokenize = (value: string): Set => + new Set(value.toLowerCase().match(/[a-z0-9]+/g) ?? []); + const words1 = tokenize(prompt); + const words2 = tokenize(response); + const intersection = new Set([...words1].filter((w) => words2.has(w))); const union = new Set([...words1, ...words2]); const similarity = intersection.size / union.size; @@ -239,13 +245,13 @@ describe('Evaluation Metrics', () => { it('should measure answer completeness', () => { const measureCompleteness = ( prompt: string, - response: string + response: string, ): { complete: boolean; coverage: number } => { // Extract question words const questionWords = ['what', 'why', 'how', 'when', 'where', 'who']; const promptLower = prompt.toLowerCase(); - const questionType = questionWords.find(w => promptLower.includes(w)); + const questionType = questionWords.find((w) => promptLower.includes(w)); const responseLength = response.split(/\s+/).length; // Simple heuristic: responses should have minimum length based on question @@ -258,7 +264,8 @@ describe('Evaluation Metrics', () => { const prompt = 'Why is the sky blue?'; const shortResponse = 'Because of light.'; - const completeResponse = 'The sky is blue because of Rayleigh scattering. When sunlight enters the atmosphere, shorter blue wavelengths scatter more than other colors.'; + const completeResponse = + 'The sky is blue because of Rayleigh scattering. When sunlight enters the atmosphere, shorter blue wavelengths scatter more than other colors.'; const result1 = measureCompleteness(prompt, shortResponse); const result2 = measureCompleteness(prompt, completeResponse); @@ -272,7 +279,7 @@ describe('Evaluation Metrics', () => { const createEvaluationPrompt = ( task: string, response: string, - criteria: string[] + criteria: string[], ): string => { return ` Evaluate the following response for the task: ${task} @@ -280,7 +287,7 @@ Evaluate the following response for the task: ${task} Response: ${response} Criteria: -${criteria.map(c => `- ${c}`).join('\n')} +${criteria.map((c) => `- ${c}`).join('\n')} Rate each criterion on a scale of 1-5 and provide overall feedback. `.trim(); @@ -289,7 +296,7 @@ Rate each criterion on a scale of 1-5 and provide overall feedback. const prompt = createEvaluationPrompt( 'Summarize the article', 'The article discusses climate change.', - ['Accuracy', 'Completeness', 'Clarity'] + ['Accuracy', 'Completeness', 'Clarity'], ); expect(prompt).toContain('Evaluate'); @@ -307,7 +314,7 @@ Rate each criterion on a scale of 1-5 and provide overall feedback. const scores: Record = {}; const lines = response.split('\n'); - lines.forEach(line => { + lines.forEach((line) => { const match = line.match(/(\w+):\s*(\d+)/); if (match) { scores[match[1].toLowerCase()] = parseInt(match[2]); @@ -315,9 +322,7 @@ Rate each criterion on a scale of 1-5 and provide overall feedback. }); const feedbackIndex = response.toLowerCase().indexOf('feedback:'); - const feedback = feedbackIndex >= 0 - ? response.substring(feedbackIndex + 9).trim() - : ''; + const feedback = feedbackIndex >= 0 ? response.substring(feedbackIndex + 9).trim() : ''; return { scores, feedback }; }; @@ -351,7 +356,7 @@ Feedback: Good overall but could be more detailed. accuracy: 4, completeness: 3, clarity: 5, - relevance: 4 + relevance: 4, }; const average = aggregateScores(scores); @@ -380,8 +385,8 @@ describe('Text Analysis Utilities', () => { describe('Readability Metrics', () => { it('should calculate sentence complexity', () => { const calculateComplexity = (text: string): number => { - const sentences = text.split(/[.!?]+/).filter(s => s.trim()); - const words = text.split(/\s+/).filter(w => w.trim()); + const sentences = text.split(/[.!?]+/).filter((s) => s.trim()); + const words = text.split(/\s+/).filter((w) => w.trim()); if (sentences.length === 0) return 0; @@ -390,7 +395,8 @@ describe('Text Analysis Utilities', () => { }; const simple = 'I like cats. They are nice.'; - const complex = 'The implementation of sophisticated algorithms requires comprehensive understanding of computational complexity theory.'; + const complex = + 'The implementation of sophisticated algorithms requires comprehensive understanding of computational complexity theory.'; const simpleComplexity = calculateComplexity(simple); const complexComplexity = calculateComplexity(complex); @@ -406,8 +412,8 @@ describe('Text Analysis Utilities', () => { const negative = ['bad', 'terrible', 'awful', 'horrible', 'poor']; const textLower = text.toLowerCase(); - const hasPositive = positive.some(word => textLower.includes(word)); - const hasNegative = negative.some(word => textLower.includes(word)); + const hasPositive = positive.some((word) => textLower.includes(word)); + const hasNegative = negative.some((word) => textLower.includes(word)); if (hasPositive && !hasNegative) return 'positive'; if (hasNegative && !hasPositive) return 'negative'; diff --git a/tests/execution.test.ts b/tests/execution.test.ts index 8c79906..ff21841 100644 --- a/tests/execution.test.ts +++ b/tests/execution.test.ts @@ -40,15 +40,11 @@ describe('ExecutionContext validation', () => { }); it('rejects empty execution_id', () => { - expect( - validateExecutionContext({ execution_id: '', parent_span_id: 'x' }) - ).toBe(false); + expect(validateExecutionContext({ execution_id: '', parent_span_id: 'x' })).toBe(false); }); it('rejects empty parent_span_id', () => { - expect( - validateExecutionContext({ execution_id: 'x', parent_span_id: '' }) - ).toBe(false); + expect(validateExecutionContext({ execution_id: 'x', parent_span_id: '' })).toBe(false); }); it('rejects missing fields', () => { @@ -58,9 +54,7 @@ describe('ExecutionContext validation', () => { }); it('rejects non-string fields', () => { - expect( - validateExecutionContext({ execution_id: 123, parent_span_id: 'x' }) - ).toBe(false); + expect(validateExecutionContext({ execution_id: 123, parent_span_id: 'x' })).toBe(false); }); }); @@ -72,9 +66,9 @@ describe('SpanManager creation', () => { }); it('throws ExecutionContextError with missing parent_span_id', () => { - expect(() => - SpanManager.create({ execution_id: 'x', parent_span_id: '' }) - ).toThrow(ExecutionContextError); + expect(() => SpanManager.create({ execution_id: 'x', parent_span_id: '' })).toThrow( + ExecutionContextError, + ); }); it('throws ExecutionContextError with null context', () => { @@ -119,9 +113,7 @@ describe('Agent span lifecycle', () => { mgr.endAgent(agent.span_id, 'completed'); const result = mgr.finalize('ok'); - const found = result.agent_spans.find( - (s) => s.span_id === agent.span_id - ); + const found = result.agent_spans.find((s) => s.span_id === agent.span_id); expect(found?.status).toBe('completed'); expect(found?.end_time).toBeTruthy(); }); @@ -132,9 +124,7 @@ describe('Agent span lifecycle', () => { mgr.endAgent(agent.span_id, 'failed', ['something broke']); const result = mgr.finalize(undefined, 'failed'); - const found = result.agent_spans.find( - (s) => s.span_id === agent.span_id - ); + const found = result.agent_spans.find((s) => s.span_id === agent.span_id); expect(found?.status).toBe('failed'); expect(found?.failure_reasons).toContain('something broke'); }); @@ -142,18 +132,14 @@ describe('Agent span lifecycle', () => { it('throws on unknown span_id', () => { const mgr = SpanManager.create(validCtx); mgr.startAgent('agent'); - expect(() => mgr.endAgent('nonexistent', 'completed')).toThrow( - ExecutionInvariantError - ); + expect(() => mgr.endAgent('nonexistent', 'completed')).toThrow(ExecutionInvariantError); }); it('throws on double-end', () => { const mgr = SpanManager.create(validCtx); const agent = mgr.startAgent('agent'); mgr.endAgent(agent.span_id, 'completed'); - expect(() => mgr.endAgent(agent.span_id, 'completed')).toThrow( - ExecutionInvariantError - ); + expect(() => mgr.endAgent(agent.span_id, 'completed')).toThrow(ExecutionInvariantError); }); }); @@ -186,7 +172,7 @@ describe('Artifact attachment', () => { reference: 'bad.json', artifact_type: 'results', agent_span_id: 'nonexistent', - }) + }), ).toThrow(ExecutionInvariantError); }); diff --git a/tests/npm-wrapper.test.ts b/tests/npm-wrapper.test.ts index b0f4e83..d6614cd 100644 --- a/tests/npm-wrapper.test.ts +++ b/tests/npm-wrapper.test.ts @@ -3,38 +3,18 @@ * Tests that the npm package correctly wraps the Rust CLI binary */ -import { describe, it, expect, beforeAll } from 'vitest'; -import { spawn, spawnSync } from 'child_process'; -import { existsSync } from 'fs'; +import { describe, it, expect } from 'vitest'; +import { spawnSync } from 'child_process'; +import { existsSync, readFileSync } from 'fs'; import { join } from 'path'; -import os from 'os'; +import ts from 'typescript'; describe('NPM Wrapper Tests', () => { - describe('Binary Discovery', () => { - it('should find the llm-test-bench binary', () => { - const binaryName = process.platform === 'win32' ? 'llm-test-bench.exe' : 'llm-test-bench'; - const cargoHome = process.env.CARGO_HOME || join(os.homedir(), '.cargo'); - const cargoBin = join(cargoHome, 'bin', binaryName); - - // Binary should exist in cargo bin or be in PATH - const exists = existsSync(cargoBin); - - if (!exists) { - // Try to find in PATH - const which = process.platform === 'win32' ? 'where' : 'which'; - const result = spawnSync(which, [binaryName], { encoding: 'utf8' }); - expect(result.status === 0 || exists).toBe(true); - } else { - expect(exists).toBe(true); - } - }); - }); - describe('Version Command', () => { it('should return version information', () => { const result = spawnSync('npm', ['run', '-s', 'test:cli', '--', '--version'], { encoding: 'utf8', - cwd: join(__dirname, '..') + cwd: join(__dirname, '..'), }); // Should exit successfully @@ -51,7 +31,7 @@ describe('NPM Wrapper Tests', () => { it('should display help information', () => { const result = spawnSync('npm', ['run', '-s', 'test:cli', '--', '--help'], { encoding: 'utf8', - cwd: join(__dirname, '..') + cwd: join(__dirname, '..'), }); if (result.status === 0) { @@ -66,7 +46,7 @@ describe('NPM Wrapper Tests', () => { it('should handle invalid commands gracefully', () => { const result = spawnSync('npm', ['run', '-s', 'test:cli', '--', 'invalid-command'], { encoding: 'utf8', - cwd: join(__dirname, '..') + cwd: join(__dirname, '..'), }); // Should exit with non-zero status for invalid command @@ -79,25 +59,25 @@ describe('NPM Wrapper Tests', () => { describe('Package Metadata', () => { it('should have valid package.json', () => { - const packageJson = require('../package.json'); + const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')); - expect(packageJson.name).toBe('llm-test-bench'); + expect(packageJson.name).toBe('@llm-dev-ops/test-bench-sdk'); expect(packageJson.version).toMatch(/\d+\.\d+\.\d+/); expect(packageJson.description).toBeTruthy(); expect(packageJson.keywords).toContain('llm'); expect(packageJson.keywords).toContain('testing'); - expect(packageJson.bin).toHaveProperty('ltb'); + expect(packageJson.exports).toHaveProperty('.'); }); it('should have proper engine requirements', () => { - const packageJson = require('../package.json'); + const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')); expect(packageJson.engines).toBeDefined(); expect(packageJson.engines.node).toMatch(/>=\d+\.\d+\.\d+/); }); it('should include required scripts', () => { - const packageJson = require('../package.json'); + const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')); expect(packageJson.scripts).toBeDefined(); expect(packageJson.scripts.test).toBeDefined(); @@ -107,7 +87,7 @@ describe('Package Metadata', () => { describe('TypeScript Support', () => { it('should have TypeScript definitions', () => { - const packageJson = require('../package.json'); + const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')); expect(packageJson.types).toBeDefined(); expect(packageJson.types).toMatch(/\.d\.ts$/); @@ -117,7 +97,8 @@ describe('TypeScript Support', () => { const tsconfigPath = join(__dirname, '..', 'tsconfig.json'); expect(existsSync(tsconfigPath)).toBe(true); - const tsconfig = require('../tsconfig.json'); + const { config: tsconfig, error } = ts.readConfigFile(tsconfigPath, ts.sys.readFile); + expect(error).toBeUndefined(); expect(tsconfig.compilerOptions).toBeDefined(); }); }); diff --git a/tests/policy-gate.test.ts b/tests/policy-gate.test.ts index 70a4572..8293e25 100644 --- a/tests/policy-gate.test.ts +++ b/tests/policy-gate.test.ts @@ -232,7 +232,7 @@ describe('Exemption recording', () => { // Exemption appears in artifacts const exemptionArtifacts = result.artifacts.filter( - (a) => a.artifact_type === 'policy_exemption' + (a) => a.artifact_type === 'policy_exemption', ); expect(exemptionArtifacts).toHaveLength(1); expect(exemptionArtifacts[0].agent_span_id).toBe(agent.span_id); diff --git a/tests/providers.test.ts b/tests/providers.test.ts index c14853d..01285b5 100644 --- a/tests/providers.test.ts +++ b/tests/providers.test.ts @@ -12,7 +12,7 @@ describe('Provider Interface', () => { prompt: 'Hello, world!', temperature: 0.7, max_tokens: 100, - stream: false + stream: false, }; expect(request.model).toBeTruthy(); @@ -27,12 +27,12 @@ describe('Provider Interface', () => { const validTemperatures = [0, 0.5, 0.7, 1.0, 1.5, 2.0]; const invalidTemperatures = [-0.1, 2.1, -1, 3]; - validTemperatures.forEach(temp => { + validTemperatures.forEach((temp) => { expect(temp).toBeGreaterThanOrEqual(0); expect(temp).toBeLessThanOrEqual(2); }); - invalidTemperatures.forEach(temp => { + invalidTemperatures.forEach((temp) => { const isValid = temp >= 0 && temp <= 2; expect(isValid).toBe(false); }); @@ -48,7 +48,7 @@ describe('Provider Interface', () => { it('should support optional parameters', () => { const minimalRequest = { model: 'gpt-4', - prompt: 'Test' + prompt: 'Test', }; const fullRequest = { @@ -58,7 +58,7 @@ describe('Provider Interface', () => { max_tokens: 100, top_p: 0.9, stop: ['END'], - stream: false + stream: false, }; expect(minimalRequest.model).toBeTruthy(); @@ -80,9 +80,9 @@ describe('Provider Interface', () => { usage: { prompt_tokens: 10, completion_tokens: 15, - total_tokens: 25 + total_tokens: 25, }, - created: Date.now() + created: Date.now(), }; expect(response.id).toBeTruthy(); @@ -97,7 +97,7 @@ describe('Provider Interface', () => { const usage = { prompt_tokens: 10, completion_tokens: 15, - total_tokens: 25 + total_tokens: 25, }; expect(usage.prompt_tokens).toBeGreaterThan(0); @@ -106,9 +106,15 @@ describe('Provider Interface', () => { }); it('should support different finish reasons', () => { - const validFinishReasons = ['stop', 'length', 'content_filter', 'tool_calls', 'function_call']; + const validFinishReasons = [ + 'stop', + 'length', + 'content_filter', + 'tool_calls', + 'function_call', + ]; - validFinishReasons.forEach(reason => { + validFinishReasons.forEach((reason) => { expect(validFinishReasons).toContain(reason); }); }); @@ -122,7 +128,7 @@ describe('Provider Interface', () => { provider: 'openai', max_tokens: 8192, supports_streaming: true, - supports_functions: true + supports_functions: true, }; expect(modelInfo.id).toBeTruthy(); @@ -138,10 +144,10 @@ describe('Provider Interface', () => { { id: 'gpt-4', max_tokens: 8192 }, { id: 'gpt-4-turbo', max_tokens: 128000 }, { id: 'gpt-3.5-turbo', max_tokens: 16385 }, - { id: 'claude-3-opus', max_tokens: 200000 } + { id: 'claude-3-opus', max_tokens: 200000 }, ]; - models.forEach(model => { + models.forEach((model) => { expect(model.max_tokens).toBeGreaterThan(0); expect(model.max_tokens).toBeLessThanOrEqual(1000000); // Reasonable upper bound }); @@ -153,7 +159,7 @@ describe('Provider Interface', () => { const chunk = { content: 'Hello', is_final: false, - finish_reason: null + finish_reason: null, }; expect(chunk.content).toBeDefined(); @@ -165,7 +171,7 @@ describe('Provider Interface', () => { const finalChunk = { content: '', is_final: true, - finish_reason: 'stop' + finish_reason: 'stop', }; expect(finalChunk.is_final).toBe(true); @@ -182,10 +188,10 @@ describe('Provider Interface', () => { 'ServerError', 'NetworkError', 'TimeoutError', - 'InvalidModel' + 'InvalidModel', ]; - errorTypes.forEach(errorType => { + errorTypes.forEach((errorType) => { expect(errorTypes).toContain(errorType); expect(errorType).toBeTruthy(); }); @@ -195,7 +201,7 @@ describe('Provider Interface', () => { const rateLimitError = { type: 'RateLimitExceeded', message: 'Rate limit exceeded', - retry_after: 60 // seconds + retry_after: 60, // seconds }; expect(rateLimitError.type).toBe('RateLimitExceeded'); @@ -209,8 +215,8 @@ describe('Provider Interface', () => { details: { parameter: 'temperature', value: 3.0, - expected: '0-2' - } + expected: '0-2', + }, }; expect(error.type).toBeTruthy(); @@ -225,7 +231,7 @@ describe('Provider-Specific Features', () => { it('should support GPT models', () => { const models = ['gpt-4', 'gpt-4-turbo', 'gpt-3.5-turbo', 'gpt-4o']; - models.forEach(model => { + models.forEach((model) => { expect(model).toMatch(/^gpt-/); }); }); @@ -241,11 +247,11 @@ describe('Provider-Specific Features', () => { parameters: { type: 'object', properties: { - location: { type: 'string' } - } - } - } - ] + location: { type: 'string' }, + }, + }, + }, + ], }; expect(request.functions).toBeDefined(); @@ -259,10 +265,10 @@ describe('Provider-Specific Features', () => { const models = [ 'claude-3-opus-20240229', 'claude-3-sonnet-20240229', - 'claude-3-haiku-20240307' + 'claude-3-haiku-20240307', ]; - models.forEach(model => { + models.forEach((model) => { expect(model).toMatch(/^claude-/); }); }); @@ -271,7 +277,7 @@ describe('Provider-Specific Features', () => { const request = { model: 'claude-3-opus-20240229', system: 'You are a helpful assistant.', - prompt: 'Hello!' + prompt: 'Hello!', }; expect(request.system).toBeTruthy(); @@ -281,14 +287,9 @@ describe('Provider-Specific Features', () => { describe('Google', () => { it('should support Gemini models', () => { - const models = [ - 'gemini-pro', - 'gemini-pro-vision', - 'gemini-1.5-pro', - 'gemini-1.5-flash' - ]; + const models = ['gemini-pro', 'gemini-pro-vision', 'gemini-1.5-pro', 'gemini-1.5-flash']; - models.forEach(model => { + models.forEach((model) => { expect(model).toMatch(/^gemini-/); }); }); @@ -297,7 +298,7 @@ describe('Provider-Specific Features', () => { const request = { model: 'gemini-pro-vision', prompt: 'What is in this image?', - images: ['data:image/png;base64,iVBORw0KG...'] + images: ['data:image/png;base64,iVBORw0KG...'], }; expect(request.images).toBeDefined(); @@ -311,27 +312,19 @@ describe('Provider Factory', () => { const configs = [ { name: 'openai', type: 'OpenAI' }, { name: 'anthropic', type: 'Anthropic' }, - { name: 'google', type: 'Google' } + { name: 'google', type: 'Google' }, ]; - configs.forEach(config => { + configs.forEach((config) => { expect(config.name).toBeTruthy(); expect(config.type).toBeTruthy(); }); }); it('should validate provider names', () => { - const validProviders = [ - 'openai', - 'anthropic', - 'google', - 'cohere', - 'mistral', - 'groq', - 'ollama' - ]; + const validProviders = ['openai', 'anthropic', 'google', 'cohere', 'mistral', 'groq', 'ollama']; - validProviders.forEach(provider => { + validProviders.forEach((provider) => { expect(provider).toMatch(/^[a-z]+$/); expect(provider.length).toBeGreaterThan(0); }); diff --git a/tsconfig.json b/tsconfig.json index 41d5321..e2ad21c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -42,9 +42,7 @@ "incremental": true, "tsBuildInfoFile": "./dist/.tsbuildinfo" }, - "include": [ - "src/**/*" - ], + "include": ["src/**/*"], "exclude": [ "node_modules", "dist", diff --git a/tsconfig.test.json b/tsconfig.test.json index fc7defe..238f1f3 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -4,10 +4,5 @@ "noEmit": true, "types": ["vitest/globals", "node"] }, - "include": [ - "src/**/*", - "tests/**/*", - "**/*.spec.ts", - "**/*.test.ts" - ] + "include": ["src/**/*", "tests/**/*", "**/*.spec.ts", "**/*.test.ts"] }