diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..dbbb94b4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + test: + name: test (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm run release:check-assets + - run: pnpm test + - run: pnpm run compile:cli + - run: pnpm run benchmark:smoke + - run: pnpm run eval:smoke diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..9df92d3f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,28 @@ +name: Release + +on: + push: + tags: + - 'v*' + +jobs: + package: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm run compile + - run: pnpm exec vsce package + - name: Generate release notes + run: node dist/cli.js changelog > release-notes.md + - uses: softprops/action-gh-release@v2 + with: + body_path: release-notes.md + files: '*.vsix' diff --git a/.gitignore b/.gitignore index 4a2cad7b..4c331ae6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,24 @@ dist/ .thunder V2/ .mitii project-goals/ -mitii-debug-logs/ \ No newline at end of file +mitii-debug-logs/ + +# Benchmark / eval runtime (local generation and reports) +tools/benchmark/tasks/eval/generated/ +tools/benchmark/tasks/eval/generated-smoke/ +tools/benchmark/results/ + +# Fixture sandboxes — deps, builds, Mitii session state +tools/benchmark/fixtures/**/.mitii/ +tools/benchmark/fixtures/**/.next/ +tools/benchmark/fixtures/**/dist/ +tools/benchmark/fixtures/**/node_modules/ +tools/benchmark/fixtures/**/package-lock.json +tools/benchmark/fixtures/**/pnpm-lock.yaml + +# Agent-created during eval (not part of pinned fixture baseline) +tools/benchmark/fixtures/**/docs/ +tools/benchmark/fixtures/**/index.html +tools/benchmark/fixtures/**/src/index.css +tools/benchmark/fixtures/**/src/main.ts +tools/benchmark/fixtures/**/src/main.tsx diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..79587cd2 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +# vsce runs `npm list` to resolve production dependencies; pnpm's default +# isolated linker hoists transitive packages that npm treats as extraneous. +node-linker=hoisted diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f1a1e065..72428fa5 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -11,7 +11,7 @@ { "label": "thunder: rebuild native", "type": "shell", - "command": "npm run rebuild:native", + "command": "pnpm run rebuild:native", "problemMatcher": [], "presentation": { "reveal": "always", "panel": "shared" } }, diff --git a/.vscodeignore b/.vscodeignore index e6d12c89..377c65ae 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -18,6 +18,7 @@ scripts/** .gitignore .vscodeignore package-lock.json +pnpm-lock.yaml tsconfig.json vite.config.ts vitest.config.ts @@ -26,4 +27,5 @@ vitest.config.ts !dist/** !media/** -!bundled-skills/** + +tools/benchmark/** diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..24b97afc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog + +## [Unreleased] + +## [2.7.17] - 2026-07-02 + +### Added +- Implemented the backlog end-to-end across the repo. What changed: Added diff-first micro-task routing for commit messages, changelog entries, and release notes. Unified SCM commit message generation through the new micro-task executor. Added changelog/release generation core, VS Code commands, CHANGELOG.md, and CI release workflow. Added one-click audit pack export with zip generation, redaction report, manifest, tool audit, and approvals. Improved reasoning stream UI: live reveal, no 1200-char hard cap, configurable visibility/preview size. Added enterprise settings/docs for local-only providers, audit redaction, procurement/security/compliance. Added Windows path hardening, Windows CI matrix, and Windows smoke checklist. Added CLI MVP for changelog, prepare-release, and export-audit. Updated README with the new enterprise, audit, release, CLI, and reasoning features. Added focused tests for all new core implementations. (8a00fd537ef2) +- add AWS Bedrock, Azure OpenAI, and OpenRouter provider support (cac73bc1a9a7) +- **modes:** add pilot and enterprise depth levels to Ask, Plan, and Act modes (ca3d2daf6375) +- **orchestrator:** add planning clarification question flow with resume support (0d052937fb8e) +- auto-discover verify commands, add retry with install, cap sequential-thinking calls (6786a1d904fe) +- improve plan step UI, add skipped tool handling, and strip channel markers (d65a81752037) +- add GitHub token setting and improve issue comment pagination (7c8e53d68036) +- Implemented the core folder structure migration safely. (017ddd4d0766) +- auto-fetch GitHub issue context when user pastes an issue URL (1f0b368dfb50) +- add retrieval timing metrics, repeated tool failure guard, and Act mode MCP exclusions (dda2e8f38881) +- add Act orchestration boundary for Agent mode execution (0620f2e55902) +- **docs:** update README with enhanced project description, features, and usage instructions (920bf12f6f38) +- **plan:** add skill-aware planning pipeline with phased PlanPanel UI (e23f19d9e929) +- bundle skill playbooks inside extension and auto-install on workspace init (07a83238eb87) +- add planDepth setting and skill frontmatter parsing (d77ed8f6062f) +- **plan-mode:** add Plan mode orchestration with intent routing and read-only grounding (14372af57d12) +- **core:** add file read caching and parallelize read files tool (95dee1dbc8ac) +- **scm:** add AI-generated commit messages and ask-mode depth controls (8ea94111e43f) +- **ask:** add structured ask mode with intent routing, scope resolution, and impact analysis (aa2660f9ef3d) + +### Changed +- add project-goals entry to .gitignore configuration (81ecf0da086c) +- Merge branch 'main' of https://github.com/codewithshinde/thunder-ai-agent (957469705bc4) +- **tools:** remove unused resolveToolDirPath and related imports (44a3dd3d0a8c) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6a8683cc..17fd4fff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,7 @@ For bugs and feature ideas, open an [issue](https://github.com/codewithshinde/th |------|---------| | VS Code | 1.85+ (or Cursor, with native rebuild noted below) | | Node.js | 20+ | -| npm | 9+ (ships with Node 20) | +| pnpm | 10.13+ | | git | any recent version | Optional but useful for full feature coverage: @@ -36,12 +36,12 @@ Optional but useful for full feature coverage: ```bash git clone https://github.com/codewithshinde/thunder-ai-agent.git cd thunder-ai-agent -npm install -npm run rebuild:native # required for better-sqlite3 in VS Code -npm run compile +pnpm install +pnpm run rebuild:native # required for better-sqlite3 in VS Code +pnpm run compile ``` -Git hooks are installed automatically via `npm install` → `prepare` → `scripts/install-git-hooks.mjs`. The pre-commit hook stages version bumps from `scripts/bump-version.mjs`. +Git hooks are installed automatically via `pnpm install` -> `prepare` -> `scripts/install-git-hooks.mjs`. The pre-commit hook stages version bumps from `scripts/bump-version.mjs`. ### Launch the extension @@ -53,7 +53,7 @@ Git hooks are installed automatically via `npm install` → `prepare` → `scrip ### Watch mode (day-to-day dev) ```bash -npm run watch +pnpm run watch ``` Rebuilds the extension bundle and webview on save. Reload the Extension Development Host window after extension-side changes (`Ctrl/Cmd+R` in the host window, or restart the debug session). @@ -63,7 +63,7 @@ Rebuilds the extension bundle and webview on save. Reload the Extension Developm ## Project layout ``` -thunder-ai-agent/ +mitii-ai-agent/ ├── src/ │ ├── extension.ts # VS Code entry point │ ├── core/ # Agent logic (editor-agnostic) @@ -89,7 +89,9 @@ thunder-ai-agent/ │ └── src/ ├── test/ # Vitest tests ├── scripts/ # Build, audit, hook helpers +├── tools/benchmark/ # @mitii/benchmark — fixtures, enterprise + eval harness ├── dist/ # Compiled output (gitignored) +├── pnpm-workspace.yaml # Workspace: tools/* └── package.json # Extension manifest + settings schema ``` @@ -100,7 +102,20 @@ thunder-ai-agent/ Scaffolds may exist at `mitii-docs/` and `mitii-website/` in this tree while you split them out. Brand constants: `src/shared/brand.ts` (sync with each repo's `brand.ts`). -**Rule of thumb:** keep VS Code APIs out of `src/core/`. Core should be testable without launching an editor. Put platform glue in `src/vscode/`. +**Rule of thumb:** keep VS Code APIs out of `src/core/`. Core should be testable without launching an editor. Put platform glue in `src/vscode/`. Keep benchmark and eval in `tools/benchmark/` — they are not extension runtime code. + +### Benchmark and eval + +```bash +pnpm run compile:cli +pnpm run benchmark:smoke +pnpm run eval:preflight # before real-runtime eval +pnpm run eval:generate +pnpm run eval:standard -- --provider openai-compatible \ + --base-url http://localhost:11434/v1 --model qwen3-coder:30b --limit 50 +``` + +See [tools/benchmark/README.md](tools/benchmark/README.md) for sharded runs, Ollama matrix, and Inspect AI. --- @@ -109,23 +124,23 @@ Scaffolds may exist at `mitii-docs/` and `mitii-website/` in this tree while you ### Run tests ```bash -npm run rebuild:node # if better-sqlite3 fails under vitest -npm test # full suite -npm run test:watch # watch mode -npm run smoke # smoke tests only +pnpm run rebuild:node # if better-sqlite3 fails under vitest +pnpm test # full suite +pnpm run test:watch # watch mode +pnpm run smoke # smoke tests only ``` ### Typecheck ```bash -npm run lint # tsc --noEmit +pnpm run lint # tsc --noEmit ``` ### Build a VSIX ```bash -npm run compile -npm run package # outputs thunder-ai-agent-.vsix +pnpm run compile +pnpm run package # outputs thunder-ai-agent-.vsix ``` Install locally: **Extensions → ... → Install from VSIX**. @@ -134,20 +149,20 @@ Install locally: **Extensions → ... → Install from VSIX**. | Scenario | Command | |----------|---------| -| F5 / VS Code extension host | `npm run rebuild:native` | -| Cursor extension host | `THUNDER_EDITOR=cursor npm run rebuild:native` | -| Local vitest | `npm run rebuild:node` | -| Both | `npm run rebuild:all` | +| F5 / VS Code extension host | `pnpm run rebuild:native` | +| Cursor extension host | `THUNDER_EDITOR=cursor pnpm run rebuild:native` | +| Local vitest | `pnpm run rebuild:node` | +| Both | `pnpm run rebuild:all` | If SQLite throws on startup, this is almost always the fix. ### Audit scripts ```bash -npm run audit:dependencies -npm run audit:dead-code -npm run check:circular-deps -npm run audit:engines +pnpm run audit:dependencies +pnpm run audit:dead-code +pnpm run check:circular-deps +pnpm run audit:engines ``` These are useful before large refactors. Not required on every PR, but run them if you touch imports or dependencies. @@ -174,7 +189,7 @@ The pre-commit hook may stage a version bump in `package.json`. Include that in ### Code style -- TypeScript strict mode — `npm run lint` must pass +- TypeScript strict mode - `pnpm run lint` must pass - Match surrounding patterns: no drive-by refactors in unrelated files - Logging via `createLogger('ComponentName')` from `src/core/telemetry/Logger.ts`, not raw `console.log` - New VS Code settings go in `package.json` contributes **and** `src/core/config/schema.ts` **and** `src/core/config/vscodeSettings.ts` @@ -200,7 +215,7 @@ The pre-commit hook may stage a version bump in `package.json`. Include that in 1. Fork and branch from `main` 2. Make your change; keep the diff focused -3. Run `npm run lint` and `npm test` +3. Run `pnpm run lint` and `pnpm test` 4. Manually smoke-test in the Extension Development Host if you touched agent behavior or UI 5. Open a PR against `main` with: - What changed and why (2–4 sentences is fine) diff --git a/README.md b/README.md index 93032c56..b5e186d0 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ License: AGPL v3 VS Code 1.85+ Node 20+ - Version 2.7.7 + Version 2.7.29 Website Docs

@@ -31,7 +31,7 @@ Mitii is built for developers who want an AI agent that understands the repo before changing it. It runs inside VS Code, indexes your workspace locally, plans work before execution, asks for approval when risk is involved, and keeps a useful trail of memory, checkpoints, logs, and task plans. -Use it with Ollama, LM Studio, OpenAI-compatible endpoints, OpenAI, Anthropic, Gemini, DeepSeek, Cursor-compatible APIs, Codex-compatible APIs, or the Echo provider for UI testing. +Use it with Ollama, LM Studio, OpenAI-compatible endpoints, native OpenRouter, Azure OpenAI, AWS Bedrock, OpenAI, Anthropic, Gemini, DeepSeek, Cursor-compatible APIs, Codex-compatible APIs, or the Echo provider for UI testing. **Docs:** [docs.mitii.dev](https://docs.mitii.dev) **Website:** [mitii.dev](https://mitii.dev) @@ -54,6 +54,7 @@ Most coding agents are powerful, but they often make one of these tradeoffs: | Tool limits | External tools are hard to connect or audit | Supports MCP servers while still routing tools through Mitii safety policy | | Repeated workflows | Teams paste the same instructions into every chat | Supports project rules and workspace skills through `SKILL.md` files | | Issue-to-fix handoff | Bug reports live in GitHub while the code lives in the editor | Detects GitHub issue URLs, fetches structured issue context, and routes Agent mode through the verified bugfix path | +| Procurement evidence | Security reviewers need logs, approvals, and data-flow answers | Exports an audit pack zip and ships enterprise security/compliance docs | Mitii is not just a chat panel. It is a workspace-aware agent runtime for real engineering work. @@ -73,6 +74,7 @@ The strongest thing Mitii provides is a practical balance: **deep local context | GitHub issue ingestion | Paste a GitHub issue URL and Mitii turns title, body, labels, and comments into structured task context | | Built for long tasks | Auto-continue, persisted task state, context compaction, and session history reduce restart pain | | Model freedom | Use local models for privacy, cloud models for capability, or different models for Plan, Act, and research | +| Diff-first micro-tasks | Commit messages, changelog entries, and release notes use minimal Git context instead of full agent routing | --- @@ -148,9 +150,9 @@ Paste a GitHub issue URL in Agent mode, for example: Fix https://github.com/owner/repo/issues/123 ``` -Mitii detects `github.com/{owner}/{repo}/issues/{number}`, fetches the issue through the GitHub REST API when network access is allowed, and injects a structured context block containing the title, body, state, labels, assignees, milestone, and recent comments. The Act router treats the issue signal as a verified bugfix workflow, so the agent investigates the open workspace, makes scoped edits, and runs relevant verification. +Mitii detects `github.com/{owner}/{repo}/issues/{number}`, fetches the issue through the GitHub REST API when network access is allowed, and injects a structured context block containing the title, body, state, labels, assignees, milestone, and newest comments. When the fetch succeeds, the Act router treats the issue signal as a verified bugfix workflow, so the agent investigates the open workspace, makes scoped edits, and runs relevant verification. -If the active safety preset disables network access, Mitii still injects a lightweight reference block with the repository and issue number instead of scraping GitHub HTML. Private repository support uses a GitHub token stored in VS Code SecretStorage under `thunder.github.token` by default; the setting stores only the secret key name, not the token value. +If the active safety preset disables network access or GitHub cannot be reached, Mitii still injects a lightweight reference block with the repository and issue number instead of scraping GitHub HTML. Private repository support uses a GitHub token stored in VS Code SecretStorage under `thunder.github.token` by default; enter or replace the token from **Settings → Integrations → GitHub issues**. The VS Code setting stores only the secret key name, not the token value. ### 4. Safer Tool Execution @@ -202,6 +204,21 @@ Mitii stores useful state locally so every serious task does not start from zero Post-task memory extraction can capture useful observations after completed work, so future sessions can reuse decisions without asking you to repeat context. +Audit review is available through `Mitii: Export Audit Pack`. The zip contains sanitized `session.jsonl`, `summary.md`, `manifest.json`, `tool-audit.json`, `approvals.json`, `redaction-report.json`, and `signature.json` with SHA-256 hashes for tamper detection. Set `MITII_AUDIT_SIGNING_KEY` to add HMAC signing, then verify archives with `mitii verify-audit `. + +### Release Automation + +Mitii includes release hygiene commands: + +| Command | Output | +|---|---| +| `Mitii: Generate Changelog Entry` | Preview a Keep a Changelog-style entry from Conventional Commits | +| `Mitii: Prepare Release` | Update `CHANGELOG.md` and write `.mitii/release-notes.md` | +| `mitii changelog` | Headless changelog entry for CI/scripts | +| `mitii prepare-release` | Headless changelog + release-notes generation | +| `mitii export-audit` | Headless audit pack export from JSONL logs | +| `mitii verify-audit` | Verify audit pack signatures and file hashes | + ### 7. Skills And Project Playbooks Mitii can load reusable workflow instructions from `SKILL.md` files. Bundled skills are copied into each workspace under `.mitii/skills/` on first init, and teams can add their own skills for code review, planning, debugging, testing, performance work, release flow, and cleanup. @@ -244,6 +261,26 @@ The sidebar is a React webview with: | Indexing status | Know when the workspace brain is ready | | Context warnings | See when context may be thin or over budget | +Reasoning deltas from supported providers stream live in the chat UI. Use `thunder.ui.showReasoning` and `thunder.ui.reasoningPreviewMaxChars` to control visibility and inline preview size. + +Mitii also detects common model capabilities from the provider/model name, including vision and reasoning support. Enterprise teams can override detection with `thunder.provider.supportsVision` and `thunder.provider.supportsReasoning` when routing through private or custom OpenAI-compatible gateways. + +## Enterprise Readiness + +Enterprise review materials live in [docs/enterprise](docs/enterprise/README.md). The pack covers data flow, provider boundaries, procurement FAQs, compliance mapping, Windows support, and auditability. + +| Control | Setting or command | +|---|---| +| Route narrow Git/release tasks through minimal context | `thunder.context.microTaskRoutingEnabled` | +| Require local model providers | `thunder.enterprise.localProvidersOnly` | +| Strip file contents from exported audit packs | `thunder.enterprise.stripFileContentsFromAuditPacks` | +| Auto-export audit packs after agent turns | `thunder.enterprise.autoExportAuditPackOnSessionEnd` | +| Verify audit pack integrity | `mitii verify-audit ` | +| Disable session logging | `thunder.telemetry.sessionLogging` | +| Stream sanitized SIEM events | `thunder.telemetry.webhookUrl` and optional `thunder.telemetry.webhookSecret` | +| Export audit evidence | `Mitii: Export Audit Pack` | +| Windows smoke checklist | [docs/qa/WINDOWS_SMOKE.md](docs/qa/WINDOWS_SMOKE.md) | + --- ## Analysis: Why This Design Works @@ -323,6 +360,7 @@ This section is written carefully. Models and products change fast. Mitii does n | Long-running tasks | Auto-continue, task-state persistence, session history, and wake-up checkpoints | | Teams that need guardrails | Approval modes, autonomy presets, untrusted workspace blocking, dangerous-command blocking | | Local model setups | Ollama and OpenAI-compatible providers are first-class | +| Cloud routing | Native OpenRouter headers/reasoning, Azure OpenAI deployment URLs, and AWS Bedrock Converse support are built in | | Custom internal tools | MCP support without skipping Mitii's policy layer | | VS Code users | No need to move to a separate AI editor | @@ -364,21 +402,20 @@ This is why Mitii focuses on visible plans, local logs, checkpoints, and verific |---|---| | VS Code | 1.85+ | | Node.js | 20+ | -| npm | 9+ | +| pnpm | 10.13+ | ```bash -git clone https://github.com/codewithshinde/thunder-ai-agent.git -cd thunder-ai-agent -npm install -npm run compile +git clone https://github.com/codewithshinde/mitii-ai-agent.git +cd mitii-ai-agent +pnpm run setup ``` -Press **F5** in VS Code to launch the Extension Development Host. Open a folder, wait for the indexing status in the Mitii sidebar, then start chatting. +`pnpm run setup` installs dependencies, compiles the extension and webview, rebuilds native modules for VS Code on macOS, and rebuilds local Node native modules for tests. Press **F5** in VS Code to launch the Extension Development Host. Open a folder, wait for the indexing status in the Mitii sidebar, then start chatting. ### Connect A Model 1. Open **Settings** in the Mitii sidebar, or VS Code settings under `Mitii AI Agent`. -2. Set `thunder.provider.type` to `openai-compatible`. +2. Set `thunder.provider.type` to `openai-compatible`, `openrouter`, `azure-openai`, or another supported provider. 3. Point `thunder.provider.baseUrl` at your endpoint. The default is `http://localhost:11434/v1` for Ollama. 4. Set `thunder.provider.model`. The default is `qwen3-coder:30b`. @@ -389,7 +426,10 @@ Use the Echo provider for UI testing without an LLM. API keys are stored through | Provider | Default model | Notes | |---|---|---| | OpenAI-compatible | `qwen3-coder:30b` | Ollama, LM Studio, vLLM, local gateways | +| OpenRouter | `anthropic/claude-sonnet-4` | Native headers and reasoning deltas | | OpenAI | `gpt-4.1` | API key required | +| Azure OpenAI | `your-deployment-name` | API key required; model field is the deployment name; uses `thunder.provider.apiVersion` | +| AWS Bedrock | `anthropic.claude-3-5-sonnet-20240620-v1:0` | Uses AWS default credential chain and `thunder.provider.region`; tool calls disabled by default | | Anthropic | `claude-sonnet-4-20250514` | API key required | | Gemini | `gemini-2.0-flash` | API key required | | DeepSeek | `deepseek-chat` | API key required | @@ -422,6 +462,8 @@ Use the Echo provider for UI testing without an LLM. API keys are stored through "thunder.provider.type": "openai-compatible", "thunder.provider.baseUrl": "http://localhost:11434/v1", "thunder.provider.model": "qwen3-coder:30b", + "thunder.provider.apiVersion": "2024-10-21", + "thunder.provider.region": "us-east-1", "thunder.provider.contextWindow": 8192, "thunder.safety.autonomyPreset": "guided", "thunder.safety.approvalMode": "review_all", @@ -435,7 +477,9 @@ Use the Echo provider for UI testing without an LLM. API keys are stored through "thunder.github.issueCommentLimit": 8, "thunder.github.tokenRef": "thunder.github.token", "thunder.agent.verifyCommands": ["npm run lint", "npm test"], - "thunder.telemetry.sessionLogging": true + "thunder.telemetry.sessionLogging": true, + "thunder.telemetry.webhookUrl": "", + "thunder.enterprise.autoExportAuditPackOnSessionEnd": false } ``` @@ -509,13 +553,45 @@ Mitii does not send your data to a Mitii server. If you use a cloud model provid See [CONTRIBUTING.md](CONTRIBUTING.md) for setup, project layout, testing, and pull request guidelines. +### Repository layout + +```text +mitii-ai-agent/ # VS Code extension (ships as .vsix) +├── src/ # Extension + core agent runtime +├── scripts/ # Build, release, and audit helpers +├── test/ # Vitest suite +├── tools/benchmark/ # @mitii/benchmark — benchmark + eval (not in VSIX) +│ ├── fixtures/ # Pinned sample repos +│ ├── tasks/enterprise/ # ~26 fixed benchmark tasks +│ └── tasks/eval/ # Generated 500–1000 task shards +├── pnpm-workspace.yaml # tools/* workspace packages +└── package.json +``` + +Benchmark and eval live in `tools/benchmark/` as a private pnpm workspace package. They call the compiled CLI (`dist/cli.js`) and are excluded from the published extension. See [tools/benchmark/README.md](tools/benchmark/README.md) for full run instructions. + +```bash +pnpm run watch # extension + webview hot rebuild +pnpm run setup # one-click local dev setup +pnpm run setup:cursor # setup using Cursor Electron runtime on macOS +pnpm run test # unit tests +pnpm run lint # typecheck +pnpm run smoke # smoke tests only +pnpm run package # build .vsix +pnpm run package:preflight # lint, rebuild, test, package +``` + +### Benchmark and eval + ```bash -npm run watch # extension + webview hot rebuild -npm run test # unit tests -npm run lint # typecheck -npm run smoke # smoke tests -npm run package # build .vsix -npm run package:preflight # lint, rebuild, test, package +pnpm run compile:cli +pnpm run benchmark:smoke # enterprise benchmark (3 tasks, echo/stub) +pnpm run benchmark:all # all enterprise tasks, real runtime +pnpm run eval:preflight # verifies better-sqlite3 for Node (run rebuild:node first) +pnpm run eval:generate # generate 500 standard eval tasks +pnpm run eval:smoke # eval wiring check (CI) +pnpm run eval:standard -- --provider openai-compatible \ + --base-url http://localhost:11434/v1 --model qwen3-coder:30b --limit 50 ``` ### Native Rebuilds @@ -524,29 +600,41 @@ VS Code and Cursor ship their own Electron runtime, so native modules may need a | Scenario | Command | |---|---| -| VS Code Extension Development Host | `npm run rebuild:native` | -| Cursor Extension Development Host | `THUNDER_EDITOR=cursor npm run rebuild:native` | -| Local Vitest runs | `npm run rebuild:node` | -| Everything | `npm run rebuild:all` | +| VS Code Extension Development Host | `pnpm run rebuild:native` | +| Cursor Extension Development Host | `THUNDER_EDITOR=cursor pnpm run rebuild:native` | +| Local Vitest runs | `pnpm run rebuild:node` | +| Everything | `pnpm run rebuild:all` | + +On Linux and Windows, Electron version auto-detection is not available. Set the version explicitly: + +```bash +THUNDER_ELECTRON_VERSION= pnpm run rebuild:native +``` + +For example, use the Electron version shipped by your VS Code or Cursor build. ### Useful Audit Scripts ```bash -npm run audit:dependencies -npm run audit:dead-code -npm run check:circular-deps -npm run audit:engines -npm run find:console -npm run find:inline-styles +pnpm run audit:dependencies +pnpm run audit:dead-code +pnpm run check:circular-deps +pnpm run audit:engines +pnpm run find:console +pnpm run find:inline-styles +pnpm run check:missing-types +pnpm run env:sync ``` +Bundled skills orchestrate these scripts instead of replacing them. `audit-cleanup` runs dependency/dead-code/cycle/engine audits, `code-smells-and-tech-debt` covers console logs, inline styles, missing types, and targeted lint checks, and `environment-and-secrets` compares env templates without exposing secret values. + --- ## Troubleshooting | Problem | Fix | |---|---| -| `better-sqlite3` fails to load | Run `npm run rebuild:native` for VS Code or `THUNDER_EDITOR=cursor npm run rebuild:native` for Cursor | +| `better-sqlite3` fails to load | Run `pnpm run rebuild:native` for VS Code or `THUNDER_EDITOR=cursor pnpm run rebuild:native` for Cursor | | Provider errors | Check base URL, model name, and API key. Try Echo provider to isolate UI issues | | Indexing feels empty | Check `.gitignore`, `.mitiiignore`, workspace write access, then run `Mitii: Index Workspace` | | Context feels thin | Wait for indexing, enable vectors, check context warnings, and mention important files directly | @@ -612,8 +700,8 @@ Contributions are welcome. Good first areas include docs, tests, provider polish Before a pull request: ```bash -npm run lint -npm test +pnpm run lint +pnpm test ``` For bigger agent or UI changes, also smoke-test in the Extension Development Host with **F5**. diff --git a/bin/mitii.js b/bin/mitii.js new file mode 100755 index 00000000..dd612181 --- /dev/null +++ b/bin/mitii.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node +require('../dist/cli.js'); + diff --git a/docs/enterprise/COMPLIANCE.md b/docs/enterprise/COMPLIANCE.md new file mode 100644 index 00000000..e39c6a72 --- /dev/null +++ b/docs/enterprise/COMPLIANCE.md @@ -0,0 +1,19 @@ +# Compliance Mapping + +## SOC 2 Readiness + +| Area | Current Capability | Roadmap | +|---|---|---| +| Access control | VS Code workspace trust, approval gates, local SecretStorage | Central policy distribution | +| Change audit | JSONL session logs, tool audit log, audit pack export | Signed audit archives | +| Data minimization | Micro-task routing for commit/changelog/release prompts | Per-team prompt retention policy | +| Incident review | Session summaries, timing events, errors, tool calls | SIEM forwarding | + +## GDPR Considerations + +Mitii does not require a Mitii-hosted cloud service. Personal data exposure depends on the selected LLM provider and the code or prompts a user chooses to send. + +## Audit Trail + +Audit packs are designed for compliance review. They include event timelines, model metadata, tool calls, approval state, and redaction counts without requiring reviewers to inspect source code. + diff --git a/docs/enterprise/MITII_ENTERPRISE_OVERVIEW.md b/docs/enterprise/MITII_ENTERPRISE_OVERVIEW.md new file mode 100644 index 00000000..21fcec4d --- /dev/null +++ b/docs/enterprise/MITII_ENTERPRISE_OVERVIEW.md @@ -0,0 +1,16 @@ +# Mitii Enterprise Overview + +Mitii is a local-first AI coding agent for VS Code. It indexes the workspace locally, retrieves focused context, plans higher-risk work, and gates writes or shell commands through approval policy. + +## Why Enterprises Evaluate Mitii + +- Local workspace index, memory, logs, plans, and checkpoints. +- Provider freedom across local and cloud models. +- Enterprise toggles for local-only providers and audit pack redaction. +- One-click audit pack export for compliance review. +- Windows, macOS, and Linux test matrix. + +## Buyer Summary + +Mitii is suitable for teams that want AI coding assistance without moving the agent runtime into a vendor-hosted workspace. Security posture depends on the selected model provider, approval policy, and logging settings, all of which can be reviewed and configured through VS Code settings. + diff --git a/docs/enterprise/PROCUREMENT_FAQ.md b/docs/enterprise/PROCUREMENT_FAQ.md new file mode 100644 index 00000000..1822b3aa --- /dev/null +++ b/docs/enterprise/PROCUREMENT_FAQ.md @@ -0,0 +1,30 @@ +# Procurement FAQ + +## Deployment Model + +Mitii is a VS Code extension with local workspace storage. There is no required Mitii server. + +## Supported Platforms + +Mitii targets macOS, Linux, and Windows. CI runs `npm test` on `ubuntu-latest`, `macos-latest`, and `windows-latest`. + +## Offline And Local Models + +Mitii supports OpenAI-compatible localhost providers such as Ollama and LM Studio. Set `thunder.enterprise.localProvidersOnly` to enforce local-only usage. + +## Controls Procurement Teams Ask For + +| Control | Setting or command | +|---|---| +| Disable session logging | `thunder.telemetry.sessionLogging` | +| Disable verbose diagnostics | `thunder.telemetry.debugMetrics` | +| Require approval for writes | `thunder.safety.requireApprovalForWrites` | +| Require approval for shell | `thunder.safety.requireApprovalForShell` | +| Local providers only | `thunder.enterprise.localProvidersOnly` | +| Strip file contents from audit packs | `thunder.enterprise.stripFileContentsFromAuditPacks` | +| Export review evidence | `Mitii: Export Audit Pack` | + +## License + +Mitii is licensed under AGPL-3.0-or-later. Commercial licensing questions should use the project contact in the README. + diff --git a/docs/enterprise/README.md b/docs/enterprise/README.md new file mode 100644 index 00000000..d45ea43f --- /dev/null +++ b/docs/enterprise/README.md @@ -0,0 +1,11 @@ +# Mitii Enterprise Pack + +This folder is the reviewer-facing security, compliance, and procurement packet for Mitii. + +- [Security and data flow](SECURITY.md) +- [Compliance mapping](COMPLIANCE.md) +- [Procurement FAQ](PROCUREMENT_FAQ.md) +- [Enterprise overview](MITII_ENTERPRISE_OVERVIEW.md) + +Key controls are implemented as VS Code settings under `thunder.telemetry.*`, `thunder.safety.*`, `thunder.enterprise.*`, and the `Mitii: Export Audit Pack` command. + diff --git a/docs/enterprise/SECURITY.md b/docs/enterprise/SECURITY.md new file mode 100644 index 00000000..810fe3f5 --- /dev/null +++ b/docs/enterprise/SECURITY.md @@ -0,0 +1,20 @@ +# Security And Data Flow + +Mitii is local-first. Workspace indexes, memory, plans, checkpoints, and JSONL session logs are stored under the workspace `.mitii/` directory. + +## What Leaves The Machine + +Only prompt data sent to the configured LLM provider leaves the machine. The provider boundary is controlled by `thunder.provider.*`. Enterprises can enable `thunder.enterprise.localProvidersOnly` to require Echo or a localhost OpenAI-compatible endpoint. + +## Secrets + +API keys are stored in VS Code SecretStorage. Logs and audit packs redact keys named like API keys, tokens, passwords, and secrets. Audit packs can additionally strip tool output and file content with `thunder.enterprise.stripFileContentsFromAuditPacks`. + +## MCP Risk Model + +MCP tools are routed through Mitii tool policy. File writes and mutating shell commands require approval according to `thunder.safety.approvalMode` and `thunder.safety.requireApprovalForWrites`. + +## Auditability + +Use `Mitii: Export Audit Pack` to produce a zip containing `session.jsonl`, `summary.md`, `manifest.json`, `tool-audit.json`, `approvals.json`, and `redaction-report.json`. + diff --git a/docs/qa/WINDOWS_SMOKE.md b/docs/qa/WINDOWS_SMOKE.md new file mode 100644 index 00000000..3a4830e5 --- /dev/null +++ b/docs/qa/WINDOWS_SMOKE.md @@ -0,0 +1,12 @@ +# Windows Smoke Checklist + +Run on Windows with a normal user account. + +1. Open `C:\dev\project` in VS Code. +2. Confirm Mitii indexes the workspace without path errors. +3. Ask Mitii to read a file using both `src\foo.ts` and `src/foo.ts`. +4. Stage a change and run `Mitii: Generate Commit Message`. +5. Run `Mitii: Export Audit Pack` and confirm the zip uses forward-slash entries. +6. Add a built-in MCP server and confirm the `cmd /c npx` wrapper starts. +7. Run `npm test` from PowerShell. + diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index faff148e..00000000 --- a/package-lock.json +++ /dev/null @@ -1,12046 +0,0 @@ -{ - "name": "mitii-ai-agent", - "version": "2.7.15", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "mitii-ai-agent", - "version": "2.7.15", - "hasInstallScript": true, - "license": "AGPL-3.0-or-later", - "dependencies": { - "@lancedb/lancedb": "^0.30.0", - "@modelcontextprotocol/sdk": "^1.29.0", - "@vscode/ripgrep": "^1.15.9", - "@xenova/transformers": "^2.17.2", - "@xstate/react": "^6.1.0", - "better-sqlite3": "^12.11.1", - "diff": "^5.2.0", - "framer-motion": "^12.42.0", - "ignore": "^5.3.1", - "nanoid": "^5.0.7", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "shiki": "^4.3.0", - "simple-git": "^3.25.0", - "tiktoken": "^1.0.22", - "ts-morph": "^28.0.0", - "xstate": "^5.32.2", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.25.2" - }, - "devDependencies": { - "@electron/rebuild": "^3.7.2", - "@types/better-sqlite3": "^7.6.12", - "@types/diff": "^7.0.2", - "@types/node": "^20.14.0", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@types/vscode": "^1.85.0", - "@vitejs/plugin-react": "^4.3.1", - "@vscode/vsce": "^2.32.0", - "concurrently": "^8.2.2", - "esbuild": "^0.21.5", - "knip": "^6.21.0", - "madge": "^8.0.0", - "typescript": "^5.5.2", - "vite": "^5.3.1", - "vitest": "^1.6.0" - }, - "engines": { - "vscode": "^1.85.0" - }, - "optionalDependencies": { - "tree-sitter-wasms": "^0.1.13", - "web-tree-sitter": "^0.24.7" - } - }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-util": "^1.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-client": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.2.tgz", - "integrity": "sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.24.0.tgz", - "integrity": "sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/identity": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", - "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^5.5.0", - "@azure/msal-node": "^5.1.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/msal-browser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.15.0.tgz", - "integrity": "sha512-2NYT6v+eeQn8kmNddr9LnbXSvXbVELpmFMmfFvtRxD7I/5+5GlkMlncApeuRFj+mY6C9syOwQip1a0Y+TIbyiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "16.10.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "16.10.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.10.0.tgz", - "integrity": "sha512-iYtjpanlv6963Jprs0MvzIap07V+QhultjQctfbEDQCflsDAEeO3R7XnVA5gk30fhoBFLdgJT7VqO0TGsEsN9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.3.0.tgz", - "integrity": "sha512-fXtJX811pX8y8QlrQqBSH6+plvWyKZDI0IxkheAcyAw9OtcpXyFivmTC7eGUqutLWaDlKXuQ3yOESD4zAmkjHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "16.10.0", - "jsonwebtoken": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@dependents/detective-less": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.3.tgz", - "integrity": "sha512-v6oD9Ukp+N7V4n6p5I/+mM5fIohSfkrDSGlFm5w/pYmchvbk+sMIHsLxrFJ5Lnujewj1BzWL0K84d88lwZAMQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.1.0.tgz", - "integrity": "sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.17.0" - } - }, - "node_modules/@electron/node-gyp": { - "version": "10.2.0-electron.1", - "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", - "integrity": "sha512-CrYo6TntjpoMO1SHjl5Pa/JoUsECNqNdB7Kx49WLQpWzPw53eEITJ2Hs9fh/ryUYDn4pxZz11StaBYBrLFJdqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^8.1.0", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.2.1", - "nopt": "^6.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/node-gyp/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/node-gyp/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "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", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/node-gyp/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/node-gyp/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/rebuild": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.2.tgz", - "integrity": "sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.2.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@electron/rebuild/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "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/@electron/rebuild/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@electron/rebuild/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@electron/rebuild/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/rebuild/node_modules/supports-color": { - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@emnapi/core": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", - "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", - "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "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, - "license": "MIT", - "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, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@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, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "license": "MIT" - }, - "node_modules/@lancedb/lancedb": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb/-/lancedb-0.30.0.tgz", - "integrity": "sha512-d0FoEL6cthqgsulqAc7fck6kRXrSRGMTqlKYbhSGSazHU6vB2GEpD737Mu0HZd7fMyBUdhR9sD1W2C9uQZ5p0Q==", - "cpu": [ - "x64", - "arm64" - ], - "license": "Apache-2.0", - "os": [ - "darwin", - "linux", - "win32" - ], - "dependencies": { - "reflect-metadata": "^0.2.2" - }, - "engines": { - "node": ">= 18" - }, - "optionalDependencies": { - "@lancedb/lancedb-darwin-arm64": "0.30.0", - "@lancedb/lancedb-linux-arm64-gnu": "0.30.0", - "@lancedb/lancedb-linux-arm64-musl": "0.30.0", - "@lancedb/lancedb-linux-x64-gnu": "0.30.0", - "@lancedb/lancedb-linux-x64-musl": "0.30.0", - "@lancedb/lancedb-win32-arm64-msvc": "0.30.0", - "@lancedb/lancedb-win32-x64-msvc": "0.30.0" - }, - "peerDependencies": { - "apache-arrow": ">=15.0.0 <=18.1.0" - } - }, - "node_modules/@lancedb/lancedb-darwin-arm64": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb-darwin-arm64/-/lancedb-darwin-arm64-0.30.0.tgz", - "integrity": "sha512-x6dmsjRIv0xumELYnFAEfyFDxqcO/n4rHYCJvC27RbRez0UmbByi6OMTgbSoSTatrQSPRCL7JJSa5pwNeawnIg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@lancedb/lancedb-linux-arm64-gnu": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-arm64-gnu/-/lancedb-linux-arm64-gnu-0.30.0.tgz", - "integrity": "sha512-CWUex7hRNiLkXFeTQlUGPyy5VktbXoUmQdZuiVCETZ6ggljEC7c7Qvzu2ge+jEZML+UE7tXL2lVC3klRFGczng==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@lancedb/lancedb-linux-arm64-musl": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-arm64-musl/-/lancedb-linux-arm64-musl-0.30.0.tgz", - "integrity": "sha512-2MHmAS4tKePNVbwfgDrjCFj6BVuAgXlL2c9iWk7TfcwL+jcSxo52LFx03O0+ArpVCF2sI6aoDqZaQNre5zMniQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@lancedb/lancedb-linux-x64-gnu": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-x64-gnu/-/lancedb-linux-x64-gnu-0.30.0.tgz", - "integrity": "sha512-0OpDNxsDE4OXD+PIFd7KdE42xhYIE+fZL+jCm1v3dTug4UEhumWBuSgbUIBP7t0yJZHwh62/QivVh/V1cPB2Bg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@lancedb/lancedb-linux-x64-musl": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-x64-musl/-/lancedb-linux-x64-musl-0.30.0.tgz", - "integrity": "sha512-4Bq7VngQt+lyxIcu79EN8nYJs8gvUnrIT6I/t2MSlpG/BXWHZG2A+PRii1Zq4GCUlRTTG+RlieCv8CBGSPm8bw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@lancedb/lancedb-win32-arm64-msvc": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb-win32-arm64-msvc/-/lancedb-win32-arm64-msvc-0.30.0.tgz", - "integrity": "sha512-N2DQg2XBWZirn5jS6kRJUxF679t3sKcIxBwP9zY4Idq5OVLAj0yfLueWIKhYxv8en7pBFYWdgw5j9dTS7XajyQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@lancedb/lancedb-win32-x64-msvc": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@lancedb/lancedb-win32-x64-msvc/-/lancedb-win32-x64-msvc-0.30.0.tgz", - "integrity": "sha512-CDgN/ZmYqSlVX2nBJAF2PYEwqBBxotCVORjagmvrd0k5D7RBLlAQUEAR4gDMum2BpYsUkzdTYQpquLjRCVbwbQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", - "license": "MIT", - "dependencies": { - "@hono/node-server": "^1.19.9", - "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.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", - "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, - "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@oxc-parser/binding-android-arm-eabi": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.137.0.tgz", - "integrity": "sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.137.0.tgz", - "integrity": "sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.137.0.tgz", - "integrity": "sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.137.0.tgz", - "integrity": "sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.137.0.tgz", - "integrity": "sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.137.0.tgz", - "integrity": "sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.137.0.tgz", - "integrity": "sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.137.0.tgz", - "integrity": "sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.137.0.tgz", - "integrity": "sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.137.0.tgz", - "integrity": "sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.137.0.tgz", - "integrity": "sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-riscv64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.137.0.tgz", - "integrity": "sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.137.0.tgz", - "integrity": "sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.137.0.tgz", - "integrity": "sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.137.0.tgz", - "integrity": "sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-openharmony-arm64": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.137.0.tgz", - "integrity": "sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.137.0.tgz", - "integrity": "sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.1", - "@emnapi/runtime": "1.11.1", - "@napi-rs/wasm-runtime": "^1.1.5" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.137.0.tgz", - "integrity": "sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-win32-ia32-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.137.0.tgz", - "integrity": "sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.137.0.tgz", - "integrity": "sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", - "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxc-resolver/binding-android-arm-eabi": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.21.3.tgz", - "integrity": "sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@oxc-resolver/binding-android-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.21.3.tgz", - "integrity": "sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@oxc-resolver/binding-darwin-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.21.3.tgz", - "integrity": "sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@oxc-resolver/binding-darwin-x64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.21.3.tgz", - "integrity": "sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@oxc-resolver/binding-freebsd-x64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.21.3.tgz", - "integrity": "sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.21.3.tgz", - "integrity": "sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.21.3.tgz", - "integrity": "sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.21.3.tgz", - "integrity": "sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-arm64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.21.3.tgz", - "integrity": "sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.21.3.tgz", - "integrity": "sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.21.3.tgz", - "integrity": "sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.21.3.tgz", - "integrity": "sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.21.3.tgz", - "integrity": "sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-x64-gnu": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.21.3.tgz", - "integrity": "sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-linux-x64-musl": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.21.3.tgz", - "integrity": "sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@oxc-resolver/binding-openharmony-arm64": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.21.3.tgz", - "integrity": "sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.21.3.tgz", - "integrity": "sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.11.0", - "@emnapi/runtime": "1.11.0", - "@napi-rs/wasm-runtime": "^1.1.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", - "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.2", - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-resolver/binding-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", - "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.21.3.tgz", - "integrity": "sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@oxc-resolver/binding-win32-x64-msvc": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.21.3.tgz", - "integrity": "sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", - "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause" - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.0.tgz", - "integrity": "sha512-EooU3i9F6IAE8kEu+AnGf9DFZWkQBZ+hJn3tLVbsH+61mtQiva5biai66fAA6nvFPXkLgvrh7BrR7YcJU83xQQ==", - "license": "MIT", - "dependencies": { - "@shikijs/primitive": "4.3.0", - "@shikijs/types": "4.3.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.0.tgz", - "integrity": "sha512-hTv/KiFf2tpiqlACPiztGGurEARWIutB8YUhcrA1pUC7VzzwKO+g5crUocrLztrZ5ro5Z4hbXg7bYclETn3gSQ==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.3.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.6" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.0.tgz", - "integrity": "sha512-1vMdN3gHfnKfLYwecUI2ITJI4RhHt96xEaJumVn7Heb0IlJ8WQMIH0Voak+2j22BpSNKdnOfB/pCTPnPm2gq7A==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.3.0", - "@shikijs/vscode-textmate": "^10.0.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/langs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.0.tgz", - "integrity": "sha512-rnlqFbBRSys9bT4gl/5rw9RnS0W/I84ZldXPkO7cvlEMoV85TyF/aU01N7/NbSR776RNLjrJKjfFUXJR6wN1Cg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.3.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/primitive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.0.tgz", - "integrity": "sha512-CPkz64PTa5diRW1ggzMZH9VM/du4RNChYgVtgqrFcgruvIybmCvySv8GkiHSczUHXYuuR8TdKEwFx+UnZMpgdg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.3.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/themes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.0.tgz", - "integrity": "sha512-Avgt05YiT+Y3prjIc9lmQxhJzHBcCfR6cjiFW4OyaMBbt2A6trX5rfjUzx+Vj/mE9qpArYjatnqo9XPjQNW/AQ==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.3.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/types": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.0.tgz", - "integrity": "sha512-oc8b9U2SYvofKZk8e/737nIX0qwf6eV2vHFATeObAu7r+mUVpLs8Re0BmVkIjAWAYgkmG/CzLNo7rzuBzRu/wQ==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, - "node_modules/@simple-git/args-pathspec": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz", - "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==", - "license": "MIT" - }, - "node_modules/@simple-git/argv-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz", - "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==", - "license": "MIT", - "dependencies": { - "@simple-git/args-pathspec": "^1.0.3" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", - "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", - "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ts-graphviz/adapter": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.6.tgz", - "integrity": "sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } - ], - "license": "MIT", - "dependencies": { - "@ts-graphviz/common": "^2.1.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ts-graphviz/ast": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@ts-graphviz/ast/-/ast-2.0.7.tgz", - "integrity": "sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } - ], - "license": "MIT", - "dependencies": { - "@ts-graphviz/common": "^2.1.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ts-graphviz/common": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ts-graphviz/common/-/common-2.1.5.tgz", - "integrity": "sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@ts-graphviz/core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@ts-graphviz/core/-/core-2.0.7.tgz", - "integrity": "sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } - ], - "license": "MIT", - "dependencies": { - "@ts-graphviz/ast": "^2.0.7", - "@ts-graphviz/common": "^2.1.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ts-morph/common": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.29.0.tgz", - "integrity": "sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==", - "license": "MIT", - "dependencies": { - "minimatch": "^10.0.1", - "path-browserify": "^1.0.1", - "tinyglobby": "^0.2.14" - } - }, - "node_modules/@ts-morph/common/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/command-line-args": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/command-line-usage": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", - "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/diff": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-7.0.2.tgz", - "integrity": "sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/node": { - "version": "20.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", - "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/vscode": { - "version": "1.125.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.125.0.tgz", - "integrity": "sha512-0icm/ZQAaism87P0ekHqi4/Ju9du+Tm0RUW+y7vqRsxY2cY0FNRX1nAnaW7nT6npPt2tfHiheZ55Zm9UhqonFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", - "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.62.0", - "@typescript-eslint/types": "^8.62.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz", - "integrity": "sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz", - "integrity": "sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.0.tgz", - "integrity": "sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.62.0", - "@typescript-eslint/tsconfig-utils": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.0.tgz", - "integrity": "sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.62.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz", - "integrity": "sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", - "license": "ISC" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", - "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", - "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "1.6.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", - "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", - "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", - "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vscode/ripgrep": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep/-/ripgrep-1.18.0.tgz", - "integrity": "sha512-ns5lWe44tSfbTMbVUsyB+I1819PVSw4AdpgK0RNkzfWfwy6+3IUNSxwSrfTno1/oWaS/hERNz+XLWVyga2aJBQ==", - "license": "MIT", - "optionalDependencies": { - "@vscode/ripgrep-darwin-arm64": "1.18.0", - "@vscode/ripgrep-darwin-x64": "1.18.0", - "@vscode/ripgrep-linux-arm": "1.18.0", - "@vscode/ripgrep-linux-arm64": "1.18.0", - "@vscode/ripgrep-linux-ia32": "1.18.0", - "@vscode/ripgrep-linux-ppc64": "1.18.0", - "@vscode/ripgrep-linux-riscv64": "1.18.0", - "@vscode/ripgrep-linux-s390x": "1.18.0", - "@vscode/ripgrep-linux-x64": "1.18.0", - "@vscode/ripgrep-win32-arm64": "1.18.0", - "@vscode/ripgrep-win32-ia32": "1.18.0", - "@vscode/ripgrep-win32-x64": "1.18.0" - } - }, - "node_modules/@vscode/ripgrep-darwin-arm64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-darwin-arm64/-/ripgrep-darwin-arm64-1.18.0.tgz", - "integrity": "sha512-r3ktHSvbFycQNF6sl7sNDPocpsI7J+mEzh1IaZFkY0spm3k2Z9t8hPAeOK7+p0l6p6/swkQC14XWX01low+94Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/ripgrep-darwin-x64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-darwin-x64/-/ripgrep-darwin-x64-1.18.0.tgz", - "integrity": "sha512-25b4gWbL138dGuQU244ebCKKc0q05ULBMoFSz9oAEUHNeqK/lOJViDS7DRvbDazzAzSEdan391Znks/R5mkaTQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/ripgrep-linux-arm": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-linux-arm/-/ripgrep-linux-arm-1.18.0.tgz", - "integrity": "sha512-GDAvufNDHu8zqLEmXstalQF0Wh6wQvdsBi/Vg3Yi3CK4a8XoFXqqXVEHEZ9xQz3t0NfoSEc9JbvK9DDS6FxyxQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/ripgrep-linux-arm64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-linux-arm64/-/ripgrep-linux-arm64-1.18.0.tgz", - "integrity": "sha512-lQ/5zTG++U0E3IhVgS4EPTTn/U4okncaRMM5GOFfOYZywS4nuD31GhkHbNYlDk5CuDC68+hYJ0/eQeyCKJDA+g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/ripgrep-linux-ia32": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-linux-ia32/-/ripgrep-linux-ia32-1.18.0.tgz", - "integrity": "sha512-YWLkSUtFd4Jh5EepIhA9RJSfv3uMAVMo+2rBIGHPBnvgLrZciIs2cDKei1/p6Wc/aCzUoHyMAg2R6tw4ZCBKGg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/ripgrep-linux-ppc64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-linux-ppc64/-/ripgrep-linux-ppc64-1.18.0.tgz", - "integrity": "sha512-quXVY8fwQ8O/lvU1yrSqSl3jlUzysRSb+AfUfCL/tRtphxsKlFvPAejryZ6vg4Bgvn8XL74xb4qMCDmWgYrT5w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/ripgrep-linux-riscv64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-linux-riscv64/-/ripgrep-linux-riscv64-1.18.0.tgz", - "integrity": "sha512-f5kBQBrWfQt8Q7OhSORuNDei5dkYagBj3y4jImSUXGMy8B/Ke7SltSRcUtjPv166FAFfHCAmWuZp3+cWnX2/Vw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/ripgrep-linux-s390x": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-linux-s390x/-/ripgrep-linux-s390x-1.18.0.tgz", - "integrity": "sha512-rTOcJFGGcl2c07RUOWUo4U1ndnemKhY6A9hnMB18uk7jSgJc0d/QLBGWMWpumdtoJtpizn/wIv5mXIisJukusQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/ripgrep-linux-x64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-linux-x64/-/ripgrep-linux-x64-1.18.0.tgz", - "integrity": "sha512-mQ3bVrUpnD2vs7QT0vX90Lt0cnUq467uFtEktIdsJJmW296RoSULRGqWgzG1AKxyBpNDD6l4ZO4qKf6SgyC23Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/ripgrep-win32-arm64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-win32-arm64/-/ripgrep-win32-arm64-1.18.0.tgz", - "integrity": "sha512-vfTIjq1OHnzUjxZcHVQAMbnggp8dpGf+0QKFOZHwWPqFwXxQC8eCWM+5NUdoJ6yrElCeMzoUTXoK/LdZaniB+Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/ripgrep-win32-ia32": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-win32-ia32/-/ripgrep-win32-ia32-1.18.0.tgz", - "integrity": "sha512-//rfAE+BOw5AC2EMmepmiE36jUuevtQYNQqqlw1s3m9FlRxjxEut97RkRPHAu9BG4mSojatZx+kXZXNdyI9caQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/ripgrep-win32-x64": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep-win32-x64/-/ripgrep-win32-x64-1.18.0.tgz", - "integrity": "sha512-KNPvtElldqILHdnAetujPaowkNbpqJy3ssIGGN6F6Kve9Qi+nNLI2DN01O83JjCEVQbCzl8Ov3QZ9Eov3BR8Dg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.32.0.tgz", - "integrity": "sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/identity": "^4.1.0", - "@vscode/vsce-sign": "^2.0.0", - "azure-devops-node-api": "^12.5.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "cockatiel": "^3.1.2", - "commander": "^6.2.1", - "form-data": "^4.0.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "jsonc-parser": "^3.2.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^7.5.2", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.5.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 16" - }, - "optionalDependencies": { - "keytar": "^7.7.0" - } - }, - "node_modules/@vscode/vsce-sign": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", - "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", - "dev": true, - "hasInstallScript": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.6", - "@vscode/vsce-sign-alpine-x64": "2.0.6", - "@vscode/vsce-sign-darwin-arm64": "2.0.6", - "@vscode/vsce-sign-darwin-x64": "2.0.6", - "@vscode/vsce-sign-linux-arm": "2.0.6", - "@vscode/vsce-sign-linux-arm64": "2.0.6", - "@vscode/vsce-sign-linux-x64": "2.0.6", - "@vscode/vsce-sign-win32-arm64": "2.0.6", - "@vscode/vsce-sign-win32-x64": "2.0.6" - } - }, - "node_modules/@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", - "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-alpine-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", - "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", - "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", - "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", - "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", - "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", - "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-win32-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", - "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce-sign-win32-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", - "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz", - "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@vue/shared": "3.5.39", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", - "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.39", - "@vue/shared": "3.5.39" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", - "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.7", - "@vue/compiler-core": "3.5.39", - "@vue/compiler-dom": "3.5.39", - "@vue/compiler-ssr": "3.5.39", - "@vue/shared": "3.5.39", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.15", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz", - "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.39", - "@vue/shared": "3.5.39" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.39", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz", - "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@xenova/transformers": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.2.tgz", - "integrity": "sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==", - "license": "Apache-2.0", - "dependencies": { - "@huggingface/jinja": "^0.2.2", - "onnxruntime-web": "1.14.0", - "sharp": "^0.32.0" - }, - "optionalDependencies": { - "onnxruntime-node": "1.14.0" - } - }, - "node_modules/@xstate/react": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@xstate/react/-/react-6.1.0.tgz", - "integrity": "sha512-ep9F0jGTI63B/jE8GHdMpUqtuz7yRebNaKv8EMUaiSi29NOglywc2X2YSOV/ygbIK+LtmgZ0q9anoEA2iBSEOw==", - "license": "MIT", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.2", - "use-sync-external-store": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "xstate": "^5.28.0" - }, - "peerDependenciesMeta": { - "xstate": { - "optional": true - } - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" - }, - "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/accepts/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/accepts/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/accepts/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/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", - "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", - "dev": true, - "license": "MIT", - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "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", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/apache-arrow": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-18.1.0.tgz", - "integrity": "sha512-v/ShMp57iBnBp4lDgV8Jx3d3Q5/Hac25FWmQ98eMahUiHPXcvwIMKJD0hBIgclm/FCG+LwPkAKtkRO1O/W0YGg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@swc/helpers": "^0.5.11", - "@types/command-line-args": "^5.2.3", - "@types/command-line-usage": "^5.0.4", - "@types/node": "^20.13.0", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.1", - "flatbuffers": "^24.3.25", - "json-bignum": "^0.0.3", - "tslib": "^2.6.2" - }, - "bin": { - "arrow2csv": "bin/arrow2csv.js" - } - }, - "node_modules/app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/ast-module-types": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.2.tgz", - "integrity": "sha512-6KuK/7nZ/2Qh7sGuVEiwxjCxzTY2Pdb5mTo5z1e6/J8BA0tvjR7G8vQJKrQMTqwmnA3UPEyKIFX4YUS1DO1Hvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/azure-devops-node-api": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", - "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", - "dev": true, - "license": "MIT", - "dependencies": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", - "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz", - "integrity": "sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==", - "license": "Apache-2.0", - "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.9.3", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.3.tgz", - "integrity": "sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ==", - "license": "Apache-2.0", - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz", - "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==", - "license": "Apache-2.0", - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", - "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.8.1", - "streamx": "^2.25.0", - "teex": "^1.0.1" - }, - "peerDependencies": { - "bare-abort-controller": "*", - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - }, - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-stream/node_modules/b4a": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", - "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==", - "license": "Apache-2.0", - "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" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.40", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", - "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/better-sqlite3": { - "version": "12.11.1", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.11.1.tgz", - "integrity": "sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": "20.x || 22.x || 23.x || 24.x || 25.x || 26.x" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^2.0.0", - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", - "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/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/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "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==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "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", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chalk-template/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk-template/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "peer": true, - "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/chalk-template/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk-template/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true - }, - "node_modules/chalk-template/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk-template/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cheerio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.1.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.19.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/cockatiel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", - "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "license": "MIT" - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "license": "MIT", - "peer": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.4.tgz", - "integrity": "sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==", - "license": "MIT", - "peer": true, - "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^4.1.1", - "typical": "^7.3.0" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.3.tgz", - "integrity": "sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", - "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "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/concurrently/node_modules/chalk/node_modules/supports-color": { - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/concurrently/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concurrently/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/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==", - "license": "MIT", - "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", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "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==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-tree": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.5.0.tgz", - "integrity": "sha512-K9zBwKDZrot3RkxizugpVSdImxULAg4Ycp3+ydy2r561k96oiiw6nfsOR15fwNDQ5BF2UXe+2JFM/H5Xz4MGQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^1.1.0", - "commander": "^12.1.0", - "filing-cabinet": "^5.5.1", - "precinct": "^12.3.2", - "typescript": "^5.9.3" - }, - "bin": { - "dependency-tree": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/dependency-tree/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detective-amd": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.1.0.tgz", - "integrity": "sha512-fmI6LGMvotqd49QaA3ZYw+q0aGp2yXmMjzIuY6fH9j9YFIXY/73yDhMwhX9cPbhWd+AH06NH1Di/LKOuCH0Ubg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-module-types": "^6.0.1", - "escodegen": "^2.1.0", - "get-amd-module-type": "^6.0.2", - "node-source-walk": "^7.0.1" - }, - "bin": { - "detective-amd": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/detective-cjs": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.1.1.tgz", - "integrity": "sha512-pSh7mkCKEtLlmANqLu3KDFS3NV8Hx41jy/JF1/gAWOgU+Uo5QTkeI1tWNP4dWGo4L0E9j18Ez9EPsTleautKqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-module-types": "^6.0.1", - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/detective-es6": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.2.tgz", - "integrity": "sha512-+qHHGYhjupiVs4rnIpI9nZ5B130A4AmE35ZX1w33hb46vcZ7T3jfDbvmPw0FhWtMHn5BS5HHu7ZtnZ53bMcXZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/detective-postcss": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-8.0.4.tgz", - "integrity": "sha512-DZ7M/hWPZyr17ZUdoQ+TVXaPj70mYr4XXrAE+GeJbca44haCvZgb191L/jLJmFYewhxRJuBd4lUtNSu986TXag==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-url-superb": "^4.0.0", - "postcss-values-parser": "^6.0.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4.47" - } - }, - "node_modules/detective-sass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.2.tgz", - "integrity": "sha512-i3xpXHDKS0qI2aFW4asQ7fqlPK00ndOVZELvQapFJCaF0VxYmsNWtd0AmvXbTLMk7bfO5VdIeorhY9KfmHVoVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/detective-scss": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.2.tgz", - "integrity": "sha512-9JOEMZ8pDh3ShXmftq7hoQqqJsClaGgxo1hghfCeFlmKf5TC/Twtwb0PAaK8dXwpg9Z0uCmEYSrCxO+kel2eEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/detective-stylus": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.1.tgz", - "integrity": "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/detective-typescript": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.1.2.tgz", - "integrity": "sha512-bIeEn0eVi/JRsE1YizBR2ilnMlWRAIBJJ6kXCKNFxEEWhUcEY3R6I3KYIAy48ieURbD1hcb3Ebvl8AqeoPMSzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "^8.58.2", - "ast-module-types": "^6.0.1", - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "typescript": "^5.4.4 || ^6.0.2" - } - }, - "node_modules/detective-vue2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.3.0.tgz", - "integrity": "sha512-3gwbZPqVTm9sL9XdZsgEJ7x4x99O853VVZHapQAiEkGuMJMpFPjHDrecSgfqnS5JW3FJfYXesLZGvUOibjn49g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@dependents/detective-less": "^5.0.1", - "@vue/compiler-sfc": "^3.5.32", - "detective-es6": "^5.0.1", - "detective-sass": "^6.0.1", - "detective-scss": "^5.0.1", - "detective-stylus": "^5.0.1", - "detective-typescript": "^14.1.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "typescript": "^5.4.4 || ^6.0.2" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/diff": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", - "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "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", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.378", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz", - "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.24.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.1.tgz", - "integrity": "sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "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==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", - "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "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==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0" - }, - "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/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", - "license": "MIT", - "dependencies": { - "ip-address": "^10.2.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/express/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/express/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/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==", - "license": "MIT" - }, - "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==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fd-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", - "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "walk-up-path": "^4.0.0" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "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==", - "license": "MIT" - }, - "node_modules/filing-cabinet": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.5.1.tgz", - "integrity": "sha512-PzLBTChlVPn6LnNxF0KWs+XqPziVh3Sfmz/3TXOymHxu6a9yhrDcQn7YwgpcRM6mqhR2WHVGPR8RU4fmcF1IVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-module-path": "^2.2.0", - "commander": "^12.1.0", - "enhanced-resolve": "^5.21.0", - "module-definition": "^6.0.2", - "module-lookup-amd": "^9.1.3", - "resolve": "^1.22.12", - "resolve-dependency-path": "^4.0.1", - "sass-lookup": "^6.1.2", - "stylus-lookup": "^6.1.2", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.9.3" - }, - "bin": { - "filing-cabinet": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/filing-cabinet/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "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/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/flatbuffers": { - "version": "24.12.23", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.12.23.tgz", - "integrity": "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formatly": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.3.0.tgz", - "integrity": "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fd-package-json": "^2.0.0" - }, - "bin": { - "formatly": "bin/index.mjs" - }, - "engines": { - "node": ">=18.3.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/framer-motion": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.42.0.tgz", - "integrity": "sha512-wp7EJnfWaaEScVygKv3e20udoRz+LbtxScsuTkakAxfXmt+ReC6WyPW2nINRAGvd+hG9odwcjBLyOTPjH5pBRA==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.42.0", - "motion-utils": "^12.39.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "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/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==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-amd-module-type": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.2.tgz", - "integrity": "sha512-7zShVYAYtMnj9S65CfN+hvpBCByfuB1OY8xID01nZEzXTZbx4YyysAfi+nMl95JSR6odt4q8TCj2W63KAoyVLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-module-types": "^6.0.1", - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true, - "license": "ISC" - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "gonzales": "bin/gonzales.js" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "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==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "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" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hono": { - "version": "4.12.27", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz", - "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==", - "license": "MIT", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "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/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.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==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "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" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true, - "license": "ISC" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "license": "MIT", - "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-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-url-superb": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", - "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-bignum": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", - "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "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/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "dev": true, - "license": "MIT", - "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.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keytar": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", - "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/knip": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/knip/-/knip-6.21.0.tgz", - "integrity": "sha512-q7K9VGSFfdVaCjhj9u+5aI2t5CZt3edZeLi+1wjnGAvYB2WfW6+T9UWAREsTR88aB8YeDqkKVZiVMV7va3oTmg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/webpro" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/knip" - } - ], - "license": "ISC", - "dependencies": { - "fdir": "^6.5.0", - "formatly": "^0.3.0", - "get-tsconfig": "4.14.0", - "jiti": "^2.7.0", - "oxc-parser": "^0.137.0", - "oxc-resolver": "11.21.3", - "picomatch": "^4.0.4", - "smol-toml": "^1.6.1", - "strip-json-comments": "5.0.3", - "tinyglobby": "^0.2.17", - "unbash": "^4.0.1", - "yaml": "^2.9.0", - "zod": "^4.1.11" - }, - "bin": { - "knip": "bin/knip.js", - "knip-bun": "bin/knip-bun.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/knip/node_modules/strip-json-comments": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", - "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/knip/node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT", - "peer": true - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "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/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/madge": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/madge/-/madge-8.0.0.tgz", - "integrity": "sha512-9sSsi3TBPhmkTCIpVQF0SPiChj1L7Rq9kU2KDG1o6v2XH9cCw086MopjVCD+vuoL5v8S77DTbVopTO8OUiQpIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "commander": "^7.2.0", - "commondir": "^1.0.1", - "debug": "^4.3.4", - "dependency-tree": "^11.0.0", - "ora": "^5.4.1", - "pluralize": "^8.0.0", - "pretty-ms": "^7.0.1", - "rc": "^1.2.8", - "stream-to-array": "^2.3.0", - "ts-graphviz": "^2.1.2", - "walkdir": "^0.4.1" - }, - "bin": { - "madge": "bin/cli.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "individual", - "url": "https://www.paypal.me/pahen" - }, - "peerDependencies": { - "typescript": "^5.4.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/madge/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/madge/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "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/madge/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/madge/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/madge/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/madge/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/madge/node_modules/supports-color": { - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true, - "license": "MIT" - }, - "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/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/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "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==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "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" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", - "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/mlly/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/module-definition": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-6.0.2.tgz", - "integrity": "sha512-SvAU3lB0+Yjbq55yHY3wkRZBOh+fhU1SnIF3IFbTewv6mtAh7yUT8ACHAJ2mGIJ7tCes2QuCL/cl6m0JSZ/ArA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-module-types": "^6.0.1", - "node-source-walk": "^7.0.1" - }, - "bin": { - "module-definition": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/module-lookup-amd": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-9.1.3.tgz", - "integrity": "sha512-Jc3XmOaR9FdfMJSK8+vyLgsCkzm8z2L0NS6vrlRWi12DjS7MY7TMNE7E1yj8yXx837xtMDbKSSgcdXnFlJ2YLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^12.1.0", - "requirejs": "^2.3.8", - "requirejs-config-file": "^4.0.0" - }, - "bin": { - "lookup-amd": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/module-lookup-amd/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/motion-dom": { - "version": "12.42.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.42.0.tgz", - "integrity": "sha512-M63h4n8R+quJdNhBwuLlgxM+OLYa9+I/T2pzDRboB9fLXRdbou+Gw7Zury+SkpaCyACP1JHSjHgZ1EgTkBr30w==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.39.0" - } - }, - "node_modules/motion-utils": { - "version": "12.39.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", - "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/nanoid": { - "version": "5.1.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz", - "integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.92.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", - "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-api-version": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", - "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-api-version/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-source-walk": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.2.tgz", - "integrity": "sha512-71kFFjYaSshDTA8/a2HiTYPLdASWjLJxUyJxGE+ffxU+KhxSBtM9kiLUX+R2yooFdSFKMFpi4n3PFtDy6qXv8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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/onnxruntime-web/node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==", - "license": "SEE LICENSE IN LICENSE.txt" - }, - "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "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/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "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/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "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, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/oxc-parser": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.137.0.tgz", - "integrity": "sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "^0.137.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-parser/binding-android-arm-eabi": "0.137.0", - "@oxc-parser/binding-android-arm64": "0.137.0", - "@oxc-parser/binding-darwin-arm64": "0.137.0", - "@oxc-parser/binding-darwin-x64": "0.137.0", - "@oxc-parser/binding-freebsd-x64": "0.137.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.137.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.137.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.137.0", - "@oxc-parser/binding-linux-arm64-musl": "0.137.0", - "@oxc-parser/binding-linux-ppc64-gnu": "0.137.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.137.0", - "@oxc-parser/binding-linux-riscv64-musl": "0.137.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.137.0", - "@oxc-parser/binding-linux-x64-gnu": "0.137.0", - "@oxc-parser/binding-linux-x64-musl": "0.137.0", - "@oxc-parser/binding-openharmony-arm64": "0.137.0", - "@oxc-parser/binding-wasm32-wasi": "0.137.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.137.0", - "@oxc-parser/binding-win32-ia32-msvc": "0.137.0", - "@oxc-parser/binding-win32-x64-msvc": "0.137.0" - } - }, - "node_modules/oxc-resolver": { - "version": "11.21.3", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.21.3.tgz", - "integrity": "sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-resolver/binding-android-arm-eabi": "11.21.3", - "@oxc-resolver/binding-android-arm64": "11.21.3", - "@oxc-resolver/binding-darwin-arm64": "11.21.3", - "@oxc-resolver/binding-darwin-x64": "11.21.3", - "@oxc-resolver/binding-freebsd-x64": "11.21.3", - "@oxc-resolver/binding-linux-arm-gnueabihf": "11.21.3", - "@oxc-resolver/binding-linux-arm-musleabihf": "11.21.3", - "@oxc-resolver/binding-linux-arm64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-arm64-musl": "11.21.3", - "@oxc-resolver/binding-linux-ppc64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-riscv64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-riscv64-musl": "11.21.3", - "@oxc-resolver/binding-linux-s390x-gnu": "11.21.3", - "@oxc-resolver/binding-linux-x64-gnu": "11.21.3", - "@oxc-resolver/binding-linux-x64-musl": "11.21.3", - "@oxc-resolver/binding-openharmony-arm64": "11.21.3", - "@oxc-resolver/binding-wasm32-wasi": "11.21.3", - "@oxc-resolver/binding-win32-arm64-msvc": "11.21.3", - "@oxc-resolver/binding-win32-x64-msvc": "11.21.3" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.1.0" - } - }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", - "license": "MIT", - "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", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "license": "MIT" - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-values-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", - "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "color-name": "^1.1.4", - "is-url-superb": "^4.0.0", - "quote-unquote": "^1.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.2.9" - } - }, - "node_modules/postcss-values-parser/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "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==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "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/precinct": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/precinct/-/precinct-12.3.2.tgz", - "integrity": "sha512-JbJevI1K80z8e/WIyDt/4vUN/4qcfBSKKqOjJA4mosPPPb7zODKRJQV7YN7apVWN3k58nZYm/vEsLgEGYmnxwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@dependents/detective-less": "^5.0.3", - "commander": "^12.1.0", - "detective-amd": "^6.1.0", - "detective-cjs": "^6.1.1", - "detective-es6": "^5.0.2", - "detective-postcss": "^8.0.3", - "detective-sass": "^6.0.2", - "detective-scss": "^5.0.2", - "detective-stylus": "^5.0.1", - "detective-typescript": "^14.1.2", - "detective-vue2": "^2.3.0", - "module-definition": "^6.0.2", - "node-source-walk": "^7.0.2", - "postcss": "^8.5.14", - "typescript": "^5.9.3" - }, - "bin": { - "precinct": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/precinct/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/protobufjs": { - "version": "6.11.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.6.tgz", - "integrity": "sha512-k8BHqgPBOtrlougZZqF2uUk5Z7bN8f0wj+3e8M3hvtSv0NBAz4VBy5f6R5Nxq/l+i7mRFTgNZb2trxqTpHNY/A==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/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==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/quote-unquote": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", - "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/range-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/raw-body/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/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "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": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requirejs": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.8.tgz", - "integrity": "sha512-7/cTSLOdYkNBNJcDMWf+luFvMriVm7eYxp4BcFCsAX0wF421Vyce5SXP17c+Jd5otXKGNehIonFlyQXSowL6Mw==", - "dev": true, - "license": "MIT", - "bin": { - "r_js": "bin/r.js", - "r.js": "bin/r.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/requirejs-config-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz", - "integrity": "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esprima": "^4.0.0", - "stringify-object": "^3.2.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve-dependency-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-4.0.1.tgz", - "integrity": "sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", - "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/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sass-lookup": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-6.1.2.tgz", - "integrity": "sha512-GjmndmKQBtlPil79RK72L7yc5kDXZPCQeH97bP8R8DcxtXQJO6vECExb3WP/m6+cxaV9h4ZxrSRvCkPG2v/VSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^12.1.0", - "enhanced-resolve": "^5.20.0" - }, - "bin": { - "sass-lookup": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/sass-lookup/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "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/send/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/send/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/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/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "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, - "license": "Apache-2.0", - "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/b4a": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "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==", - "license": "MIT" - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sharp/node_modules/tar-fs": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.3.tgz", - "integrity": "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==", - "license": "MIT", - "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.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", - "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "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", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shiki": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.0.tgz", - "integrity": "sha512-NKKjWzR6LIGL3sXBrWDw9sDS9cxx42/DkysaNqJEeOWE8Kix5gpak0bc00OfDVEO4oyXSyz8+aRaqKoBD1yo7A==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "4.3.0", - "@shikijs/engine-javascript": "4.3.0", - "@shikijs/engine-oniguruma": "4.3.0", - "@shikijs/langs": "4.3.0", - "@shikijs/themes": "4.3.0", - "@shikijs/types": "4.3.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/side-channel": { - "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.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "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.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "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, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "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" - } - ], - "license": "MIT" - }, - "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" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-git": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz", - "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==", - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "@simple-git/args-pathspec": "^1.0.3", - "@simple-git/argv-parser": "^1.1.0", - "debug": "^4.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, - "node_modules/socks": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", - "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/stream-to-array": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", - "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.1.0" - } - }, - "node_modules/streamx": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", - "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "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==", - "license": "MIT", - "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", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/stylus-lookup": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-6.1.2.tgz", - "integrity": "sha512-O+Q/SJ8s1X2aMLh4213fQ9X/bND9M3dhSsyTRe+O1OXPcewGLiYmAtKCrnP7FDvDBaXB2ZHPkCt3zi4cJXBlCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^12.1.0" - }, - "bin": { - "stylus-lookup": "bin/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/stylus-lookup/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/table-layout": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", - "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", - "license": "MIT", - "peer": true, - "dependencies": { - "array-back": "^6.2.2", - "wordwrapjs": "^5.1.0" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.3.tgz", - "integrity": "sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar 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", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "license": "MIT", - "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==", - "license": "MIT", - "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/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/tiktoken": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.22.tgz", - "integrity": "sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA==", - "license": "MIT" - }, - "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, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tmp": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", - "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/tree-sitter-wasms": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/tree-sitter-wasms/-/tree-sitter-wasms-0.1.13.tgz", - "integrity": "sha512-wT+cR6DwaIz80/vho3AvSF0N4txuNx/5bcRKoXouOfClpxh/qqrF4URNLQXbbt8MaAxeksZcZd1j8gcGjc+QxQ==", - "license": "Unlicense", - "optional": true, - "dependencies": { - "tree-sitter-wasms": "^0.1.11" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-graphviz": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/ts-graphviz/-/ts-graphviz-2.1.6.tgz", - "integrity": "sha512-XyLVuhBVvdJTJr2FJJV2L1pc4MwSjMhcunRVgDE9k4wbb2ee7ORYnPewxMWUav12vxyfUM686MSGsqnVRIInuw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } - ], - "license": "MIT", - "dependencies": { - "@ts-graphviz/adapter": "^2.0.6", - "@ts-graphviz/ast": "^2.0.7", - "@ts-graphviz/common": "^2.1.5", - "@ts-graphviz/core": "^2.0.7" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-morph": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-28.0.0.tgz", - "integrity": "sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==", - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.29.0", - "code-block-writer": "^13.0.3" - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "license": "0BSD" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "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==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", - "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", - "license": "MIT", - "dependencies": { - "content-type": "^2.0.0", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/type-is/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/type-is/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/typed-rest-client": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", - "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/unbash": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/unbash/-/unbash-4.0.1.tgz", - "integrity": "sha512-1ajSo3813sDoVIHx4inJdUS4l5L2ic5cFiddemPiyjb/PZEoBAhFwHtbaEdRDFxbAKy7FCG7s5ww3/uCFawuIA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", - "dev": true, - "license": "MIT", - "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==", - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", - "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", - "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", - "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "1.6.1", - "@vitest/runner": "1.6.1", - "@vitest/snapshot": "1.6.1", - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.1", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.1", - "@vitest/ui": "1.6.1", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/walk-up-path": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", - "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/walkdir": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", - "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-tree-sitter": { - "version": "0.24.7", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.7.tgz", - "integrity": "sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==", - "license": "MIT", - "optional": true - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wordwrapjs": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", - "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "ISC" - }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xstate": { - "version": "5.32.2", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.32.2.tgz", - "integrity": "sha512-uDrojEQYYb4cEeB/SpKDBQlnL2969N5ltmVak4jUMUC6VVRuhi7PCnTBxe4YlQ8YLzdaOEOuVR48CRQPE2o0Uw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/xstate" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yargs": { - "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, - "node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "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", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.2", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", - "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25.28 || ^4" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json index 1290f70a..7131002c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mitii-ai-agent", "displayName": "Mitii AI Agent", "description": "Local-first VS Code AI coding agent with precise repo context and safe Plan/Act workflow", - "version": "2.7.15", + "version": "2.7.30", "publisher": "mitii", "icon": "media/mitii-short-logo.png", "license": "AGPL-3.0-or-later", @@ -45,9 +45,15 @@ "onCommand:thunder.openChat", "onCommand:thunder.indexWorkspace", "onCommand:thunder.showSettings", - "onCommand:thunder.generateCommitMessage" + "onCommand:thunder.generateCommitMessage", + "onCommand:thunder.generateChangelog", + "onCommand:thunder.prepareRelease", + "onCommand:thunder.exportAuditPack" ], "main": "./dist/extension.js", + "bin": { + "mitii": "./bin/mitii.js" + }, "contributes": { "commands": [ { @@ -70,6 +76,11 @@ "title": "Mitii: Export Session Log", "category": "Mitii" }, + { + "command": "thunder.exportAuditPack", + "title": "Mitii: Export Audit Pack", + "category": "Mitii" + }, { "command": "thunder.openSessionLog", "title": "Mitii: Open Session Log File", @@ -95,6 +106,16 @@ "title": "Mitii: Generate Commit Message", "category": "Mitii", "icon": "media/mitii-activitybar.svg" + }, + { + "command": "thunder.generateChangelog", + "title": "Mitii: Generate Changelog Entry", + "category": "Mitii" + }, + { + "command": "thunder.prepareRelease", + "title": "Mitii: Prepare Release", + "category": "Mitii" } ], "menus": { @@ -142,11 +163,58 @@ "default": false, "description": "Capture extra session diagnostics (tool inputs, context sources, LLM step metadata). Process timing is always logged when session logging is on." }, + "thunder.telemetry.webhookUrl": { + "type": "string", + "default": "", + "description": "Optional SIEM/webhook endpoint. When set, sanitized session events are POSTed as JSON." + }, + "thunder.telemetry.webhookSecret": { + "type": "string", + "default": "", + "description": "Optional HMAC signing secret for webhook events. Prefer workspace or managed settings for enterprise deployments." + }, + "thunder.telemetry.webhookTimeoutMs": { + "type": "number", + "default": 5000, + "minimum": 1000, + "maximum": 60000, + "description": "Timeout in milliseconds for telemetry webhook delivery attempts." + }, + "thunder.ui.showReasoning": { + "type": "boolean", + "default": true, + "description": "Show streamed model reasoning when the provider returns reasoning deltas." + }, + "thunder.ui.reasoningPreviewMaxChars": { + "type": "number", + "default": 8000, + "minimum": 0, + "maximum": 100000, + "description": "Maximum reasoning characters shown inline. Set 0 to show all reasoning." + }, + "thunder.enterprise.localProvidersOnly": { + "type": "boolean", + "default": false, + "description": "Enterprise policy flag documenting that only local providers should be used for this workspace." + }, + "thunder.enterprise.stripFileContentsFromAuditPacks": { + "type": "boolean", + "default": false, + "description": "Strip file contents and large tool outputs from exported audit packs while preserving metadata." + }, + "thunder.enterprise.autoExportAuditPackOnSessionEnd": { + "type": "boolean", + "default": false, + "description": "Export a sanitized audit pack automatically to .mitii/audit/ when an agent turn completes." + }, "thunder.provider.type": { "type": "string", "enum": [ "openai-compatible", + "openrouter", "openai", + "azure-openai", + "bedrock", "anthropic", "gemini", "deepseek", @@ -167,11 +235,29 @@ "default": "qwen3-coder:30b", "description": "Model name" }, + "thunder.provider.apiVersion": { + "type": "string", + "default": "2024-10-21", + "description": "Provider API version. Used by Azure OpenAI when building deployment chat completion URLs." + }, + "thunder.provider.region": { + "type": "string", + "default": "us-east-1", + "description": "Cloud provider region. Used by AWS Bedrock." + }, "thunder.provider.contextWindow": { "type": "number", "default": 8192, "description": "Model context window size. Thunder trims prompts automatically to stay within this limit." }, + "thunder.provider.supportsVision": { + "type": "boolean", + "description": "Optional override for model vision support. Leave unset to use automatic provider/model detection." + }, + "thunder.provider.supportsReasoning": { + "type": "boolean", + "description": "Optional override for streamed reasoning support. Leave unset to use automatic provider/model detection." + }, "thunder.indexing.enabled": { "type": "boolean", "default": true, @@ -246,6 +332,11 @@ "maximum": 30, "description": "Number of items to keep after reranking" }, + "thunder.context.microTaskRoutingEnabled": { + "type": "boolean", + "default": true, + "description": "Route narrow chat requests such as commit messages, changelog entries, and release notes through minimal Git context instead of the full agent loop." + }, "thunder.safety.requireApprovalForWrites": { "type": "boolean", "default": true, @@ -516,17 +607,36 @@ } }, "scripts": { - "vscode:prepublish": "npm run compile", - "compile": "npm run compile:extension && npm run compile:webview", + "vscode:prepublish": "pnpm run compile", + "compile": "pnpm run compile:extension && pnpm run compile:webview && pnpm run compile:cli", + "setup": "bash scripts/dev-setup.sh", + "setup:cursor": "THUNDER_EDITOR=cursor bash scripts/dev-setup.sh", "rebuild:native": "node scripts/rebuild-native.mjs", - "rebuild:node": "npm rebuild better-sqlite3", - "rebuild:all": "npm run rebuild:native && npm run rebuild:node", - "postinstall": "node -e \"console.log('Run npm run rebuild:native before F5 if better-sqlite3 fails to load')\"", + "rebuild:node": "node scripts/rebuild-node.mjs", + "rebuild:all": "pnpm run rebuild:native && pnpm run rebuild:node", + "postinstall": "node -e \"console.log('Run pnpm run rebuild:native before F5 if better-sqlite3 fails to load')\"", "prepare": "node scripts/install-git-hooks.mjs", "version:bump": "node scripts/bump-version.mjs", + "readme:sync-version": "node scripts/sync-readme-version.mjs", + "release:check-assets": "node scripts/check-release-assets.mjs", + "release:prepare": "pnpm run compile:cli && node dist/cli.js prepare-release", + "benchmark": "pnpm --filter @mitii/benchmark benchmark", + "benchmark:smoke": "pnpm --filter @mitii/benchmark benchmark:smoke", + "benchmark:all": "pnpm --filter @mitii/benchmark benchmark:all", + "benchmark:integration": "pnpm --filter @mitii/benchmark benchmark:integration", + "eval:generate": "pnpm --filter @mitii/benchmark eval:generate", + "eval:generate:full": "pnpm --filter @mitii/benchmark eval:generate:full", + "eval:preflight": "node tools/benchmark/scripts/preflight.mjs", + "eval:smoke": "pnpm --filter @mitii/benchmark eval:smoke", + "eval:standard": "node tools/benchmark/scripts/run-eval.mjs --tier eval --runtime real --ensure-ready", + "eval:aggregate": "node tools/benchmark/scripts/aggregate-results.mjs", + "eval:matrix": "pnpm --filter @mitii/benchmark eval:matrix", + "eval:reset-fixtures": "node tools/benchmark/scripts/reset-fixtures.mjs", "compile:extension": "esbuild src/extension.ts --bundle --outfile=dist/extension.js --external:vscode --packages=external --platform=node --format=cjs --sourcemap", "compile:webview": "vite build", - "watch": "concurrently \"npm run watch:extension\" \"npm run watch:webview\"", + "compile:skills": "node scripts/copy-bundled-skills.mjs", + "compile:cli": "pnpm run compile:skills && esbuild src/node/cli.ts --bundle --outfile=dist/cli.js --platform=node --format=cjs --packages=external --alias:vscode=./src/node/vscode-shim.ts", + "watch": "concurrently \"pnpm run watch:extension\" \"pnpm run watch:webview\"", "watch:extension": "esbuild src/extension.ts --bundle --outfile=dist/extension.js --external:vscode --packages=external --platform=node --format=cjs --sourcemap --watch", "watch:webview": "vite build --watch", "test": "vitest run", @@ -547,17 +657,17 @@ "checkpoint:read": "bash scripts/read-checkpoint.sh", "lint:safe-target": "bash scripts/safe-lint-target.sh", "env:sync": "node scripts/sync-env-files.mjs", - "preflight": "npm run lint && npm run rebuild:node && npm test && npm run rebuild:native", + "preflight": "pnpm run release:check-assets && pnpm run lint && pnpm run rebuild:node && pnpm test && pnpm run rebuild:native", "clean:vsce-deps": "node -e \"const fs=require('fs'); for (const p of ['node_modules/@emnapi','node_modules/@napi-rs','node_modules/@tybys']) fs.rmSync(p,{recursive:true,force:true});\"", - "package": "npm run clean:vsce-deps && vsce package", - "package:preflight": "npm run preflight && npm run package", - "publish:vsce": "npm run preflight && npm run clean:vsce-deps && vsce publish", - "version:patch": "npm version patch --no-git-tag-version --force", - "version:minor": "npm version minor --no-git-tag-version --force", - "version:major": "npm version major --no-git-tag-version --force", - "publish:patch": "npm run version:patch && npm run publish:vsce", - "publish:minor": "npm run version:minor && npm run publish:vsce", - "publish:major": "npm run version:major && npm run publish:vsce", + "package": "pnpm run clean:vsce-deps && pnpm exec vsce package", + "package:preflight": "pnpm run preflight && pnpm run package", + "publish:vsce": "pnpm run preflight && pnpm run clean:vsce-deps && pnpm exec vsce publish", + "version:patch": "pnpm version patch --no-git-tag-version --force && pnpm run readme:sync-version", + "version:minor": "pnpm version minor --no-git-tag-version --force && pnpm run readme:sync-version", + "version:major": "pnpm version major --no-git-tag-version --force && pnpm run readme:sync-version", + "publish:patch": "pnpm run version:patch && pnpm run publish:vsce", + "publish:minor": "pnpm run version:minor && pnpm run publish:vsce", + "publish:major": "pnpm run version:major && pnpm run publish:vsce", "smoke": "vitest run test/smoke" }, "devDependencies": { @@ -579,6 +689,7 @@ "vitest": "^1.6.0" }, "dependencies": { + "@aws-sdk/client-bedrock-runtime": "^3.1078.0", "@lancedb/lancedb": "^0.30.0", "@modelcontextprotocol/sdk": "^1.29.0", "@vscode/ripgrep": "^1.15.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..ac05277d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7505 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@aws-sdk/client-bedrock-runtime': + specifier: ^3.1078.0 + version: 3.1079.0 + '@lancedb/lancedb': + specifier: ^0.30.0 + version: 0.30.0(apache-arrow@18.1.0) + '@modelcontextprotocol/sdk': + specifier: ^1.29.0 + version: 1.29.0(zod@3.25.76) + '@vscode/ripgrep': + specifier: ^1.15.9 + version: 1.18.0 + '@xenova/transformers': + specifier: ^2.17.2 + version: 2.17.2 + '@xstate/react': + specifier: ^6.1.0 + version: 6.1.0(@types/react@18.3.31)(react@18.3.1)(xstate@5.32.4) + better-sqlite3: + specifier: ^12.11.1 + version: 12.11.1 + diff: + specifier: ^5.2.0 + version: 5.2.2 + framer-motion: + specifier: ^12.42.0 + version: 12.42.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + ignore: + specifier: ^5.3.1 + version: 5.3.2 + nanoid: + specifier: ^5.0.7 + version: 5.1.16 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + shiki: + specifier: ^4.3.0 + version: 4.3.0 + simple-git: + specifier: ^3.25.0 + version: 3.36.0 + tiktoken: + specifier: ^1.0.22 + version: 1.0.22 + ts-morph: + specifier: ^28.0.0 + version: 28.0.0 + xstate: + specifier: ^5.32.2 + version: 5.32.4 + zod: + specifier: ^3.23.8 + version: 3.25.76 + zod-to-json-schema: + specifier: ^3.25.2 + version: 3.25.2(zod@3.25.76) + devDependencies: + '@electron/rebuild': + specifier: ^3.7.2 + version: 3.7.2 + '@types/better-sqlite3': + specifier: ^7.6.12 + version: 7.6.13 + '@types/diff': + specifier: ^7.0.2 + version: 7.0.2 + '@types/node': + specifier: ^20.14.0 + version: 20.19.43 + '@types/react': + specifier: ^18.3.3 + version: 18.3.31 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.7(@types/react@18.3.31) + '@types/vscode': + specifier: ^1.85.0 + version: 1.125.0 + '@vitejs/plugin-react': + specifier: ^4.3.1 + version: 4.7.0(vite@5.4.21(@types/node@20.19.43)) + '@vscode/vsce': + specifier: ^2.32.0 + version: 2.32.0 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + esbuild: + specifier: ^0.21.5 + version: 0.21.5 + knip: + specifier: ^6.21.0 + version: 6.24.0 + madge: + specifier: ^8.0.0 + version: 8.0.0(typescript@5.9.3) + typescript: + specifier: ^5.5.2 + version: 5.9.3 + vite: + specifier: ^5.3.1 + version: 5.4.21(@types/node@20.19.43) + vitest: + specifier: ^1.6.0 + version: 1.6.1(@types/node@20.19.43) + optionalDependencies: + tree-sitter-wasms: + specifier: ^0.1.13 + version: 0.1.13 + web-tree-sitter: + specifier: ^0.24.7 + version: 0.24.7 + + tools/benchmark: {} + +packages: + + '@aws-sdk/client-bedrock-runtime@3.1079.0': + resolution: {integrity: sha512-+LxXUhnDsQ4Yr+zSQbROKClMfIRA8mLPtZgQukb6omczIqmi0yvDmbLovdLJGnm9GRj83kKSxWV24Ms5aUgJfg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.974.27': + resolution: {integrity: sha512-WRWEgIq6vx+NU6ot3VrRu4Jovj9MIObitSi6of/GV5THDDPccBhivCRNkWJutMM+m3GvdeI3l/UbGNcoOobxOA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.53': + resolution: {integrity: sha512-+KDA3uc/HZ1vIneGu5QMQb0gAXDYrm2vOE60+BJ7lS0YinMQ5i2oV4PR1A16XkF6K1IbSwjEHd1hQIIgMsK48w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.55': + resolution: {integrity: sha512-1gBfkWY3RWeBlCoB9lIJjXMx45/54wxcgfzv6BY9otTmMrZPcNPi1v+MwZxxaCUg441NV3jsr1efnFNCXiW70g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.60': + resolution: {integrity: sha512-CV2md+PXvABwRjApWGhQ0wACy9WSFIhnUGrovLcjnjBCd/46TbuivLADtkF8IWNjtCQmQ+2IagSaxqBYqXBNAQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.59': + resolution: {integrity: sha512-JG4S9yyA1GFzJdJXqLKrUzZbyK+VDp2QIsJD7YOicJHAhqymfHpDJIok2dLnhOdVB0I37RjdC53uOwCMVS00gw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.62': + resolution: {integrity: sha512-S6Slq3Tx7bvFk5yc34XNADyZYTX2HUXvaFAnowGRQnhjBO8J/mP62Fn7lxvJwjaDyYm/7gh9h6HEHaltRyMFXw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.53': + resolution: {integrity: sha512-EhfH+MQlqOMCkXIVa8MMObPzAQqwTTtxA7KhEJiyPeuNVA8PLOOUpgK7nBrgaDaGiIDLN/9LpGdaHuDjomeRTw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.59': + resolution: {integrity: sha512-h8793pOjcImx0SB+VcLONcaQQ57VAvKVuqyewQMRKqqH+CSXsG2dwOeLMUJPMxLdNvL7dXOM0ueTukyNUnu5mA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.59': + resolution: {integrity: sha512-VoyO9+vl3XVmpZwn4obskrWIkrA/Jf3lSe1E3ZERlaN9u0D4YZ6+HywC3+L98QOXqZesEfedk67gRER8tK8+8w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/eventstream-handler-node@3.972.25': + resolution: {integrity: sha512-df7HN1ozwMrB9+59re9PM7tSLxLAcheMWc5u/KyfCPCAWtN/vP7y7RTUZOy48uT1K9MESisVeOPPzF3O1AW01A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-eventstream@3.972.21': + resolution: {integrity: sha512-HvLgDnxBLaHi9E5K++6Vuk+1+qqn7Pmn8zrlzd+NXH3jBzwujnuzZtAR9WHPkbUGPO92FkoQWj/M1IsdxTlBmQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-websocket@3.972.35': + resolution: {integrity: sha512-7/ZAlq5o5A9FnRsQEftZvcct9LVZf1YaYmWR3eOzyJAdKU66YpOKy5ahUVvyBvCTLyO4Ej4yWIk8dllWNXPBsw==} + engines: {node: '>= 14.0.0'} + + '@aws-sdk/nested-clients@3.997.27': + resolution: {integrity: sha512-A8PIePF9NIIOJ/4Lg1rl9xm/+QaKkHGetq+Z9wb5B+3Da31YYXRo8n7IDMh5C+HQI5eyEmjrwkGWVdYtnLtbXQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.996.38': + resolution: {integrity: sha512-C379Sk+MiFZCfWZphKlMyLHKxV22OjoGM5KJjj5IJNJcOCWL4IGIpnEGzv1FQiRwhYXfq55SJMfxlqPE08JJ9g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.1079.0': + resolution: {integrity: sha512-cbietrLlHPhhmbnMPTuDS4Zj/KNGhY+3vVhn6dwjO6Dqzrwothzg2srtcY34T9mlICsTXn34avDoWLHSntP54A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.15': + resolution: {integrity: sha512-IULn8uBV/SMtmOIANsm4WHXIOtVPBWfOWs3WGL0j/sI+KhaYehvOw0ET+9urnn8MBpiijuU/0JOpuwKOE451PQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/xml-builder@3.972.33': + resolution: {integrity: sha512-ezbwz9WpuLctm6o7P2t2naDhVVPI5jFGrVefVybhcKGjU57VIyT46pQVO0RI2RYkUdhdj2Z9uSIlAzGZE9NW9A==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.3.0': + resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} + engines: {node: '>=18.0.0'} + + '@azure/abort-controller@2.1.2': + resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} + engines: {node: '>=18.0.0'} + + '@azure/core-auth@1.10.1': + resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} + engines: {node: '>=20.0.0'} + + '@azure/core-client@1.10.2': + resolution: {integrity: sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==} + engines: {node: '>=20.0.0'} + + '@azure/core-rest-pipeline@1.24.0': + resolution: {integrity: sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==} + engines: {node: '>=20.0.0'} + + '@azure/core-tracing@1.3.1': + resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} + engines: {node: '>=20.0.0'} + + '@azure/core-util@1.13.1': + resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} + engines: {node: '>=20.0.0'} + + '@azure/identity@4.13.1': + resolution: {integrity: sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==} + engines: {node: '>=20.0.0'} + + '@azure/logger@1.3.0': + resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} + engines: {node: '>=20.0.0'} + + '@azure/msal-browser@5.16.0': + resolution: {integrity: sha512-Wc75FGnQgYpsm5jsOqn1H8AXsh8vXruA6vwip1nhjrJxwby7juxKAIVLr7csepmHiwdZGr6EwI5BlSc3PizEtQ==} + engines: {node: '>=0.8.0'} + + '@azure/msal-common@16.11.0': + resolution: {integrity: sha512-UikJOtMwkFpZNzTH6Dqk8UTUPbow15zH3e0UjGYZy69lYENW/S05gMLhbxI2eonz66uALhIljvhsSMEb6+O30g==} + engines: {node: '>=0.8.0'} + + '@azure/msal-node@5.3.1': + resolution: {integrity: sha512-sqqv3L1UOI4KDXonNtbxPYUgbSWVXqxvmmb6BUw9n4P/UXgG+cVur3dLWQN4Cz7qQ+UJROCCxMXlksm7gIq0Sw==} + engines: {node: '>=20'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@dependents/detective-less@5.0.3': + resolution: {integrity: sha512-v6oD9Ukp+N7V4n6p5I/+mM5fIohSfkrDSGlFm5w/pYmchvbk+sMIHsLxrFJ5Lnujewj1BzWL0K84d88lwZAMQA==} + engines: {node: '>=18'} + + '@discoveryjs/json-ext@1.1.0': + resolution: {integrity: sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==} + engines: {node: '>=14.17.0'} + + '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': + resolution: {tarball: https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2} + version: 10.2.0-electron.1 + engines: {node: '>=12.13.0'} + hasBin: true + + '@electron/rebuild@3.7.2': + resolution: {integrity: sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==} + engines: {node: '>=12.13.0'} + hasBin: true + + '@emnapi/core@1.11.0': + resolution: {integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==} + + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/runtime@1.11.0': + resolution: {integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@huggingface/jinja@0.2.2': + resolution: {integrity: sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==} + engines: {node: '>=18'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + + '@lancedb/lancedb-darwin-arm64@0.30.0': + resolution: {integrity: sha512-x6dmsjRIv0xumELYnFAEfyFDxqcO/n4rHYCJvC27RbRez0UmbByi6OMTgbSoSTatrQSPRCL7JJSa5pwNeawnIg==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [darwin] + + '@lancedb/lancedb-linux-arm64-gnu@0.30.0': + resolution: {integrity: sha512-CWUex7hRNiLkXFeTQlUGPyy5VktbXoUmQdZuiVCETZ6ggljEC7c7Qvzu2ge+jEZML+UE7tXL2lVC3klRFGczng==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + + '@lancedb/lancedb-linux-arm64-musl@0.30.0': + resolution: {integrity: sha512-2MHmAS4tKePNVbwfgDrjCFj6BVuAgXlL2c9iWk7TfcwL+jcSxo52LFx03O0+ArpVCF2sI6aoDqZaQNre5zMniQ==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + + '@lancedb/lancedb-linux-x64-gnu@0.30.0': + resolution: {integrity: sha512-0OpDNxsDE4OXD+PIFd7KdE42xhYIE+fZL+jCm1v3dTug4UEhumWBuSgbUIBP7t0yJZHwh62/QivVh/V1cPB2Bg==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + + '@lancedb/lancedb-linux-x64-musl@0.30.0': + resolution: {integrity: sha512-4Bq7VngQt+lyxIcu79EN8nYJs8gvUnrIT6I/t2MSlpG/BXWHZG2A+PRii1Zq4GCUlRTTG+RlieCv8CBGSPm8bw==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + + '@lancedb/lancedb-win32-arm64-msvc@0.30.0': + resolution: {integrity: sha512-N2DQg2XBWZirn5jS6kRJUxF679t3sKcIxBwP9zY4Idq5OVLAj0yfLueWIKhYxv8en7pBFYWdgw5j9dTS7XajyQ==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [win32] + + '@lancedb/lancedb-win32-x64-msvc@0.30.0': + resolution: {integrity: sha512-CDgN/ZmYqSlVX2nBJAF2PYEwqBBxotCVORjagmvrd0k5D7RBLlAQUEAR4gDMum2BpYsUkzdTYQpquLjRCVbwbQ==} + engines: {node: '>= 18'} + cpu: [x64] + os: [win32] + + '@lancedb/lancedb@0.30.0': + resolution: {integrity: sha512-d0FoEL6cthqgsulqAc7fck6kRXrSRGMTqlKYbhSGSazHU6vB2GEpD737Mu0HZd7fMyBUdhR9sD1W2C9uQZ5p0Q==} + engines: {node: '>= 18'} + cpu: [x64, arm64] + os: [darwin, linux, win32] + peerDependencies: + apache-arrow: '>=15.0.0 <=18.1.0' + + '@malept/cross-spawn-promise@2.0.0': + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@npmcli/fs@2.1.2': + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + '@npmcli/move-file@2.0.1': + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + + '@oxc-parser/binding-android-arm-eabi@0.137.0': + resolution: {integrity: sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.137.0': + resolution: {integrity: sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.137.0': + resolution: {integrity: sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.137.0': + resolution: {integrity: sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.137.0': + resolution: {integrity: sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.137.0': + resolution: {integrity: sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.137.0': + resolution: {integrity: sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.137.0': + resolution: {integrity: sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.137.0': + resolution: {integrity: sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-ppc64-gnu@0.137.0': + resolution: {integrity: sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.137.0': + resolution: {integrity: sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.137.0': + resolution: {integrity: sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.137.0': + resolution: {integrity: sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.137.0': + resolution: {integrity: sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.137.0': + resolution: {integrity: sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.137.0': + resolution: {integrity: sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.137.0': + resolution: {integrity: sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.137.0': + resolution: {integrity: sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.137.0': + resolution: {integrity: sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.137.0': + resolution: {integrity: sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.137.0': + resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + + '@oxc-resolver/binding-android-arm-eabi@11.21.3': + resolution: {integrity: sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.21.3': + resolution: {integrity: sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.21.3': + resolution: {integrity: sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.21.3': + resolution: {integrity: sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.21.3': + resolution: {integrity: sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3': + resolution: {integrity: sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.3': + resolution: {integrity: sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.21.3': + resolution: {integrity: sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.21.3': + resolution: {integrity: sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.3': + resolution: {integrity: sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.3': + resolution: {integrity: sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.21.3': + resolution: {integrity: sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.21.3': + resolution: {integrity: sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.21.3': + resolution: {integrity: sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.21.3': + resolution: {integrity: sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-openharmony-arm64@11.21.3': + resolution: {integrity: sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.21.3': + resolution: {integrity: sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.21.3': + resolution: {integrity: sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.21.3': + resolution: {integrity: sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q==} + cpu: [x64] + os: [win32] + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.2': + resolution: {integrity: sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.1': + resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + cpu: [x64] + os: [win32] + + '@shikijs/core@4.3.0': + resolution: {integrity: sha512-EooU3i9F6IAE8kEu+AnGf9DFZWkQBZ+hJn3tLVbsH+61mtQiva5biai66fAA6nvFPXkLgvrh7BrR7YcJU83xQQ==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.3.0': + resolution: {integrity: sha512-hTv/KiFf2tpiqlACPiztGGurEARWIutB8YUhcrA1pUC7VzzwKO+g5crUocrLztrZ5ro5Z4hbXg7bYclETn3gSQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.3.0': + resolution: {integrity: sha512-1vMdN3gHfnKfLYwecUI2ITJI4RhHt96xEaJumVn7Heb0IlJ8WQMIH0Voak+2j22BpSNKdnOfB/pCTPnPm2gq7A==} + engines: {node: '>=20'} + + '@shikijs/langs@4.3.0': + resolution: {integrity: sha512-rnlqFbBRSys9bT4gl/5rw9RnS0W/I84ZldXPkO7cvlEMoV85TyF/aU01N7/NbSR776RNLjrJKjfFUXJR6wN1Cg==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.3.0': + resolution: {integrity: sha512-CPkz64PTa5diRW1ggzMZH9VM/du4RNChYgVtgqrFcgruvIybmCvySv8GkiHSczUHXYuuR8TdKEwFx+UnZMpgdg==} + engines: {node: '>=20'} + + '@shikijs/themes@4.3.0': + resolution: {integrity: sha512-Avgt05YiT+Y3prjIc9lmQxhJzHBcCfR6cjiFW4OyaMBbt2A6trX5rfjUzx+Vj/mE9qpArYjatnqo9XPjQNW/AQ==} + engines: {node: '>=20'} + + '@shikijs/types@4.3.0': + resolution: {integrity: sha512-oc8b9U2SYvofKZk8e/737nIX0qwf6eV2vHFATeObAu7r+mUVpLs8Re0BmVkIjAWAYgkmG/CzLNo7rzuBzRu/wQ==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@simple-git/args-pathspec@1.0.3': + resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} + + '@simple-git/argv-parser@1.1.1': + resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==} + + '@sinclair/typebox@0.27.10': + resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@smithy/core@3.29.1': + resolution: {integrity: sha512-qoiY4nrk5OCu1+eIR1VB8l5DmON/oKiqrd5zZFAhXJXjJlLWQusKEW/SkBDAtGDcPaz86m9kfcE1lngU0GlM6A==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.4.6': + resolution: {integrity: sha512-B2WQ/PV/H6Jeg3lrIq6bKUfa6Hy01mtK7CGs6lhjzHA6k4aagldH6T6eEjnzKl4HI0cJnAsxfJ19pgb5PV+CVQ==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.6.3': + resolution: {integrity: sha512-CwCc/7SMTj45y97MUnDTbTaxvtAsiNNRm81z3abROIuMbMsC2Iy5EKfkkVdsKrz8WExQAAMx1EJapq+9j4fFTQ==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.9.3': + resolution: {integrity: sha512-qZTa4gQFUo8RM02rk6q5UVTDLNrQ1oS20LsepBzqq1QBVc/EHJ03OOUADcqMZiXHArW+Y7+OGY0BpdTwZRq/Yg==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.6.2': + resolution: {integrity: sha512-QgHflghMoPxCJ9axiCVh8KZfbC9fuP6vkXXyK//E3cq7nLaSSyyLj0GAoqVWezYeDQmXIZhmlRvLE16jsqDK6g==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.15.1': + resolution: {integrity: sha512-x3L0XSACF6UYzKpa9biqiRMgvH5+wnFFew9Tm/grFYqgaupPwx/+ojDPpPJM8dZON3S9tjz5U+PQYsCBd1Mw5Q==} + engines: {node: '>=18.0.0'} + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/once@2.0.1': + resolution: {integrity: sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==} + engines: {node: '>= 10'} + + '@ts-graphviz/adapter@2.0.6': + resolution: {integrity: sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q==} + engines: {node: '>=18'} + + '@ts-graphviz/ast@2.0.7': + resolution: {integrity: sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw==} + engines: {node: '>=18'} + + '@ts-graphviz/common@2.1.5': + resolution: {integrity: sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg==} + engines: {node: '>=18'} + + '@ts-graphviz/core@2.0.7': + resolution: {integrity: sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg==} + engines: {node: '>=18'} + + '@ts-morph/common@0.29.0': + resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/better-sqlite3@7.6.13': + resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/command-line-args@5.2.3': + resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} + + '@types/command-line-usage@5.0.4': + resolution: {integrity: sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==} + + '@types/diff@7.0.2': + resolution: {integrity: sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/vscode@1.125.0': + resolution: {integrity: sha512-0icm/ZQAaism87P0ekHqi4/Ju9du+Tm0RUW+y7vqRsxY2cY0FNRX1nAnaW7nT6npPt2tfHiheZ55Zm9UhqonFA==} + + '@typescript-eslint/project-service@8.62.1': + resolution: {integrity: sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/tsconfig-utils@8.62.1': + resolution: {integrity: sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.62.1': + resolution: {integrity: sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.62.1': + resolution: {integrity: sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.62.1': + resolution: {integrity: sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typespec/ts-http-runtime@0.3.6': + resolution: {integrity: sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==} + engines: {node: '>=20.0.0'} + + '@ungap/structured-clone@1.3.2': + resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@vscode/ripgrep-darwin-arm64@1.18.0': + resolution: {integrity: sha512-r3ktHSvbFycQNF6sl7sNDPocpsI7J+mEzh1IaZFkY0spm3k2Z9t8hPAeOK7+p0l6p6/swkQC14XWX01low+94Q==} + cpu: [arm64] + os: [darwin] + + '@vscode/ripgrep-darwin-x64@1.18.0': + resolution: {integrity: sha512-25b4gWbL138dGuQU244ebCKKc0q05ULBMoFSz9oAEUHNeqK/lOJViDS7DRvbDazzAzSEdan391Znks/R5mkaTQ==} + cpu: [x64] + os: [darwin] + + '@vscode/ripgrep-linux-arm64@1.18.0': + resolution: {integrity: sha512-lQ/5zTG++U0E3IhVgS4EPTTn/U4okncaRMM5GOFfOYZywS4nuD31GhkHbNYlDk5CuDC68+hYJ0/eQeyCKJDA+g==} + cpu: [arm64] + os: [linux] + + '@vscode/ripgrep-linux-arm@1.18.0': + resolution: {integrity: sha512-GDAvufNDHu8zqLEmXstalQF0Wh6wQvdsBi/Vg3Yi3CK4a8XoFXqqXVEHEZ9xQz3t0NfoSEc9JbvK9DDS6FxyxQ==} + cpu: [arm] + os: [linux] + + '@vscode/ripgrep-linux-ia32@1.18.0': + resolution: {integrity: sha512-YWLkSUtFd4Jh5EepIhA9RJSfv3uMAVMo+2rBIGHPBnvgLrZciIs2cDKei1/p6Wc/aCzUoHyMAg2R6tw4ZCBKGg==} + cpu: [ia32] + os: [linux] + + '@vscode/ripgrep-linux-ppc64@1.18.0': + resolution: {integrity: sha512-quXVY8fwQ8O/lvU1yrSqSl3jlUzysRSb+AfUfCL/tRtphxsKlFvPAejryZ6vg4Bgvn8XL74xb4qMCDmWgYrT5w==} + cpu: [ppc64] + os: [linux] + + '@vscode/ripgrep-linux-riscv64@1.18.0': + resolution: {integrity: sha512-f5kBQBrWfQt8Q7OhSORuNDei5dkYagBj3y4jImSUXGMy8B/Ke7SltSRcUtjPv166FAFfHCAmWuZp3+cWnX2/Vw==} + cpu: [riscv64] + os: [linux] + + '@vscode/ripgrep-linux-s390x@1.18.0': + resolution: {integrity: sha512-rTOcJFGGcl2c07RUOWUo4U1ndnemKhY6A9hnMB18uk7jSgJc0d/QLBGWMWpumdtoJtpizn/wIv5mXIisJukusQ==} + cpu: [s390x] + os: [linux] + + '@vscode/ripgrep-linux-x64@1.18.0': + resolution: {integrity: sha512-mQ3bVrUpnD2vs7QT0vX90Lt0cnUq467uFtEktIdsJJmW296RoSULRGqWgzG1AKxyBpNDD6l4ZO4qKf6SgyC23Q==} + cpu: [x64] + os: [linux] + + '@vscode/ripgrep-win32-arm64@1.18.0': + resolution: {integrity: sha512-vfTIjq1OHnzUjxZcHVQAMbnggp8dpGf+0QKFOZHwWPqFwXxQC8eCWM+5NUdoJ6yrElCeMzoUTXoK/LdZaniB+Q==} + cpu: [arm64] + os: [win32] + + '@vscode/ripgrep-win32-ia32@1.18.0': + resolution: {integrity: sha512-//rfAE+BOw5AC2EMmepmiE36jUuevtQYNQqqlw1s3m9FlRxjxEut97RkRPHAu9BG4mSojatZx+kXZXNdyI9caQ==} + cpu: [ia32] + os: [win32] + + '@vscode/ripgrep-win32-x64@1.18.0': + resolution: {integrity: sha512-KNPvtElldqILHdnAetujPaowkNbpqJy3ssIGGN6F6Kve9Qi+nNLI2DN01O83JjCEVQbCzl8Ov3QZ9Eov3BR8Dg==} + cpu: [x64] + os: [win32] + + '@vscode/ripgrep@1.18.0': + resolution: {integrity: sha512-ns5lWe44tSfbTMbVUsyB+I1819PVSw4AdpgK0RNkzfWfwy6+3IUNSxwSrfTno1/oWaS/hERNz+XLWVyga2aJBQ==} + + '@vscode/vsce-sign-alpine-arm64@2.0.6': + resolution: {integrity: sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==} + cpu: [arm64] + os: [alpine] + + '@vscode/vsce-sign-alpine-x64@2.0.6': + resolution: {integrity: sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==} + cpu: [x64] + os: [alpine] + + '@vscode/vsce-sign-darwin-arm64@2.0.6': + resolution: {integrity: sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==} + cpu: [arm64] + os: [darwin] + + '@vscode/vsce-sign-darwin-x64@2.0.6': + resolution: {integrity: sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==} + cpu: [x64] + os: [darwin] + + '@vscode/vsce-sign-linux-arm64@2.0.6': + resolution: {integrity: sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==} + cpu: [arm64] + os: [linux] + + '@vscode/vsce-sign-linux-arm@2.0.6': + resolution: {integrity: sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==} + cpu: [arm] + os: [linux] + + '@vscode/vsce-sign-linux-x64@2.0.6': + resolution: {integrity: sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==} + cpu: [x64] + os: [linux] + + '@vscode/vsce-sign-win32-arm64@2.0.6': + resolution: {integrity: sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==} + cpu: [arm64] + os: [win32] + + '@vscode/vsce-sign-win32-x64@2.0.6': + resolution: {integrity: sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==} + cpu: [x64] + os: [win32] + + '@vscode/vsce-sign@2.0.9': + resolution: {integrity: sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==} + + '@vscode/vsce@2.32.0': + resolution: {integrity: sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==} + engines: {node: '>= 16'} + hasBin: true + + '@vue/compiler-core@3.5.39': + resolution: {integrity: sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==} + + '@vue/compiler-dom@3.5.39': + resolution: {integrity: sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==} + + '@vue/compiler-sfc@3.5.39': + resolution: {integrity: sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==} + + '@vue/compiler-ssr@3.5.39': + resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==} + + '@vue/shared@3.5.39': + resolution: {integrity: sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==} + + '@xenova/transformers@2.17.2': + resolution: {integrity: sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==} + + '@xstate/react@6.1.0': + resolution: {integrity: sha512-ep9F0jGTI63B/jE8GHdMpUqtuz7yRebNaKv8EMUaiSi29NOglywc2X2YSOV/ygbIK+LtmgZ0q9anoEA2iBSEOw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + xstate: ^5.28.0 + peerDependenciesMeta: + xstate: + optional: true + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + apache-arrow@18.1.0: + resolution: {integrity: sha512-v/ShMp57iBnBp4lDgV8Jx3d3Q5/Hac25FWmQ98eMahUiHPXcvwIMKJD0hBIgclm/FCG+LwPkAKtkRO1O/W0YGg==} + hasBin: true + + app-module-path@2.2.0: + resolution: {integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@6.2.3: + resolution: {integrity: sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==} + engines: {node: '>=12.17'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-module-types@6.0.2: + resolution: {integrity: sha512-6KuK/7nZ/2Qh7sGuVEiwxjCxzTY2Pdb5mTo5z1e6/J8BA0tvjR7G8vQJKrQMTqwmnA3UPEyKIFX4YUS1DO1Hvw==} + engines: {node: '>=18'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + azure-devops-node-api@12.5.0: + resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} + + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.3: + resolution: {integrity: sha512-xRgplks8SvcKkdlv2M6Z2LZmRsmqd+x0nXXGXeMEjwdibj1HSDrlnqBRLeYdMvsgCox7Bq0e+DHwfczOfsn6IA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.9.3: + resolution: {integrity: sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.1: + resolution: {integrity: sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.5: + resolution: {integrity: sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.41: + resolution: {integrity: sha512-WwS7MHhqGHHlaVsqRZnhvCEMS0owDX+SxRlve7JkuH7My1Ara3ZriTmCQupPfYjxMZ8I/tgxtJYr2t7taHaH4A==} + engines: {node: '>=6.0.0'} + hasBin: true + + better-sqlite3@12.11.1: + resolution: {integrity: sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.4: + resolution: {integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001800: + resolution: {integrity: sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} + engines: {node: '>=20.18.1'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + cockatiel@3.2.1: + resolution: {integrity: sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==} + engines: {node: '>=16'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@7.0.4: + resolution: {integrity: sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==} + engines: {node: '>=12.20.0'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dependency-tree@11.5.0: + resolution: {integrity: sha512-K9zBwKDZrot3RkxizugpVSdImxULAg4Ycp3+ydy2r561k96oiiw6nfsOR15fwNDQ5BF2UXe+2JFM/H5Xz4MGQg==} + engines: {node: '>=18'} + hasBin: true + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detective-amd@6.1.0: + resolution: {integrity: sha512-fmI6LGMvotqd49QaA3ZYw+q0aGp2yXmMjzIuY6fH9j9YFIXY/73yDhMwhX9cPbhWd+AH06NH1Di/LKOuCH0Ubg==} + engines: {node: '>=18'} + hasBin: true + + detective-cjs@6.1.1: + resolution: {integrity: sha512-pSh7mkCKEtLlmANqLu3KDFS3NV8Hx41jy/JF1/gAWOgU+Uo5QTkeI1tWNP4dWGo4L0E9j18Ez9EPsTleautKqA==} + engines: {node: '>=18'} + + detective-es6@5.0.2: + resolution: {integrity: sha512-+qHHGYhjupiVs4rnIpI9nZ5B130A4AmE35ZX1w33hb46vcZ7T3jfDbvmPw0FhWtMHn5BS5HHu7ZtnZ53bMcXZA==} + engines: {node: '>=18'} + + detective-postcss@8.0.4: + resolution: {integrity: sha512-DZ7M/hWPZyr17ZUdoQ+TVXaPj70mYr4XXrAE+GeJbca44haCvZgb191L/jLJmFYewhxRJuBd4lUtNSu986TXag==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4.47 + + detective-sass@6.0.2: + resolution: {integrity: sha512-i3xpXHDKS0qI2aFW4asQ7fqlPK00ndOVZELvQapFJCaF0VxYmsNWtd0AmvXbTLMk7bfO5VdIeorhY9KfmHVoVA==} + engines: {node: '>=18'} + + detective-scss@5.0.2: + resolution: {integrity: sha512-9JOEMZ8pDh3ShXmftq7hoQqqJsClaGgxo1hghfCeFlmKf5TC/Twtwb0PAaK8dXwpg9Z0uCmEYSrCxO+kel2eEg==} + engines: {node: '>=18'} + + detective-stylus@5.0.1: + resolution: {integrity: sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==} + engines: {node: '>=18'} + + detective-typescript@14.1.2: + resolution: {integrity: sha512-bIeEn0eVi/JRsE1YizBR2ilnMlWRAIBJJ6kXCKNFxEEWhUcEY3R6I3KYIAy48ieURbD1hcb3Ebvl8AqeoPMSzg==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 || ^6.0.2 + + detective-vue2@2.3.0: + resolution: {integrity: sha512-3gwbZPqVTm9sL9XdZsgEJ7x4x99O853VVZHapQAiEkGuMJMpFPjHDrecSgfqnS5JW3FJfYXesLZGvUOibjn49g==} + engines: {node: '>=18'} + peerDependencies: + typescript: ^5.4.4 || ^6.0.2 + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.385: + resolution: {integrity: sha512-78sa/M08MNAYHQfjoWMvOlKQqZ0ElhSm/L5HNUc96VZ3b+KvDVnngFm8sYQy0XrhTRgAhggHr5abA7yTvRdo4Q==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + enhanced-resolve@5.24.1: + resolution: {integrity: sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==} + engines: {node: '>=10.13.0'} + + entities@2.1.0: + resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + express-rate-limit@8.5.2: + resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-uri@3.1.3: + resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filing-cabinet@5.5.1: + resolution: {integrity: sha512-PzLBTChlVPn6LnNxF0KWs+XqPziVh3Sfmz/3TXOymHxu6a9yhrDcQn7YwgpcRM6mqhR2WHVGPR8RU4fmcF1IVA==} + engines: {node: '>=18'} + hasBin: true + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + flatbuffers@1.12.0: + resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} + + flatbuffers@24.12.23: + resolution: {integrity: sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==} + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} + engines: {node: '>=18.3.0'} + hasBin: true + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-amd-module-type@6.0.2: + resolution: {integrity: sha512-7zShVYAYtMnj9S65CfN+hvpBCByfuB1OY8xID01nZEzXTZbx4YyysAfi+nMl95JSR6odt4q8TCj2W63KAoyVLQ==} + engines: {node: '>=18'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + 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 + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + 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 + + gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + guid-typescript@1.0.9: + resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hono@4.12.27: + resolution: {integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==} + engines: {node: '>=16.9.0'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-bignum@0.0.3: + resolution: {integrity: sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==} + engines: {node: '>=0.8'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + keytar@7.9.0: + resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + knip@6.24.0: + resolution: {integrity: sha512-PokLlgeEjLh1rAsB7ts+52wZ37HBr1nDhE6NNONwEaXdeZGCJOkP7ZlIAI2Gtu8xohquzTWy75bc/1diI9shQw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + linkify-it@3.0.3: + resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + madge@8.0.0: + resolution: {integrity: sha512-9sSsi3TBPhmkTCIpVQF0SPiChj1L7Rq9kU2KDG1o6v2XH9cCw086MopjVCD+vuoL5v8S77DTbVopTO8OUiQpIw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: ^5.4.4 + peerDependenciesMeta: + typescript: + optional: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + markdown-it@12.3.2: + resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + minipass-flush@1.0.7: + resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + module-definition@6.0.2: + resolution: {integrity: sha512-SvAU3lB0+Yjbq55yHY3wkRZBOh+fhU1SnIF3IFbTewv6mtAh7yUT8ACHAJ2mGIJ7tCes2QuCL/cl6m0JSZ/ArA==} + engines: {node: '>=18'} + hasBin: true + + module-lookup-amd@9.1.3: + resolution: {integrity: sha512-Jc3XmOaR9FdfMJSK8+vyLgsCkzm8z2L0NS6vrlRWi12DjS7MY7TMNE7E1yj8yXx837xtMDbKSSgcdXnFlJ2YLg==} + engines: {node: '>=18'} + hasBin: true + + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} + + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.16: + resolution: {integrity: sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==} + engines: {node: ^18 || >=20} + hasBin: true + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-abi@3.94.0: + resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==} + engines: {node: '>=10'} + + node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + + node-releases@2.0.50: + resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} + engines: {node: '>=18'} + + node-source-walk@7.0.2: + resolution: {integrity: sha512-71kFFjYaSshDTA8/a2HiTYPLdASWjLJxUyJxGE+ffxU+KhxSBtM9kiLUX+R2yooFdSFKMFpi4n3PFtDy6qXv8A==} + engines: {node: '>=18'} + + nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + onnx-proto@4.0.4: + resolution: {integrity: sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==} + + onnxruntime-common@1.14.0: + resolution: {integrity: sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==} + + onnxruntime-node@1.14.0: + resolution: {integrity: sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==} + os: [win32, darwin, linux] + + onnxruntime-web@1.14.0: + resolution: {integrity: sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + oxc-parser@0.137.0: + resolution: {integrity: sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-resolver@11.21.3: + resolution: {integrity: sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-semver@1.1.1: + resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-values-parser@6.0.2: + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + engines: {node: ^10 || ^12 || >=14} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. + hasBin: true + + precinct@12.3.2: + resolution: {integrity: sha512-JbJevI1K80z8e/WIyDt/4vUN/4qcfBSKKqOjJA4mosPPPb7zODKRJQV7YN7apVWN3k58nZYm/vEsLgEGYmnxwg==} + engines: {node: '>=18'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + proc-log@2.0.1: + resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + + protobufjs@6.11.6: + resolution: {integrity: sha512-k8BHqgPBOtrlougZZqF2uUk5Z7bN8f0wj+3e8M3hvtSv0NBAz4VBy5f6R5Nxq/l+i7mRFTgNZb2trxqTpHNY/A==} + hasBin: true + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + + read@1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requirejs-config-file@4.0.0: + resolution: {integrity: sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==} + engines: {node: '>=10.13.0'} + + requirejs@2.3.8: + resolution: {integrity: sha512-7/cTSLOdYkNBNJcDMWf+luFvMriVm7eYxp4BcFCsAX0wF421Vyce5SXP17c+Jd5otXKGNehIonFlyQXSowL6Mw==} + engines: {node: '>=0.4.0'} + hasBin: true + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-dependency-path@4.0.1: + resolution: {integrity: sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ==} + engines: {node: '>=18'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-lookup@6.1.2: + resolution: {integrity: sha512-GjmndmKQBtlPil79RK72L7yc5kDXZPCQeH97bP8R8DcxtXQJO6vECExb3WP/m6+cxaV9h4ZxrSRvCkPG2v/VSw==} + engines: {node: '>=18'} + hasBin: true + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.9.0: + resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} + engines: {node: '>= 0.4'} + + shiki@4.3.0: + resolution: {integrity: sha512-NKKjWzR6LIGL3sXBrWDw9sDS9cxx42/DkysaNqJEeOWE8Kix5gpak0bc00OfDVEO4oyXSyz8+aRaqKoBD1yo7A==} + engines: {node: '>=20'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-git@3.36.0: + resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + smol-toml@1.7.0: + resolution: {integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==} + engines: {node: '>= 18'} + + socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + stylus-lookup@6.1.2: + resolution: {integrity: sha512-O+Q/SJ8s1X2aMLh4213fQ9X/bND9M3dhSsyTRe+O1OXPcewGLiYmAtKCrnP7FDvDBaXB2ZHPkCt3zi4cJXBlCQ==} + engines: {node: '>=18'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + table-layout@4.1.1: + resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} + engines: {node: '>=12.17'} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} + + tar-fs@3.1.3: + resolution: {integrity: sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + deprecated: Old versions of tar 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 + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + tiktoken@1.0.22: + resolution: {integrity: sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tree-sitter-wasms@0.1.13: + resolution: {integrity: sha512-wT+cR6DwaIz80/vho3AvSF0N4txuNx/5bcRKoXouOfClpxh/qqrF4URNLQXbbt8MaAxeksZcZd1j8gcGjc+QxQ==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-graphviz@2.1.6: + resolution: {integrity: sha512-XyLVuhBVvdJTJr2FJJV2L1pc4MwSjMhcunRVgDE9k4wbb2ee7ORYnPewxMWUav12vxyfUM686MSGsqnVRIInuw==} + engines: {node: '>=18'} + + ts-morph@28.0.0: + resolution: {integrity: sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typed-rest-client@1.8.11: + resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@7.3.0: + resolution: {integrity: sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==} + engines: {node: '>=12.17'} + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + unbash@4.0.2: + resolution: {integrity: sha512-8gwNZ29+0/3zmXw7ToIHZtg6wK37xnniRUdBt7B27xZxaxfgR5tGMaGHT0t0dLtBV9fXE7zurh0s6Z1DHVjfWg==} + engines: {node: '>=14'} + + underscore@1.13.8: + resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} + + unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + use-isomorphic-layout-effect@1.2.1: + resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + + walkdir@0.4.1: + resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==} + engines: {node: '>=6.0.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-tree-sitter@0.24.7: + resolution: {integrity: sha512-CdC/TqVFbXqR+C51v38hv6wOPatKEUGxa39scAeFSm98wIhZxAYonhRQPSMmfZ2w7JDI0zQDdzdmgtNk06/krQ==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wordwrapjs@5.1.1: + resolution: {integrity: sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==} + engines: {node: '>=12.17'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + xstate@5.32.4: + resolution: {integrity: sha512-E5WtDB8DBs2ZWliz2Ry9XfbSZTbBRcK/cwefBot04qQ/L5SLP16xpnTDU4/ZFXuXFhNxi7JP2RhuoGwBnM+S4A==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yazl@2.5.1: + resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@aws-sdk/client-bedrock-runtime@3.1079.0': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/credential-provider-node': 3.972.62 + '@aws-sdk/eventstream-handler-node': 3.972.25 + '@aws-sdk/middleware-eventstream': 3.972.21 + '@aws-sdk/middleware-websocket': 3.972.35 + '@aws-sdk/token-providers': 3.1079.0 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/core@3.974.27': + dependencies: + '@aws-sdk/types': 3.973.15 + '@aws-sdk/xml-builder': 3.972.33 + '@aws/lambda-invoke-store': 0.3.0 + '@smithy/core': 3.29.1 + '@smithy/signature-v4': 5.6.2 + '@smithy/types': 4.15.1 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.53': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.972.55': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.972.60': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/credential-provider-env': 3.972.53 + '@aws-sdk/credential-provider-http': 3.972.55 + '@aws-sdk/credential-provider-login': 3.972.59 + '@aws-sdk/credential-provider-process': 3.972.53 + '@aws-sdk/credential-provider-sso': 3.972.59 + '@aws-sdk/credential-provider-web-identity': 3.972.59 + '@aws-sdk/nested-clients': 3.997.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/credential-provider-imds': 4.4.6 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-login@3.972.59': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/nested-clients': 3.997.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-node@3.972.62': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.53 + '@aws-sdk/credential-provider-http': 3.972.55 + '@aws-sdk/credential-provider-ini': 3.972.60 + '@aws-sdk/credential-provider-process': 3.972.53 + '@aws-sdk/credential-provider-sso': 3.972.59 + '@aws-sdk/credential-provider-web-identity': 3.972.59 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/credential-provider-imds': 4.4.6 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-process@3.972.53': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.972.59': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/nested-clients': 3.997.27 + '@aws-sdk/token-providers': 3.1079.0 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-web-identity@3.972.59': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/nested-clients': 3.997.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/eventstream-handler-node@3.972.25': + dependencies: + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-eventstream@3.972.21': + dependencies: + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-websocket@3.972.35': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/signature-v4': 5.6.2 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.997.27': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/signature-v4-multi-region': 3.996.38 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/fetch-http-handler': 5.6.3 + '@smithy/node-http-handler': 4.9.3 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.996.38': + dependencies: + '@aws-sdk/types': 3.973.15 + '@smithy/signature-v4': 5.6.2 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1079.0': + dependencies: + '@aws-sdk/core': 3.974.27 + '@aws-sdk/nested-clients': 3.997.27 + '@aws-sdk/types': 3.973.15 + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/types@3.973.15': + dependencies: + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.33': + dependencies: + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.3.0': {} + + '@azure/abort-controller@2.1.2': + dependencies: + tslib: 2.8.1 + + '@azure/core-auth@1.10.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-client@1.10.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-rest-pipeline@1.24.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@typespec/ts-http-runtime': 0.3.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-tracing@1.3.1': + dependencies: + tslib: 2.8.1 + + '@azure/core-util@1.13.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@typespec/ts-http-runtime': 0.3.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/identity@4.13.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.2 + '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@azure/msal-browser': 5.16.0 + '@azure/msal-node': 5.3.1 + open: 10.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/logger@1.3.0': + dependencies: + '@typespec/ts-http-runtime': 0.3.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/msal-browser@5.16.0': + dependencies: + '@azure/msal-common': 16.11.0 + + '@azure/msal-common@16.11.0': {} + + '@azure/msal-node@5.3.1': + dependencies: + '@azure/msal-common': 16.11.0 + jsonwebtoken: 9.0.3 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@dependents/detective-less@5.0.3': + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.2 + + '@discoveryjs/json-ext@1.1.0': {} + + '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + glob: 8.1.0 + graceful-fs: 4.2.11 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + proc-log: 2.0.1 + semver: 7.8.5 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + + '@electron/rebuild@3.7.2': + dependencies: + '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 + '@malept/cross-spawn-promise': 2.0.0 + chalk: 4.1.2 + debug: 4.4.3 + detect-libc: 2.1.2 + fs-extra: 10.1.0 + got: 11.8.6 + node-abi: 3.94.0 + node-api-version: 0.2.1 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.8.5 + tar: 6.2.1 + yargs: 17.7.3 + transitivePeerDependencies: + - bluebird + - supports-color + + '@emnapi/core@1.11.0': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@gar/promisify@1.1.3': {} + + '@hono/node-server@1.19.14(hono@4.12.27)': + dependencies: + hono: 4.12.27 + + '@huggingface/jinja@0.2.2': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.10 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@lancedb/lancedb-darwin-arm64@0.30.0': + optional: true + + '@lancedb/lancedb-linux-arm64-gnu@0.30.0': + optional: true + + '@lancedb/lancedb-linux-arm64-musl@0.30.0': + optional: true + + '@lancedb/lancedb-linux-x64-gnu@0.30.0': + optional: true + + '@lancedb/lancedb-linux-x64-musl@0.30.0': + optional: true + + '@lancedb/lancedb-win32-arm64-msvc@0.30.0': + optional: true + + '@lancedb/lancedb-win32-x64-msvc@0.30.0': + optional: true + + '@lancedb/lancedb@0.30.0(apache-arrow@18.1.0)': + dependencies: + apache-arrow: 18.1.0 + reflect-metadata: 0.2.2 + optionalDependencies: + '@lancedb/lancedb-darwin-arm64': 0.30.0 + '@lancedb/lancedb-linux-arm64-gnu': 0.30.0 + '@lancedb/lancedb-linux-arm64-musl': 0.30.0 + '@lancedb/lancedb-linux-x64-gnu': 0.30.0 + '@lancedb/lancedb-linux-x64-musl': 0.30.0 + '@lancedb/lancedb-win32-arm64-msvc': 0.30.0 + '@lancedb/lancedb-win32-x64-msvc': 0.30.0 + + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.27) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.0 + express: 5.2.1 + express-rate-limit: 8.5.2(express@5.2.1) + hono: 4.12.27 + jose: 6.2.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)': + dependencies: + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@npmcli/fs@2.1.2': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.8.5 + + '@npmcli/move-file@2.0.1': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + + '@oxc-parser/binding-android-arm-eabi@0.137.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.137.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.137.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.137.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.137.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.137.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.137.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.137.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.137.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.137.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.137.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.137.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.137.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.137.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.137.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.137.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.137.0': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.137.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.137.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.137.0': + optional: true + + '@oxc-project/types@0.137.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.21.3': + optional: true + + '@oxc-resolver/binding-android-arm64@11.21.3': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.21.3': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.21.3': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.21.3': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.21.3': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.21.3': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.21.3': + dependencies: + '@emnapi/core': 1.11.0 + '@emnapi/runtime': 1.11.0 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.21.3': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.21.3': + optional: true + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.1': {} + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + + '@shikijs/core@4.3.0': + dependencies: + '@shikijs/primitive': 4.3.0 + '@shikijs/types': 4.3.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.3.0': + dependencies: + '@shikijs/types': 4.3.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.3.0': + dependencies: + '@shikijs/types': 4.3.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.3.0': + dependencies: + '@shikijs/types': 4.3.0 + + '@shikijs/primitive@4.3.0': + dependencies: + '@shikijs/types': 4.3.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/themes@4.3.0': + dependencies: + '@shikijs/types': 4.3.0 + + '@shikijs/types@4.3.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@simple-git/args-pathspec@1.0.3': {} + + '@simple-git/argv-parser@1.1.1': + dependencies: + '@simple-git/args-pathspec': 1.0.3 + + '@sinclair/typebox@0.27.10': {} + + '@sindresorhus/is@4.6.0': {} + + '@smithy/core@3.29.1': + dependencies: + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.4.6': + dependencies: + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.6.3': + dependencies: + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.9.3': + dependencies: + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@smithy/signature-v4@5.6.2': + dependencies: + '@smithy/core': 3.29.1 + '@smithy/types': 4.15.1 + tslib: 2.8.1 + + '@smithy/types@4.15.1': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.1': {} + + '@ts-graphviz/adapter@2.0.6': + dependencies: + '@ts-graphviz/common': 2.1.5 + + '@ts-graphviz/ast@2.0.7': + dependencies: + '@ts-graphviz/common': 2.1.5 + + '@ts-graphviz/common@2.1.5': {} + + '@ts-graphviz/core@2.0.7': + dependencies: + '@ts-graphviz/ast': 2.0.7 + '@ts-graphviz/common': 2.1.5 + + '@ts-morph/common@0.29.0': + dependencies: + minimatch: 10.2.5 + path-browserify: 1.0.1 + tinyglobby: 0.2.17 + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/better-sqlite3@7.6.13': + dependencies: + '@types/node': 20.19.43 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.2.0 + '@types/keyv': 3.1.4 + '@types/node': 20.19.43 + '@types/responselike': 1.0.3 + + '@types/command-line-args@5.2.3': {} + + '@types/command-line-usage@5.0.4': {} + + '@types/diff@7.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-cache-semantics@4.2.0': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.19.43 + + '@types/long@4.0.2': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@20.19.43': + dependencies: + undici-types: 6.21.0 + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.31)': + dependencies: + '@types/react': 18.3.31 + + '@types/react@18.3.31': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.19.43 + + '@types/unist@3.0.3': {} + + '@types/vscode@1.125.0': {} + + '@typescript-eslint/project-service@8.62.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@5.9.3) + '@typescript-eslint/types': 8.62.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/tsconfig-utils@8.62.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/types@8.62.1': {} + + '@typescript-eslint/typescript-estree@8.62.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.62.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.62.1(typescript@5.9.3) + '@typescript-eslint/types': 8.62.1 + '@typescript-eslint/visitor-keys': 8.62.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.62.1': + dependencies: + '@typescript-eslint/types': 8.62.1 + eslint-visitor-keys: 5.0.1 + + '@typespec/ts-http-runtime@0.3.6': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@ungap/structured-clone@1.3.2': {} + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@20.19.43))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.21(@types/node@20.19.43) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.21 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@vscode/ripgrep-darwin-arm64@1.18.0': + optional: true + + '@vscode/ripgrep-darwin-x64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-arm64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-arm@1.18.0': + optional: true + + '@vscode/ripgrep-linux-ia32@1.18.0': + optional: true + + '@vscode/ripgrep-linux-ppc64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-riscv64@1.18.0': + optional: true + + '@vscode/ripgrep-linux-s390x@1.18.0': + optional: true + + '@vscode/ripgrep-linux-x64@1.18.0': + optional: true + + '@vscode/ripgrep-win32-arm64@1.18.0': + optional: true + + '@vscode/ripgrep-win32-ia32@1.18.0': + optional: true + + '@vscode/ripgrep-win32-x64@1.18.0': + optional: true + + '@vscode/ripgrep@1.18.0': + optionalDependencies: + '@vscode/ripgrep-darwin-arm64': 1.18.0 + '@vscode/ripgrep-darwin-x64': 1.18.0 + '@vscode/ripgrep-linux-arm': 1.18.0 + '@vscode/ripgrep-linux-arm64': 1.18.0 + '@vscode/ripgrep-linux-ia32': 1.18.0 + '@vscode/ripgrep-linux-ppc64': 1.18.0 + '@vscode/ripgrep-linux-riscv64': 1.18.0 + '@vscode/ripgrep-linux-s390x': 1.18.0 + '@vscode/ripgrep-linux-x64': 1.18.0 + '@vscode/ripgrep-win32-arm64': 1.18.0 + '@vscode/ripgrep-win32-ia32': 1.18.0 + '@vscode/ripgrep-win32-x64': 1.18.0 + + '@vscode/vsce-sign-alpine-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-alpine-x64@2.0.6': + optional: true + + '@vscode/vsce-sign-darwin-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-darwin-x64@2.0.6': + optional: true + + '@vscode/vsce-sign-linux-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-linux-arm@2.0.6': + optional: true + + '@vscode/vsce-sign-linux-x64@2.0.6': + optional: true + + '@vscode/vsce-sign-win32-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-win32-x64@2.0.6': + optional: true + + '@vscode/vsce-sign@2.0.9': + optionalDependencies: + '@vscode/vsce-sign-alpine-arm64': 2.0.6 + '@vscode/vsce-sign-alpine-x64': 2.0.6 + '@vscode/vsce-sign-darwin-arm64': 2.0.6 + '@vscode/vsce-sign-darwin-x64': 2.0.6 + '@vscode/vsce-sign-linux-arm': 2.0.6 + '@vscode/vsce-sign-linux-arm64': 2.0.6 + '@vscode/vsce-sign-linux-x64': 2.0.6 + '@vscode/vsce-sign-win32-arm64': 2.0.6 + '@vscode/vsce-sign-win32-x64': 2.0.6 + + '@vscode/vsce@2.32.0': + dependencies: + '@azure/identity': 4.13.1 + '@vscode/vsce-sign': 2.0.9 + azure-devops-node-api: 12.5.0 + chalk: 2.4.2 + cheerio: 1.2.0 + cockatiel: 3.2.1 + commander: 6.2.1 + form-data: 4.0.6 + glob: 7.2.3 + hosted-git-info: 4.1.0 + jsonc-parser: 3.3.1 + leven: 3.1.0 + markdown-it: 12.3.2 + mime: 1.6.0 + minimatch: 3.1.5 + parse-semver: 1.1.1 + read: 1.0.7 + semver: 7.8.5 + tmp: 0.2.7 + typed-rest-client: 1.8.11 + url-join: 4.0.1 + xml2js: 0.5.0 + yauzl: 2.10.0 + yazl: 2.5.1 + optionalDependencies: + keytar: 7.9.0 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.39': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.39 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.39': + dependencies: + '@vue/compiler-core': 3.5.39 + '@vue/shared': 3.5.39 + + '@vue/compiler-sfc@3.5.39': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.39 + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-ssr': 3.5.39 + '@vue/shared': 3.5.39 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.16 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.39': + dependencies: + '@vue/compiler-dom': 3.5.39 + '@vue/shared': 3.5.39 + + '@vue/shared@3.5.39': {} + + '@xenova/transformers@2.17.2': + dependencies: + '@huggingface/jinja': 0.2.2 + onnxruntime-web: 1.14.0 + sharp: 0.32.6 + optionalDependencies: + onnxruntime-node: 1.14.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + '@xstate/react@6.1.0(@types/react@18.3.31)(react@18.3.1)(xstate@5.32.4)': + dependencies: + react: 18.3.1 + use-isomorphic-layout-effect: 1.2.1(@types/react@18.3.31)(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + xstate: 5.32.4 + transitivePeerDependencies: + - '@types/react' + + abbrev@1.1.1: {} + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn-walk@8.3.5: + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + any-promise@1.3.0: {} + + apache-arrow@18.1.0: + dependencies: + '@swc/helpers': 0.5.23 + '@types/command-line-args': 5.2.3 + '@types/command-line-usage': 5.0.4 + '@types/node': 20.19.43 + command-line-args: 5.2.1 + command-line-usage: 7.0.4 + flatbuffers: 24.12.23 + json-bignum: 0.0.3 + tslib: 2.8.1 + + app-module-path@2.2.0: {} + + argparse@2.0.1: {} + + array-back@3.1.0: {} + + array-back@6.2.3: {} + + assertion-error@1.1.0: {} + + ast-module-types@6.0.2: {} + + asynckit@0.4.0: {} + + azure-devops-node-api@12.5.0: + dependencies: + tunnel: 0.0.6 + typed-rest-client: 1.8.11 + + b4a@1.8.1: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + bare-events@2.9.1: {} + + bare-fs@4.7.3: + dependencies: + bare-events: 2.9.1 + bare-path: 3.0.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.5 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-os@3.9.3: {} + + bare-path@3.0.1: + dependencies: + bare-os: 3.9.3 + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + streamx: 2.28.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.5: + dependencies: + bare-path: 3.0.1 + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.10.41: {} + + better-sqlite3@12.11.1: + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.3 + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.0.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.15.3 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + bowser@2.14.1: {} + + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.7: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.4: + dependencies: + baseline-browser-mapping: 2.10.41 + caniuse-lite: 1.0.30001800 + electron-to-chromium: 1.5.385 + node-releases: 2.0.50 + update-browserslist-db: 1.2.3(browserslist@4.28.4) + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + cacache@16.1.3: + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.7 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.2.1 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001800: {} + + ccount@2.0.1: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk-template@0.4.0: + dependencies: + chalk: 4.1.2 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.2.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.28.0 + whatwg-mimetype: 4.0.0 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + + cockatiel@3.2.1: {} + + code-block-writer@13.0.3: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@7.0.4: + dependencies: + array-back: 6.2.3 + chalk-template: 0.4.0 + table-layout: 4.1.1 + typical: 7.3.0 + + commander@12.1.0: {} + + commander@6.2.1: {} + + commander@7.2.0: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.18.1 + rxjs: 7.8.2 + shell-quote: 1.9.0 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.3 + + confbox@0.1.8: {} + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.0.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + csstype@3.2.3: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.29.7 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-extend@0.6.0: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dependency-tree@11.5.0: + dependencies: + '@discoveryjs/json-ext': 1.1.0 + commander: 12.1.0 + filing-cabinet: 5.5.1 + precinct: 12.3.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + detective-amd@6.1.0: + dependencies: + ast-module-types: 6.0.2 + escodegen: 2.1.0 + get-amd-module-type: 6.0.2 + node-source-walk: 7.0.2 + + detective-cjs@6.1.1: + dependencies: + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + + detective-es6@5.0.2: + dependencies: + node-source-walk: 7.0.2 + + detective-postcss@8.0.4(postcss@8.5.16): + dependencies: + is-url-superb: 4.0.0 + postcss: 8.5.16 + postcss-values-parser: 6.0.2(postcss@8.5.16) + + detective-sass@6.0.2: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.2 + + detective-scss@5.0.2: + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 7.0.2 + + detective-stylus@5.0.1: {} + + detective-typescript@14.1.2(typescript@5.9.3): + dependencies: + '@typescript-eslint/typescript-estree': 8.62.1(typescript@5.9.3) + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + detective-vue2@2.3.0(typescript@5.9.3): + dependencies: + '@dependents/detective-less': 5.0.3 + '@vue/compiler-sfc': 3.5.39 + detective-es6: 5.0.2 + detective-sass: 6.0.2 + detective-scss: 5.0.2 + detective-stylus: 5.0.1 + detective-typescript: 14.1.2(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff-sequences@29.6.3: {} + + diff@5.2.2: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.385: {} + + emoji-regex@8.0.0: {} + + encodeurl@2.0.0: {} + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.24.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@2.1.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + entities@7.0.1: {} + + env-paths@2.2.1: {} + + err-code@2.0.3: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-visitor-keys@5.0.1: {} + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + eventsource-parser@3.1.0: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expand-template@2.0.3: {} + + exponential-backoff@3.1.3: {} + + express-rate-limit@8.5.2(express@5.2.1): + dependencies: + express: 5.2.1 + ip-address: 10.2.0 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.3 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-uri@3.1.3: {} + + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + file-uri-to-path@1.0.0: {} + + filing-cabinet@5.5.1: + dependencies: + app-module-path: 2.2.0 + commander: 12.1.0 + enhanced-resolve: 5.24.1 + module-definition: 6.0.2 + module-lookup-amd: 9.1.3 + resolve: 1.22.12 + resolve-dependency-path: 4.0.1 + sass-lookup: 6.1.2 + stylus-lookup: 6.1.2 + tsconfig-paths: 4.2.0 + typescript: 5.9.3 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + + flatbuffers@1.12.0: {} + + flatbuffers@24.12.23: {} + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + formatly@0.3.0: + dependencies: + fd-package-json: 2.0.0 + + forwarded@0.2.0: {} + + framer-motion@12.42.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + motion-dom: 12.42.2 + motion-utils: 12.39.0 + tslib: 2.8.1 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + fresh@2.0.0: {} + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-amd-module-type@6.0.2: + dependencies: + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-own-enumerable-property-symbols@3.0.2: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + get-stream@8.0.1: {} + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-from-package@0.0.0: {} + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.9 + once: 1.4.0 + + gonzales-pe@4.3.0: + dependencies: + minimist: 1.2.8 + + gopd@1.2.0: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + guid-typescript@1.0.9: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hono@4.12.27: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + html-void-elements@3.0.0: {} + + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + + http-cache-semantics@4.2.0: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.1 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + infer-owner@1.0.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ip-address@10.2.0: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.3.4: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-docker@3.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-lambda@1.0.1: {} + + is-obj@1.0.1: {} + + is-promise@4.0.0: {} + + is-regexp@1.0.0: {} + + is-stream@3.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-url-superb@4.0.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + jiti@2.7.0: {} + + jose@6.2.3: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + jsesc@3.1.0: {} + + json-bignum@0.0.3: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + 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.1.1 + ms: 2.1.3 + semver: 7.8.5 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + keytar@7.9.0: + dependencies: + node-addon-api: 4.3.0 + prebuild-install: 7.1.3 + optional: true + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + knip@6.24.0: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + formatly: 0.3.0 + get-tsconfig: 4.14.0 + jiti: 2.7.0 + oxc-parser: 0.137.0 + oxc-resolver: 11.21.3 + picomatch: 4.0.5 + smol-toml: 1.7.0 + strip-json-comments: 5.0.3 + tinyglobby: 0.2.17 + unbash: 4.0.2 + yaml: 2.9.0 + zod: 4.4.3 + + leven@3.1.0: {} + + linkify-it@3.0.3: + dependencies: + uc.micro: 1.0.6 + + local-pkg@0.5.1: + dependencies: + mlly: 1.8.2 + pkg-types: 1.3.1 + + lodash.camelcase@4.3.0: {} + + 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.1.1: {} + + lodash@4.18.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + long@4.0.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lowercase-keys@2.0.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru-cache@7.18.3: {} + + madge@8.0.0(typescript@5.9.3): + dependencies: + chalk: 4.1.2 + commander: 7.2.0 + commondir: 1.0.1 + debug: 4.4.3 + dependency-tree: 11.5.0 + ora: 5.4.1 + pluralize: 8.0.0 + pretty-ms: 7.0.1 + rc: 1.2.8 + stream-to-array: 2.3.0 + ts-graphviz: 2.1.6 + walkdir: 0.4.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-fetch-happen@10.2.1: + dependencies: + agentkeepalive: 4.6.0 + cacache: 16.1.3 + http-cache-semantics: 4.2.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.18.3 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.7 + minipass-pipeline: 1.2.4 + negotiator: 0.6.4 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + + markdown-it@12.3.2: + dependencies: + argparse: 2.0.1 + entities: 2.1.0 + linkify-it: 3.0.3 + mdurl: 1.0.1 + uc.micro: 1.0.6 + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.2 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdurl@1.0.1: {} + + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.7 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.1 + + minimist@1.2.8: {} + + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + + minipass-fetch@2.1.2: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.7: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + mlly@1.8.2: + dependencies: + acorn: 8.17.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + module-definition@6.0.2: + dependencies: + ast-module-types: 6.0.2 + node-source-walk: 7.0.2 + + module-lookup-amd@9.1.3: + dependencies: + commander: 12.1.0 + requirejs: 2.3.8 + requirejs-config-file: 4.0.0 + + motion-dom@12.42.2: + dependencies: + motion-utils: 12.39.0 + + motion-utils@12.39.0: {} + + ms@2.1.3: {} + + mute-stream@0.0.8: {} + + nanoid@3.3.15: {} + + nanoid@5.1.16: {} + + napi-build-utils@2.0.0: {} + + negotiator@0.6.4: {} + + negotiator@1.0.0: {} + + node-abi@3.94.0: + dependencies: + semver: 7.8.5 + + node-addon-api@4.3.0: + optional: true + + node-addon-api@6.1.0: {} + + node-api-version@0.2.1: + dependencies: + semver: 7.8.5 + + node-releases@2.0.50: {} + + node-source-walk@7.0.2: + dependencies: + '@babel/parser': 7.29.7 + + nopt@6.0.0: + dependencies: + abbrev: 1.1.1 + + normalize-url@6.1.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + onnx-proto@4.0.4: + dependencies: + protobufjs: 6.11.6 + + onnxruntime-common@1.14.0: {} + + onnxruntime-node@1.14.0: + dependencies: + onnxruntime-common: 1.14.0 + optional: true + + onnxruntime-web@1.14.0: + 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 + + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + oxc-parser@0.137.0: + dependencies: + '@oxc-project/types': 0.137.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.137.0 + '@oxc-parser/binding-android-arm64': 0.137.0 + '@oxc-parser/binding-darwin-arm64': 0.137.0 + '@oxc-parser/binding-darwin-x64': 0.137.0 + '@oxc-parser/binding-freebsd-x64': 0.137.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.137.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.137.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.137.0 + '@oxc-parser/binding-linux-arm64-musl': 0.137.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.137.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.137.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.137.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.137.0 + '@oxc-parser/binding-linux-x64-gnu': 0.137.0 + '@oxc-parser/binding-linux-x64-musl': 0.137.0 + '@oxc-parser/binding-openharmony-arm64': 0.137.0 + '@oxc-parser/binding-wasm32-wasi': 0.137.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.137.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.137.0 + '@oxc-parser/binding-win32-x64-msvc': 0.137.0 + + oxc-resolver@11.21.3: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.21.3 + '@oxc-resolver/binding-android-arm64': 11.21.3 + '@oxc-resolver/binding-darwin-arm64': 11.21.3 + '@oxc-resolver/binding-darwin-x64': 11.21.3 + '@oxc-resolver/binding-freebsd-x64': 11.21.3 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.21.3 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.21.3 + '@oxc-resolver/binding-linux-arm64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-arm64-musl': 11.21.3 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-riscv64-musl': 11.21.3 + '@oxc-resolver/binding-linux-s390x-gnu': 11.21.3 + '@oxc-resolver/binding-linux-x64-gnu': 11.21.3 + '@oxc-resolver/binding-linux-x64-musl': 11.21.3 + '@oxc-resolver/binding-openharmony-arm64': 11.21.3 + '@oxc-resolver/binding-wasm32-wasi': 11.21.3 + '@oxc-resolver/binding-win32-arm64-msvc': 11.21.3 + '@oxc-resolver/binding-win32-x64-msvc': 11.21.3 + + p-cancelable@2.1.1: {} + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + parse-ms@2.1.0: {} + + parse-semver@1.1.1: + dependencies: + semver: 5.7.2 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-to-regexp@8.4.2: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@1.1.1: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + pkce-challenge@5.0.1: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + platform@1.3.6: {} + + pluralize@8.0.0: {} + + postcss-values-parser@6.0.2(postcss@8.5.16): + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.5.16 + quote-unquote: 1.0.0 + + postcss@8.5.16: + dependencies: + nanoid: 3.3.15 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.94.0 + pump: 3.0.4 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.5 + tunnel-agent: 0.6.0 + + precinct@12.3.2: + dependencies: + '@dependents/detective-less': 5.0.3 + commander: 12.1.0 + detective-amd: 6.1.0 + detective-cjs: 6.1.1 + detective-es6: 5.0.2 + detective-postcss: 8.0.4(postcss@8.5.16) + detective-sass: 6.0.2 + detective-scss: 5.0.2 + detective-stylus: 5.0.1 + detective-typescript: 14.1.2(typescript@5.9.3) + detective-vue2: 2.3.0(typescript@5.9.3) + module-definition: 6.0.2 + node-source-walk: 7.0.2 + postcss: 8.5.16 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + proc-log@2.0.1: {} + + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + property-information@7.2.0: {} + + protobufjs@6.11.6: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.1 + '@types/long': 4.0.2 + '@types/node': 20.19.43 + long: 4.0.0 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + quick-lru@5.1.1: {} + + quote-unquote@1.0.0: {} + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-is@18.3.1: {} + + react-refresh@0.17.0: {} + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-binary-file-arch@1.0.6: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + read@1.0.7: + dependencies: + mute-stream: 0.0.8 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + reflect-metadata@0.2.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requirejs-config-file@4.0.0: + dependencies: + esprima: 4.0.1 + stringify-object: 3.3.0 + + requirejs@2.3.8: {} + + resolve-alpn@1.2.1: {} + + resolve-dependency-path@4.0.1: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retry@0.12.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.62.2: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + run-applescript@7.1.0: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sass-lookup@6.1.2: + dependencies: + commander: 12.1.0 + enhanced-resolve: 5.24.1 + + sax@1.6.0: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + send@1.2.1: + 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.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.3 + semver: 7.8.5 + simple-get: 4.0.1 + tar-fs: 3.1.3 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.9.0: {} + + shiki@4.3.0: + dependencies: + '@shikijs/core': 4.3.0 + '@shikijs/engine-javascript': 4.3.0 + '@shikijs/engine-oniguruma': 4.3.0 + '@shikijs/langs': 4.3.0 + '@shikijs/themes': 4.3.0 + '@shikijs/types': 4.3.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-git@3.36.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.3 + '@simple-git/argv-parser': 1.1.1 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + + smart-buffer@4.2.0: {} + + smol-toml@1.7.0: {} + + socks-proxy-agent@7.0.0: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + socks: 2.8.9 + transitivePeerDependencies: + - supports-color + + socks@2.8.9: + dependencies: + ip-address: 10.2.0 + smart-buffer: 4.2.0 + + source-map-js@1.2.1: {} + + source-map@0.6.1: + optional: true + + space-separated-tokens@2.0.2: {} + + spawn-command@0.0.2: {} + + ssri@9.0.1: + dependencies: + minipass: 3.3.6 + + stackback@0.0.2: {} + + statuses@2.0.2: {} + + std-env@3.10.0: {} + + stream-to-array@2.3.0: + dependencies: + any-promise: 1.3.0 + + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + stringify-object@3.3.0: + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@5.0.3: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + stylus-lookup@6.1.2: + dependencies: + commander: 12.1.0 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + table-layout@4.1.1: + dependencies: + array-back: 6.2.3 + wordwrapjs: 5.1.1 + + tapable@2.3.3: {} + + tar-fs@2.1.5: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.4 + tar-stream: 2.2.0 + + tar-fs@3.1.3: + dependencies: + pump: 3.0.4 + tar-stream: 3.2.0 + optionalDependencies: + bare-fs: 4.7.3 + bare-path: 3.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.3 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + + tiktoken@1.0.22: {} + + tinybench@2.9.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + tmp@0.2.7: {} + + toidentifier@1.0.1: {} + + tree-kill@1.2.2: {} + + tree-sitter-wasms@0.1.13: + optional: true + + trim-lines@3.0.1: {} + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-graphviz@2.1.6: + dependencies: + '@ts-graphviz/adapter': 2.0.6 + '@ts-graphviz/ast': 2.0.7 + '@ts-graphviz/common': 2.1.5 + '@ts-graphviz/core': 2.0.7 + + ts-morph@28.0.0: + dependencies: + '@ts-morph/common': 0.29.0 + code-block-writer: 13.0.3 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tunnel@0.0.6: {} + + type-detect@4.1.0: {} + + type-is@2.1.0: + dependencies: + content-type: 2.0.0 + media-typer: 1.1.0 + mime-types: 3.0.2 + + typed-rest-client@1.8.11: + dependencies: + qs: 6.15.3 + tunnel: 0.0.6 + underscore: 1.13.8 + + typescript@5.9.3: {} + + typical@4.0.0: {} + + typical@7.3.0: {} + + uc.micro@1.0.6: {} + + ufo@1.6.4: {} + + unbash@4.0.2: {} + + underscore@1.13.8: {} + + undici-types@6.21.0: {} + + undici@7.28.0: {} + + unique-filename@2.0.1: + dependencies: + unique-slug: 3.0.0 + + unique-slug@3.0.0: + dependencies: + imurmurhash: 0.1.4 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.4): + dependencies: + browserslist: 4.28.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + url-join@4.0.1: {} + + use-isomorphic-layout-effect@1.2.1(@types/react@18.3.31)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.31 + + use-sync-external-store@1.6.0(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + vary@1.1.2: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-node@1.6.1(@types/node@20.19.43): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.21(@types/node@20.19.43) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.21(@types/node@20.19.43): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.16 + rollup: 4.62.2 + optionalDependencies: + '@types/node': 20.19.43 + fsevents: 2.3.3 + + vitest@1.6.1(@types/node@20.19.43): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.5 + chai: 4.5.0 + debug: 4.4.3 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.21 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.21(@types/node@20.19.43) + vite-node: 1.6.1(@types/node@20.19.43) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.43 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + walk-up-path@4.0.0: {} + + walkdir@0.4.1: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-tree-sitter@0.24.7: + optional: true + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wordwrapjs@5.1.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + xml2js@0.5.0: + dependencies: + sax: 1.6.0 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xstate@5.32.4: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.3: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yazl@2.5.1: + dependencies: + buffer-crc32: 0.2.13 + + yocto-queue@1.2.2: {} + + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} + + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..2cda91e2 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'tools/*' diff --git a/scripts/audit-dead-code.sh b/scripts/audit-dead-code.sh index 6a4f1f55..abe096f7 100755 --- a/scripts/audit-dead-code.sh +++ b/scripts/audit-dead-code.sh @@ -13,4 +13,4 @@ if [[ -x node_modules/.bin/knip ]]; then exec node_modules/.bin/knip --reporter json --no-progress fi -exec npx --yes knip --reporter json --no-progress +exec pnpm exec knip --reporter json --no-progress diff --git a/scripts/audit-dependencies.mjs b/scripts/audit-dependencies.mjs index fd89caca..3c6411ea 100644 --- a/scripts/audit-dependencies.mjs +++ b/scripts/audit-dependencies.mjs @@ -21,10 +21,10 @@ const localBin = process.platform === 'win32' ? 'node_modules\\.bin\\depcheck.cmd' : 'node_modules/.bin/depcheck'; -const command = existsSync(localBin) ? localBin : 'npx'; +const command = existsSync(localBin) ? localBin : 'pnpm'; const args = existsSync(localBin) ? ['--json', `--ignores=${ignores.join(',')}`] - : ['--yes', 'depcheck', '--json', `--ignores=${ignores.join(',')}`]; + : ['dlx', 'depcheck', '--json', `--ignores=${ignores.join(',')}`]; const result = spawnSync(command, args, { cwd: process.cwd(), diff --git a/scripts/bump-version.mjs b/scripts/bump-version.mjs index cf2b3342..6027aefc 100644 --- a/scripts/bump-version.mjs +++ b/scripts/bump-version.mjs @@ -4,7 +4,7 @@ import { spawnSync } from 'child_process'; const ROOT_MAJOR = 2; const shouldStage = process.argv.includes('--stage'); const packagePath = 'package.json'; -const lockPath = 'package-lock.json'; +const lockPath = 'pnpm-lock.yaml'; function readJson(path) { return JSON.parse(readFileSync(path, 'utf8')); @@ -33,17 +33,9 @@ const version = nextVersion(pkg.version); pkg.version = version; writeJson(packagePath, pkg); -if (existsSync(lockPath)) { - const lock = readJson(lockPath); - lock.version = version; - if (lock.packages?.['']) { - lock.packages[''].version = version; - } - writeJson(lockPath, lock); -} - if (shouldStage) { - const result = spawnSync('git', ['add', packagePath, lockPath], { stdio: 'inherit' }); + const paths = [packagePath, ...(existsSync(lockPath) ? [lockPath] : [])]; + const result = spawnSync('git', ['add', ...paths], { stdio: 'inherit' }); if (result.status) process.exit(result.status); } diff --git a/scripts/check-circular-deps.mjs b/scripts/check-circular-deps.mjs index 2aec55b9..637c4761 100755 --- a/scripts/check-circular-deps.mjs +++ b/scripts/check-circular-deps.mjs @@ -5,10 +5,10 @@ import { spawnSync } from 'child_process'; const root = process.argv[2] ? resolve(process.argv[2]) : process.cwd(); const localMadge = resolve(root, 'node_modules/.bin/madge'); -const command = existsSync(localMadge) ? localMadge : 'npx'; +const command = existsSync(localMadge) ? localMadge : 'pnpm'; const args = existsSync(localMadge) ? ['.', '--circular', '--json', '--extensions', 'ts,tsx,js,jsx,mjs,cjs', '--exclude', 'node_modules|dist|out|coverage|\\.git'] - : ['--yes', 'madge', '.', '--circular', '--json', '--extensions', 'ts,tsx,js,jsx,mjs,cjs', '--exclude', 'node_modules|dist|out|coverage|\\.git']; + : ['dlx', 'madge', '.', '--circular', '--json', '--extensions', 'ts,tsx,js,jsx,mjs,cjs', '--exclude', 'node_modules|dist|out|coverage|\\.git']; const result = spawnSync(command, args, { cwd: root, diff --git a/scripts/check-release-assets.mjs b/scripts/check-release-assets.mjs new file mode 100644 index 00000000..54871540 --- /dev/null +++ b/scripts/check-release-assets.mjs @@ -0,0 +1,25 @@ +import { existsSync, readFileSync } from 'fs'; +import { basename } from 'path'; + +const pkg = JSON.parse(readFileSync('package.json', 'utf8')); +const readme = readFileSync('README.md', 'utf8'); + +const requiredAssets = [ + pkg.icon, + 'media/Mitii.png', +].filter(Boolean); + +const missingAssets = requiredAssets.filter((asset) => !existsSync(asset)); +if (missingAssets.length > 0) { + console.error(`Missing release media assets: ${missingAssets.join(', ')}`); + process.exit(1); +} + +const version = String(pkg.version); +if (!readme.includes(`alt="Version ${version}"`) || !readme.includes(`badge/version-${version}-111111`)) { + console.error(`README version badge is out of sync with package.json (${pkg.version}).`); + console.error('Run: pnpm run readme:sync-version'); + process.exit(1); +} + +console.log(`Release assets OK: ${requiredAssets.map((asset) => basename(asset)).join(', ')}; README version ${version}`); diff --git a/scripts/copy-bundled-skills.mjs b/scripts/copy-bundled-skills.mjs new file mode 100644 index 00000000..e55fcc72 --- /dev/null +++ b/scripts/copy-bundled-skills.mjs @@ -0,0 +1,16 @@ +import { cpSync, existsSync, mkdirSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +const root = join(dirname(fileURLToPath(import.meta.url)), '..'); +const source = join(root, 'src/core/skills/bundled'); +const dest = join(root, 'dist/core/skills/bundled'); + +if (!existsSync(source)) { + console.error('Missing bundled skills source:', source); + process.exit(1); +} + +mkdirSync(dirname(dest), { recursive: true }); +cpSync(source, dest, { recursive: true, force: true }); +console.log('Copied bundled skills to', dest); diff --git a/scripts/dev-setup.sh b/scripts/dev-setup.sh new file mode 100755 index 00000000..3b494303 --- /dev/null +++ b/scripts/dev-setup.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." + +editor="${THUNDER_EDITOR:-vscode}" + +echo "Installing dependencies..." +pnpm install + +echo "Compiling extension and webview..." +pnpm run compile + +if [[ "$(uname -s)" == "Darwin" ]]; then + echo "Rebuilding native modules for ${editor}..." + THUNDER_EDITOR="${editor}" pnpm run rebuild:native +else + cat <<'NOTE' +Skipping Electron native rebuild auto-detection on this OS. +Set THUNDER_ELECTRON_VERSION for your editor, then run: + THUNDER_ELECTRON_VERSION= pnpm run rebuild:native +NOTE +fi + +echo "Rebuilding native modules for local Node tests..." +pnpm run rebuild:node + +echo "Setup complete. Press F5 in VS Code to launch the Extension Development Host." diff --git a/scripts/install-recommended-skills.sh b/scripts/install-recommended-skills.sh index f18a89f3..b115df3e 100755 --- a/scripts/install-recommended-skills.sh +++ b/scripts/install-recommended-skills.sh @@ -10,7 +10,7 @@ Mitii now ships bundled skills inside the VS Code extension and copies them into .mitii/skills/ on workspace init. To refresh the committed bundle for maintainers, run: - npm run skills:sync-bundled + pnpm run skills:sync-bundled Or: diff --git a/scripts/rebuild-native.mjs b/scripts/rebuild-native.mjs index bb2c5cdf..bc2098b8 100644 --- a/scripts/rebuild-native.mjs +++ b/scripts/rebuild-native.mjs @@ -1,10 +1,10 @@ #!/usr/bin/env node /** * Rebuild native modules (better-sqlite3) for VS Code / Cursor Electron. - * System `npm install` compiles for Node.js — the extension host uses Electron's ABI. + * A normal install compiles for Node.js; the extension host uses Electron's ABI. * - * Override: THUNDER_ELECTRON_VERSION=42.2.0 npm run rebuild:native - * Override editor: THUNDER_EDITOR=cursor npm run rebuild:native + * Override: THUNDER_ELECTRON_VERSION=42.2.0 pnpm run rebuild:native + * Override editor: THUNDER_EDITOR=cursor pnpm run rebuild:native */ import { execSync, spawnSync } from 'child_process'; import { existsSync } from 'fs'; @@ -60,9 +60,10 @@ function main() { console.log(`Rebuilding native modules for Electron ${electronVersion}…`); const result = spawnSync( - 'npx', + 'pnpm', [ - '@electron/rebuild', + 'exec', + 'electron-rebuild', '-f', '-v', electronVersion, @@ -76,13 +77,13 @@ function main() { if (result.status !== 0) { console.error('\nRebuild failed. Try:'); - console.error(' THUNDER_ELECTRON_VERSION=42.2.0 npm run rebuild:native # VS Code 1.124+'); - console.error(' THUNDER_ELECTRON_VERSION=39.8.1 npm run rebuild:native # Cursor'); + console.error(' THUNDER_ELECTRON_VERSION=42.2.0 pnpm run rebuild:native # VS Code 1.124+'); + console.error(' THUNDER_ELECTRON_VERSION=39.8.1 pnpm run rebuild:native # Cursor'); process.exit(result.status ?? 1); } console.log('\nNative rebuild complete. Reload the Extension Development Host (F5).'); - console.log('Note: run "npm run rebuild:node" before "npm test" if tests fail on sqlite.'); + console.log('Note: run "pnpm run rebuild:node" before CLI eval or "pnpm test" if sqlite fails under Node.'); } main(); diff --git a/scripts/rebuild-node.mjs b/scripts/rebuild-node.mjs new file mode 100644 index 00000000..edfe97d1 --- /dev/null +++ b/scripts/rebuild-node.mjs @@ -0,0 +1,42 @@ +#!/usr/bin/env node +/** + * Rebuild native modules (better-sqlite3) for system Node.js. + * Required for headless CLI eval and Vitest — distinct from Electron (rebuild:native). + */ +import { spawnSync } from 'child_process'; +import { createRequire } from 'module'; +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const require = createRequire(import.meta.url); + +const MODULES = ['better-sqlite3']; + +function moduleDir(name) { + return require.resolve(`${name}/package.json`).replace(/package\.json$/, ''); +} + +function rebuildModule(name) { + const dir = moduleDir(name); + console.log(`Rebuilding ${name} for Node ${process.version}…`); + const result = spawnSync( + 'pnpm', + ['exec', 'node-gyp', 'rebuild', `--directory=${dir}`], + { cwd: packageRoot, stdio: 'inherit', shell: process.platform === 'win32' } + ); + return result.status === 0; +} + +function main() { + for (const name of MODULES) { + if (!rebuildModule(name)) { + console.error(`\nRebuild failed for ${name}.`); + process.exit(1); + } + } + console.log('\nNative rebuild complete for system Node.'); + console.log('Run pnpm run rebuild:native before F5 if the VS Code extension fails to load sqlite.'); +} + +main(); diff --git a/scripts/safe-lint-target.sh b/scripts/safe-lint-target.sh index 786f56a5..53829b55 100644 --- a/scripts/safe-lint-target.sh +++ b/scripts/safe-lint-target.sh @@ -19,7 +19,7 @@ fi if [[ -x node_modules/.bin/eslint ]]; then ESLINT=(node_modules/.bin/eslint) else - ESLINT=(npx --yes eslint) + ESLINT=(pnpm exec eslint) fi "${ESLINT[@]}" --no-eslintrc --no-error-on-unmatched-pattern "$TARGET" diff --git a/scripts/sync-bundled-skills.sh b/scripts/sync-bundled-skills.sh index 62d03406..94d5fd45 100755 --- a/scripts/sync-bundled-skills.sh +++ b/scripts/sync-bundled-skills.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash -# Maintainer utility: refresh bundled-skills/ from a local checkout (no runtime git pull in the extension). +# Maintainer utility: refresh src/core/skills/bundled/ from a local checkout (no runtime git pull in the extension). set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" -DEST_DIR="${MITII_BUNDLED_SKILLS_DIR:-$ROOT_DIR/bundled-skills}" +DEST_DIR="${MITII_BUNDLED_SKILLS_DIR:-$ROOT_DIR/src/core/skills/bundled}" SOURCE_DIR="${AGENT_SKILLS_SOURCE_DIR:-}" usage() { @@ -14,8 +14,8 @@ Usage: AGENT_SKILLS_SOURCE_DIR=/path/to/agent-skills/skills bash scripts/sync-bundled-skills.sh bash scripts/sync-bundled-skills.sh /path/to/agent-skills/skills -Copies the seven Tier-1 SKILL.md folders from addyosmani/agent-skills into bundled-skills/. -Mitii-owned skills (e.g. audit-cleanup) live in bundled-skills/ and are not overwritten. +Copies the seven Tier-1 SKILL.md folders from addyosmani/agent-skills into src/core/skills/bundled/. +Mitii-owned skills (e.g. audit-cleanup) live in src/core/skills/bundled/ and are not overwritten. Does not run at extension runtime — commit the result and ship it in the VSIX. EOF } @@ -58,4 +58,4 @@ for skill in "${SKILLS[@]}"; do echo "Synced $skill" done -echo "Done. bundled-skills now contains $(find "$DEST_DIR" -name SKILL.md | wc -l | tr -d ' ') skill(s)." +echo "Done. src/core/skills/bundled now contains $(find "$DEST_DIR" -name SKILL.md | wc -l | tr -d ' ') skill(s)." diff --git a/scripts/sync-readme-version.mjs b/scripts/sync-readme-version.mjs new file mode 100644 index 00000000..b145793b --- /dev/null +++ b/scripts/sync-readme-version.mjs @@ -0,0 +1,18 @@ +import { readFileSync, writeFileSync } from 'fs'; + +const pkg = JSON.parse(readFileSync('package.json', 'utf8')); +const readmePath = 'README.md'; +const readme = readFileSync(readmePath, 'utf8'); +const version = String(pkg.version); + +const next = readme.replace( + /Version [^/, + `Version ${version}` +); + +if (next === readme) { + throw new Error('Could not find README version badge to update.'); +} + +writeFileSync(readmePath, next, 'utf8'); +console.log(`README version badge synced to ${version}`); diff --git a/src/core/app/ThunderController.ts b/src/core/app/ThunderController.ts index f68ac35a..116f19e8 100644 --- a/src/core/app/ThunderController.ts +++ b/src/core/app/ThunderController.ts @@ -1,8 +1,8 @@ import * as vscode from 'vscode'; import { AGENT_NAME, brandMessage } from '../../shared/brand'; -import { existsSync, statSync } from 'fs'; -import { join } from 'path'; -import { ThunderSession } from '../session/ThunderSession'; +import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'fs'; +import { dirname, join } from 'path'; +import { ThunderSession, type ThunderMode } from '../session/ThunderSession'; import { ConfigService } from '../config/ConfigService'; import { LlmProviderRegistry } from '../llm/LlmProviderRegistry'; import { IndexService } from '../indexing/IndexService'; @@ -39,7 +39,7 @@ import { } from '../tools/builtinTools'; import { ProjectCatalogContextSource, discoverProjectCatalog, saveProjectCatalog } from '../modes/ask'; import { createMarkStepCompleteTool, createProposePlanMutationTool } from '../tools/planTools'; -import type { LlmProvider } from '../llm/types'; +import type { AssistantStreamChunk, LlmProvider } from '../llm/types'; import { UsageTrackingProvider, type ModelCallUsage } from '../llm/UsageTrackingProvider'; import { scaffoldMitiiWorkspace } from '../mcp/scaffoldMitiiWorkspace'; import { AgentTaskState } from '../runtime/AgentTaskState'; @@ -67,6 +67,10 @@ import { isLanceDbAvailable, isMinilmAvailable } from '../indexing/vectorAvailab import type { EmbeddingProvider } from '../indexing/EmbeddingProvider'; import { McpManager } from '../mcp/McpManager'; import { ProjectRulesContextSource, ProjectRulesService } from '../rules/ProjectRulesService'; +import { + ProviderProfilesService, + providerSecretRef, +} from '../providers/ProviderProfilesService'; import { SkillCatalogContextSource, SkillCatalogService } from '../skills/SkillCatalogService'; import { InlineDiffManager } from '../../vscode/inlineDiffManager'; import { testProviderConnection } from '../llm/testConnection'; @@ -95,11 +99,16 @@ import { listCustomMcpServers } from '../mcp/mcpWorkspaceConfig'; import { resolveDbPath } from '../indexing/paths'; import { searchWorkspacePaths, resolvePickedPaths } from '../context/contextPathSearch'; import { createWorkspacePattern, isWorkspaceInVscodeFolders, normalizeWorkspaceRoot, toWorkspaceRelPath } from '../util/paths'; -import { collectCommitMessageInput, generateCommitMessage, type CommitMessageResult } from '../scm'; +import type { CommitMessageResult } from '../scm'; +import { MicroTaskExecutor } from '../microtasks'; +import { AuditPackBuilder } from '../audit'; +import { GitHistoryCollector, generateChangelogEntry, generateReleaseNotes, insertChangelogEntry } from '../release'; +import { collectReviewDiff } from '../scm/ReviewDiffCollector'; import { normalizeAgentSettings, normalizeProviderSettings, normalizeThunderSettings, + validateProviderSettings, resolveAutoContextWindow, } from '../config/ui/mappers'; import type { @@ -111,6 +120,7 @@ import type { } from '../config/ui/payloads'; const log = createLogger('ThunderController'); +const ONBOARDING_STATE_KEY = 'thunder.onboarding.completed.v1'; export type UiUpdateCallback = (partial: Partial) => void; @@ -142,10 +152,12 @@ export class ThunderController { private embeddingProvider: EmbeddingProvider | undefined; private mcpManager = new McpManager(); private projectRulesService: ProjectRulesService | undefined; + private providerProfilesService: ProviderProfilesService | undefined; private skillCatalogService: SkillCatalogService | undefined; private inlineDiffManager: InlineDiffManager | undefined; private researchAgentProvider: LlmProvider | undefined; private sessionLog = new SessionLogService(); + private lastAutoAuditExportSignature = ''; private lastSubagentSnapshot = new Map(); private indexingStatus: IndexingStatus = { indexed: 0, queued: 0, running: false, failed: 0, total: 0, activeWorkers: 0, processed: 0, runTotal: 0 }; private contextToggles: ContextToggles = defaultContextToggles(); @@ -154,6 +166,7 @@ export class ThunderController { private watchDebounceTimer: ReturnType | undefined; private debouncedRebuildRetriever: (() => void) | undefined; private currentPlan: PlanView | null = null; + private currentReviewDiff: WebviewState['reviewDiff'] = null; private agentActivity: import('../../vscode/webview/messages').AgentActivityEntry[] = []; private agentLiveStatus: import('../../vscode/webview/messages').AgentLiveStatusView | null = null; private tokenUsage: Omit = { @@ -176,6 +189,7 @@ export class ThunderController { breakdown: [] as import('../../vscode/webview/messages').TokenUsageBreakdownItem[], }; private uiUpdate: UiUpdateCallback | undefined; + private preservedUiGetter: (() => Partial) | undefined; private autoFixCallback: ((message: string) => Promise) | undefined; private autoFixDepth = 0; private disposed = false; @@ -189,6 +203,8 @@ export class ThunderController { private pendingIndexStatus: IndexingStatus | undefined; private tokenUsageNotifyTimer: ReturnType | undefined; private pendingTokenUsage: TokenUsageView | undefined; + private settingsSaving = false; + private testingConnection = false; constructor(private readonly context: vscode.ExtensionContext) { this.configService = new ConfigService(context); @@ -216,6 +232,22 @@ export class ThunderController { this.uiUpdate = cb; } + setPreservedUiGetter(getter: () => Partial): void { + this.preservedUiGetter = getter; + } + + private getPreservedUiBase(): Partial { + const preserved = this.preservedUiGetter?.() ?? {}; + return { + tab: preserved.tab, + mode: preserved.mode, + messages: preserved.messages, + currentSessionId: preserved.currentSessionId, + chatHistory: preserved.chatHistory, + loading: preserved.loading, + }; + } + setAutoFixCallback(cb: (message: string) => Promise): void { this.autoFixCallback = cb; } @@ -281,6 +313,11 @@ export class ThunderController { private configureSessionLogging(session: ThunderSession, workspace: string): void { const telemetry = this.configService.getConfig().telemetry; this.sessionLog.configure(workspace, session.id, telemetry.sessionLogging, telemetry.debugMetrics); + this.sessionLog.configureWebhook({ + url: telemetry.webhookUrl, + secret: telemetry.webhookSecret || process.env.MITII_TELEMETRY_WEBHOOK_SECRET, + timeoutMs: telemetry.webhookTimeoutMs, + }); this.sessionLog.writeSessionHeader({ mode: session.mode, model: this.configService.getConfig().provider.model, @@ -399,6 +436,7 @@ export class ThunderController { this.diagnosticsService.setWorkspaceRoot(workspace); scaffoldMitiiWorkspace(workspace, { extensionRoot: this.context.extensionPath }); this.projectRulesService = new ProjectRulesService(workspace); + this.providerProfilesService = new ProviderProfilesService(workspace); this.skillCatalogService = new SkillCatalogService(workspace); this.skillCatalogService.refresh(); const retriever = new HybridRetriever( @@ -471,6 +509,7 @@ export class ThunderController { this.diagnosticsService.setWorkspaceRoot(workspace); this.projectRulesService = new ProjectRulesService(workspace); + this.providerProfilesService = new ProviderProfilesService(workspace); this.skillCatalogService = new SkillCatalogService(workspace); this.skillCatalogService.refresh(); this.memoryService = new MemoryService(db, workspace, { @@ -662,6 +701,18 @@ export class ThunderController { ), githubIssueFetchEnabled: config.github.issueFetchEnabled, githubIssueCommentLimit: config.github.issueCommentLimit, + microTaskRoutingEnabled: config.context.microTaskRoutingEnabled, + microTaskExecutorFactory: (provider) => { + if (!ws || !this.gitService) { + throw new Error('Micro-task routing requires an initialized workspace and Git repository.'); + } + return new MicroTaskExecutor({ + workspace: ws, + git: this.gitService, + provider, + sessionLog: this.sessionLog, + }); + }, }); orchestrator.setToolExecutor(this.toolExecutor); orchestrator.setContextPackCallback((pack, views, budget) => { @@ -867,15 +918,10 @@ export class ThunderController { const vscodeFolders = this.getVscodeWorkspaceFolders(); const indexDbPath = workspacePath ? resolveDbPath(workspacePath) : ''; const appVersion = String(this.context.extension.packageJSON.version ?? ''); + const onboardingCompleted = this.context.globalState.get(ONBOARDING_STATE_KEY, false); + const providerConfigured = config.provider.type !== 'echo' || Boolean(apiKey); - const approvals: ApprovalRequestView[] = (this.approvalQueue?.getPending() ?? []).map((r) => ({ - id: r.id, - toolName: r.toolName, - inputPreview: r.inputPreview, - files: r.files, - risk: r.risk, - reason: r.reason, - })); + const approvals: ApprovalRequestView[] = (this.approvalQueue?.getPending() ?? []).map(toApprovalView); return { ...initialWebviewState(), @@ -912,10 +958,17 @@ export class ThunderController { ...this.tokenUsage, contextWindow: config.provider.contextWindow, }, - mode: this.session?.mode ?? 'plan', + mode: base.mode ?? this.session?.mode ?? 'plan', indexing: this.indexingStatus, approvals, plan: this.currentPlan, + reviewDiff: base.reviewDiff ?? this.currentReviewDiff, + onboarding: { + completed: onboardingCompleted, + providerConfigured, + workspaceIndexed: this.indexingStatus.indexed > 0, + shouldShow: !onboardingCompleted && (!providerConfigured || this.indexingStatus.indexed === 0), + }, memories: (this.memoryService?.recent(20) ?? []).map((m) => ({ id: m.id, type: m.type, @@ -934,6 +987,8 @@ export class ThunderController { providerType: config.provider.type, baseUrl: config.provider.baseUrl, model: config.provider.model, + apiVersion: config.provider.apiVersion, + region: config.provider.region, contextWindow: config.provider.contextWindow, indexingEnabled: config.indexing.enabled, approvalMode: config.safety.approvalMode, @@ -992,6 +1047,10 @@ export class ThunderController { actModel: config.agent.actModel, actBaseUrl: config.agent.actBaseUrl, checkpointStrategy: config.agent.checkpointStrategy, + showReasoning: config.ui.showReasoning, + reasoningPreviewMaxChars: config.ui.reasoningPreviewMaxChars, + providerProfiles: this.providerProfilesService?.list() ?? [], + activeProviderProfileId: this.providerProfilesService?.getActiveId() ?? null, }, contextToggles: this.contextToggles, mcpToggles: this.mcpToggles, @@ -1004,9 +1063,26 @@ export class ThunderController { indexDbPath, workspaceNotice: this.workspaceNotice, workspaceTrusted: this.isWorkspaceTrusted(), + settingsSaving: this.settingsSaving, + testingConnection: this.testingConnection, }; } + async refreshReviewDiff(): Promise { + if (!this.gitService?.isGitRepo) { + this.currentReviewDiff = null; + this.notifyUi({ reviewDiff: null }); + return; + } + this.currentReviewDiff = await collectReviewDiff(this.gitService); + this.notifyUi({ reviewDiff: this.currentReviewDiff }); + } + + async completeOnboarding(): Promise { + await this.context.globalState.update(ONBOARDING_STATE_KEY, true); + this.notifyUi({ onboarding: (await this.buildUiState()).onboarding }); + } + private pushActivity( kind: import('../../vscode/webview/messages').AgentActivityEntry['kind'], message: string, @@ -1160,6 +1236,43 @@ export class ThunderController { } getSession(): ThunderSession | undefined { return this.session; } + restoreChatSession(sessionId: string, options: { mode?: ThunderMode } = {}): PlanView | null { + const restoredId = sessionId.trim(); + if (!restoredId) return this.currentPlan; + + const workspace = this.resolveWorkspacePath(); + const mode = options.mode ?? this.session?.mode ?? 'plan'; + const shouldReplace = + !this.session || + this.session.id !== restoredId || + this.session.workspace !== workspace; + + const activeSession = shouldReplace + ? new ThunderSession(workspace, mode, { id: restoredId }) + : this.session; + if (!activeSession) return this.currentPlan; + this.session = activeSession; + activeSession.setMode(mode); + + this.sessionService?.ensureSession(activeSession); + if (workspace) { + this.configureSessionLogging(activeSession, workspace); + } + + this.currentPlan = toPlanView(this.planPersistence?.getActive(restoredId)?.plan); + this.agentLiveStatus = null; + this.agentActivity = []; + this.lastSubagentSnapshot.clear(); + this.notifyUi({ + currentSessionId: restoredId, + mode: activeSession.mode, + plan: this.currentPlan, + agentActivity: [], + agentLiveStatus: null, + subagents: [], + }); + return this.currentPlan; + } getConfigService(): ConfigService { return this.configService; } getProviderRegistry(): LlmProviderRegistry { return this.providerRegistry; } getIndexingStatus(): IndexingStatus { return this.indexingStatus; } @@ -1177,11 +1290,19 @@ export class ThunderController { throw normalizeError(new Error('No Git repository found for this workspace.')); } const provider = this.trackProvider(await this.resolveProviderForMode('ask')); - const input = await collectCommitMessageInput(this.gitService); - if (!input.stagedDiff.trim() && input.unstagedDiff?.trim()) { - throw normalizeError(new Error('Only unstaged changes found. Stage files before generating a commit message.')); - } - return generateCommitMessage(input, provider); + const result = await new MicroTaskExecutor({ + workspace: this.resolveWorkspacePath() ?? '', + git: this.gitService, + provider, + sessionLog: this.sessionLog, + }).execute('commit_message', 'generate commit message'); + const [subject, ...rest] = result.content.split(/\r?\n/); + const body = rest.join('\n').trim() || undefined; + return { + subject: subject || 'chore: update workspace', + body, + fullMessage: body ? `${subject}\n\n${body}` : subject || 'chore: update workspace', + }; } private async resolveProviderForMode(mode: string): Promise { @@ -1191,6 +1312,11 @@ export class ThunderController { if (mode === 'plan') { const planModel = config.agent.planModel?.trim(); if (planModel) { + enforceEnterpriseProviderPolicy( + config.enterprise.localProvidersOnly, + config.agent.planProviderType ?? config.provider.type, + config.agent.planBaseUrl?.trim() || config.provider.baseUrl + ); return this.providerRegistry.resolveFromOptions({ type: config.agent.planProviderType ?? config.provider.type, baseUrl: config.agent.planBaseUrl?.trim() || config.provider.baseUrl, @@ -1206,6 +1332,11 @@ export class ThunderController { if (mode === 'agent') { const actModel = config.agent.actModel?.trim(); if (actModel) { + enforceEnterpriseProviderPolicy( + config.enterprise.localProvidersOnly, + config.agent.actProviderType ?? config.provider.type, + config.agent.actBaseUrl?.trim() || config.provider.baseUrl + ); return this.providerRegistry.resolveFromOptions({ type: config.agent.actProviderType ?? config.provider.type, baseUrl: config.agent.actBaseUrl?.trim() || config.provider.baseUrl, @@ -1222,6 +1353,7 @@ export class ThunderController { if (!active) { throw normalizeError(new Error('No LLM provider configured')); } + enforceEnterpriseProviderPolicy(config.enterprise.localProvidersOnly, config.provider.type, config.provider.baseUrl); return active; } @@ -1471,9 +1603,13 @@ export class ThunderController { async sendMessage( content: string, - recentMessages: Array<{ role: 'user' | 'assistant'; content: string }> = [], - options?: { preserveActivity?: boolean; pinnedContext?: PinnedContextView[] } - ): Promise> { + recentMessages: Array<{ role: 'user' | 'assistant'; content: string; attachments?: import('../../vscode/webview/messages').ChatImageAttachment[] }> = [], + options?: { + preserveActivity?: boolean; + pinnedContext?: PinnedContextView[]; + attachments?: import('../../vscode/webview/messages').ChatImageAttachment[]; + } + ): Promise> { if (!this.session) throw normalizeError(new Error('Session not initialized')); const provider = await this.resolveProviderForMode(this.session.mode); if (!provider) throw normalizeError(new Error('No LLM provider configured')); @@ -1515,6 +1651,7 @@ export class ThunderController { }); return this.chatOrchestrator.send(this.session, meteredProvider, content, recentMessages, { pinnedContext: options?.pinnedContext ?? this.pinnedContext, + attachments: options?.attachments, }); } @@ -1594,6 +1731,7 @@ export class ThunderController { } async reloadWorkspace(options: { autoIndex?: boolean } = { autoIndex: true }): Promise { + const preservedBase = this.getPreservedUiBase(); const vscodeFolder = this.getPrimaryVscodeFolder(); const override = this.configService.getWorkspaceOverride(); if (vscodeFolder && override) { @@ -1615,7 +1753,22 @@ export class ThunderController { : 'none'; this.logWorkspaceResolution(workspace, source); - this.session = new ThunderSession(workspace); + const previousWorkspace = this.session?.workspace; + const preservedSessionId = typeof preservedBase.currentSessionId === 'string' + ? preservedBase.currentSessionId.trim() + : ''; + const canRestoreSessionId = Boolean( + preservedSessionId && + (!previousWorkspace || previousWorkspace === workspace) + ); + this.session = new ThunderSession( + workspace, + preservedBase.mode ?? this.session?.mode ?? 'plan', + canRestoreSessionId ? { id: preservedSessionId } : undefined + ); + const restoredUiBase = canRestoreSessionId + ? preservedBase + : { ...preservedBase, currentSessionId: this.session.id, messages: [] }; if (workspace) { this.configureSessionLogging(this.session, workspace); } @@ -1625,6 +1778,7 @@ export class ThunderController { this.scanner = undefined; this.indexQueue = undefined; this.projectRulesService = undefined; + this.providerProfilesService = undefined; this.indexingStatus = { indexed: 0, queued: 0, running: false, failed: 0, total: 0, activeWorkers: 0, processed: 0, runTotal: 0 }; await this.mcpManager.closeAll(); this.toolRuntime.unregisterByPrefix('mcp__'); @@ -1642,8 +1796,10 @@ export class ThunderController { this.initMinimalChat(workspace); } } + this.sessionService?.ensureSession(this.session); + this.currentPlan = toPlanView(this.planPersistence?.getActive(this.session.id)?.plan); - this.notifyUi(await this.buildUiState()); + this.notifyUi(await this.buildUiState(restoredUiBase)); log.info('Workspace reloaded', { workspace }); if (workspace && options.autoIndex !== false) { void this.maybeAutoIndex(); @@ -1678,9 +1834,52 @@ export class ThunderController { hadError, tools: audit.map((a) => a.toolName), }); + this.sessionLog.append('session_end', hadError ? 'Session completed with issues' : 'Session completed', { + sessionId: this.session?.id, + hadError, + toolCalls: audit.length, + }); + void this.maybeAutoExportAuditPack(hadError); this.notifyUi({ agentActivity: this.agentActivity, agentLiveStatus: null }); } + private async maybeAutoExportAuditPack(hadError: boolean): Promise { + const config = this.configService.getConfig(); + if (!config.enterprise.autoExportAuditPackOnSessionEnd) return; + + const workspace = this.resolveWorkspacePath(); + if (!workspace) return; + const sessionId = this.session?.id ?? 'no-session'; + const logPath = this.sessionLog.getLogPath(); + const signature = `${sessionId}:${logPath}:${this.sessionLog.exportForAnalysis().length}:${this.toolRuntime.getAuditLog().length}`; + if (signature === this.lastAutoAuditExportSignature) return; + this.lastAutoAuditExportSignature = signature; + + try { + const target = join( + workspace, + '.mitii', + 'audit', + `mitii-audit-${sessionId}-${formatTimestampForFile(Date.now())}.zip` + ); + mkdirSync(dirname(target), { recursive: true }); + const pack = this.buildAuditPack(workspace, sessionId, config.enterprise.stripFileContentsFromAuditPacks); + writeFileSync(target, pack.buffer); + this.sessionLog.append('audit_export', 'Audit pack auto-exported', { + path: target, + entries: pack.entries, + redactionReport: pack.redactionReport, + hadError, + automatic: true, + }); + this.pushActivity('info', 'Audit pack saved', target); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + this.sessionLog.append('error', 'Automatic audit pack export failed', { error: message }); + this.pushActivity('error', 'Automatic audit pack export failed', message); + } + } + private buildTurnSummary(audit: import('../tools/types').ToolCallAudit[]): string { const lines: string[] = []; const writes = new Set(); @@ -1758,6 +1957,106 @@ export class ThunderController { } } + async exportAuditPack(): Promise { + const workspace = this.resolveWorkspacePath(); + if (!workspace) { + void vscode.window.showWarningMessage(brandMessage('Open a workspace before exporting an audit pack.')); + return; + } + + const sessionId = this.session?.id ?? 'no-session'; + const defaultUri = vscode.Uri.file(join( + workspace, + `.mitii/audit/mitii-audit-${sessionId}-${formatTimestampForFile(Date.now())}.zip` + )); + const target = await vscode.window.showSaveDialog({ + defaultUri, + filters: { 'Zip archive': ['zip'] }, + title: 'Export Mitii audit pack', + }); + if (!target) return; + + const config = this.configService.getConfig(); + const pack = this.buildAuditPack(workspace, sessionId, config.enterprise.stripFileContentsFromAuditPacks); + + mkdirSync(dirname(target.fsPath), { recursive: true }); + await vscode.workspace.fs.writeFile(target, pack.buffer); + this.sessionLog.append('audit_export', 'Audit pack exported', { + path: target.fsPath, + entries: pack.entries, + redactionReport: pack.redactionReport, + }); + + const revealLabel = platformRevealLabel(); + const choice = await vscode.window.showInformationMessage( + brandMessage(`Audit pack exported: ${target.fsPath}`), + revealLabel + ); + if (choice === revealLabel) { + await vscode.commands.executeCommand('revealFileInOS', target); + } + } + + private buildAuditPack(workspace: string, sessionId: string, stripFileContents: boolean): ReturnType { + const config = this.configService.getConfig(); + return new AuditPackBuilder().build({ + sessionId, + workspace, + extensionVersion: this.context.extension.packageJSON.version ?? '', + model: `${config.provider.type}/${config.provider.model}`, + logPath: this.sessionLog.getLogPath(), + summaryMarkdown: this.sessionLog.exportSummary(), + toolAudit: this.toolRuntime.getAuditLog(), + approvals: this.approvalQueue?.getPending() ?? [], + stripFileContents, + signingKey: process.env.MITII_AUDIT_SIGNING_KEY, + }); + } + + async generateChangelog(): Promise { + const workspace = this.resolveWorkspacePath(); + if (!workspace) { + void vscode.window.showWarningMessage(brandMessage('Open a workspace before generating a changelog.')); + return; + } + const collector = new GitHistoryCollector(workspace); + const latestTag = await collector.getLatestTag(); + const commits = await collector.getCommitsSinceTag(latestTag ?? undefined); + const entry = generateChangelogEntry({ + commits, + version: readPackageVersion(workspace), + date: new Date(), + }); + const doc = await vscode.workspace.openTextDocument({ content: entry, language: 'markdown' }); + await vscode.window.showTextDocument(doc, { preview: false }); + } + + async prepareRelease(): Promise { + const workspace = this.resolveWorkspacePath(); + if (!workspace) { + void vscode.window.showWarningMessage(brandMessage('Open a workspace before preparing a release.')); + return; + } + const collector = new GitHistoryCollector(workspace); + const latestTag = await collector.getLatestTag(); + const commits = await collector.getCommitsSinceTag(latestTag ?? undefined); + const version = readPackageVersion(workspace); + const date = new Date(); + const entry = generateChangelogEntry({ commits, version, date }); + const notes = generateReleaseNotes({ commits, version, date }); + const changelogPath = join(workspace, 'CHANGELOG.md'); + const existing = existsSync(changelogPath) ? readFileSync(changelogPath, 'utf8') : '# Changelog\n\n## [Unreleased]\n'; + writeFileSync(changelogPath, insertChangelogEntry(existing, entry), 'utf8'); + const notesPath = join(workspace, '.mitii', 'release-notes.md'); + mkdirSync(dirname(notesPath), { recursive: true }); + writeFileSync(notesPath, notes, 'utf8'); + void vscode.window.showInformationMessage( + brandMessage(`Prepared release ${version}. Updated CHANGELOG.md and .mitii/release-notes.md.`) + ); + const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(notesPath)); + await vscode.window.showTextDocument(doc, { preview: false }); + } + async openSessionLog(): Promise { const logPath = this.sessionLog.getLogPath(); if (!logPath) { @@ -1801,7 +2100,7 @@ export class ThunderController { return this.chatOrchestrator?.hasSuspendState() ?? false; } - resumeAfterApproval(): AsyncIterable { + resumeAfterApproval(): AsyncIterable { this.ensureChatOrchestrator(); if (!this.chatOrchestrator) { return (async function* empty() {})(); @@ -1960,11 +2259,16 @@ export class ThunderController { } async testProviderConnection(settings?: ProviderSettingsPayload): Promise { + this.testingConnection = true; + this.notifyUi({ testingConnection: true }); + try { const config = this.configService.getConfig(); const apiKey = await this.configService.getApiKey(); const providerType = settings?.providerType ?? config.provider.type; const baseUrl = settings?.baseUrl.trim() || config.provider.baseUrl; const model = settings?.model.trim() || config.provider.model; + const apiVersion = settings?.apiVersion?.trim() || config.provider.apiVersion; + const region = settings?.region?.trim() || config.provider.region; const requestedContextWindow = settings?.contextWindow ? Math.max(1024, Math.min(settings.contextWindow, 1_000_000)) : config.provider.contextWindow; @@ -1974,6 +2278,31 @@ export class ThunderController { requestedContextWindow, config.provider.contextWindow ); + const validation = validateProviderSettings({ + providerType, + baseUrl, + model, + apiVersion, + region, + contextWindow, + } as ProviderSettingsPayload); + if (!validation.ok) { + this.notifyUi({ + settings: { + ...(await this.buildUiState()).settings, + providerType, + baseUrl, + model, + apiVersion, + region, + contextWindow, + connectionOk: false, + connectionStatus: validation.errors.join(' '), + }, + testingConnection: false, + }); + return; + } if (providerType === 'echo') { this.notifyUi({ @@ -1982,10 +2311,13 @@ export class ThunderController { providerType, baseUrl, model, + apiVersion, + region, contextWindow, connectionOk: true, connectionStatus: 'Echo mode — no LLM needed. Responses are mirrored for UI testing.', }, + testingConnection: false, }); return; } @@ -1994,7 +2326,9 @@ export class ThunderController { providerType as import('../config/schema').ProviderType, baseUrl, model, - apiKey + apiKey, + apiVersion, + region ); this.notifyUi({ @@ -2003,15 +2337,22 @@ export class ThunderController { providerType, baseUrl, model, + apiVersion, + region, contextWindow, connectionOk: result.ok, connectionStatus: result.message, }, + testingConnection: false, }); if (!result.ok) { void vscode.window.showErrorMessage(`${AGENT_NAME}: ${result.message}`); } + } finally { + this.testingConnection = false; + this.notifyUi({ testingConnection: false }); + } } async saveApiKey(key: string): Promise { @@ -2030,6 +2371,18 @@ export class ThunderController { } async saveProviderSettings(settings: ProviderSettingsPayload): Promise { + const validation = validateProviderSettings(settings); + if (!validation.ok) { + void vscode.window.showErrorMessage(`${AGENT_NAME}: ${validation.errors.join(' ')}`); + this.notifyUi({ + settings: { + ...(await this.buildUiState()).settings, + connectionOk: false, + connectionStatus: validation.errors.join(' '), + }, + }); + return; + } await this.configService.updateProviderSettings( normalizeProviderSettings(settings, this.configService.getConfig().provider.contextWindow) ); @@ -2075,6 +2428,9 @@ export class ThunderController { } async saveAllSettings(settings: ThunderSettingsPayload): Promise { + this.settingsSaving = true; + this.notifyUi({ settingsSaving: true }); + try { const beforeConfig = this.configService.getConfig(); const normalized = normalizeThunderSettings(settings, beforeConfig.provider.contextWindow, this.mcpToggles); @@ -2132,6 +2488,88 @@ export class ThunderController { }); void vscode.window.showInformationMessage(brandMessage('Settings saved.')); } + } finally { + this.settingsSaving = false; + this.notifyUi({ + ...(await this.buildUiState(this.getPreservedUiBase())), + settingsSaving: false, + }); + } + } + + async saveProviderProfile(options: { + id?: string; + name?: string; + settings: ProviderSettingsPayload; + apiKey?: string; + }): Promise { + const workspace = this.resolveWorkspacePath(); + if (!workspace) { + throw new Error('Open a workspace to save provider profiles under .mitii/providers.'); + } + const validation = validateProviderSettings(options.settings); + if (!validation.ok) { + throw new Error(validation.errors.join(' ')); + } + + if (!this.providerProfilesService) { + this.providerProfilesService = new ProviderProfilesService(workspace); + } + + const profile = this.providerProfilesService.upsert(options.settings, { + id: options.id, + name: options.name, + apiKey: options.apiKey, + }); + + if (options.apiKey?.trim()) { + await this.configService.setApiKey(options.apiKey.trim(), providerSecretRef(profile.id)); + } + + await this.applyProviderProfile(profile.id); + } + + async selectProviderProfile(id: string): Promise { + await this.applyProviderProfile(id); + } + + async deleteProviderProfile(id: string): Promise { + const workspace = this.resolveWorkspacePath(); + if (!workspace || !this.providerProfilesService) return; + this.providerProfilesService.delete(id); + await this.configService.deleteApiKey(providerSecretRef(id)); + this.notifyUi({ settings: (await this.buildUiState(this.getPreservedUiBase())).settings }); + } + + private async applyProviderProfile(id: string): Promise { + const workspace = this.resolveWorkspacePath(); + if (!workspace) return; + + if (!this.providerProfilesService) { + this.providerProfilesService = new ProviderProfilesService(workspace); + } + + const profile = this.providerProfilesService.setActive(id); + if (!profile) return; + + await this.configService.updateProviderSettings({ + providerType: profile.providerType, + baseUrl: profile.baseUrl, + model: profile.model, + apiVersion: profile.apiVersion, + region: profile.region, + contextWindow: profile.contextWindow, + }); + + const config = this.configService.getConfig(); + const apiKey = profile.hasApiKey + ? await this.configService.getApiKey(providerSecretRef(profile.id)) + : await this.configService.getApiKey(); + await this.providerRegistry.resolveFromConfig(config.provider, apiKey); + await this.refreshResearchAgentProvider(); + this.chatOrchestrator?.configure({ researchAgentProvider: this.researchAgentProvider }); + this.debouncedRebuildRetriever?.(); + this.notifyUi({ settings: (await this.buildUiState(this.getPreservedUiBase())).settings }); } private async reloadMcpServers(): Promise { @@ -2147,6 +2585,7 @@ export class ThunderController { filesystem: builtin.filesystem, memory: builtin.memory, sequentialThinking: builtin.sequentialThinking, + puppeteer: builtin.puppeteer ?? false, }; } @@ -2333,7 +2772,7 @@ export class ThunderController { } } -function toApprovalView(r: import('../safety/ApprovalQueue').ApprovalRequest): ApprovalRequestView { +export function toApprovalView(r: import('../safety/ApprovalQueue').ApprovalRequest): ApprovalRequestView { return { id: r.id, toolName: r.toolName, @@ -2348,6 +2787,24 @@ function toApprovalView(r: import('../safety/ApprovalQueue').ApprovalRequest): A }; } +function toPlanView(plan: import('../plans/PlanActEngine').ThunderPlan | null | undefined): PlanView | null { + if (!plan) return null; + const stepStatus = new Map(plan.steps.map((step) => [step.id, step.status])); + return { + ...plan, + steps: plan.steps.map((step) => ({ ...step })), + phases: plan.phases?.map((phase) => ({ + id: phase.id, + title: phase.title, + phase: phase.phase, + steps: phase.steps.map((step) => ({ + ...step, + status: stepStatus.get(step.id) ?? 'pending', + })), + })), + }; +} + function normalizePromptBreakdown( breakdown: TokenUsageBreakdownItem[], promptTokens: number @@ -2369,3 +2826,36 @@ function normalizePromptBreakdown( }, ]; } + +function readPackageVersion(workspace: string): string { + try { + const pkg = JSON.parse(readFileSync(join(workspace, 'package.json'), 'utf8')) as { version?: string }; + return pkg.version ?? '0.0.0'; + } catch { + return '0.0.0'; + } +} + +function formatTimestampForFile(ts: number): string { + const d = new Date(ts); + const pad = (n: number) => String(n).padStart(2, '0'); + return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}_${pad(d.getHours())}-${pad(d.getMinutes())}-${pad(d.getSeconds())}`; +} + +function platformRevealLabel(): string { + if (process.platform === 'darwin') return 'Reveal in Finder'; + if (process.platform === 'win32') return 'Reveal in Explorer'; + return 'Reveal in File Manager'; +} + +function enforceEnterpriseProviderPolicy(localOnly: boolean, providerType: string, baseUrl: string): void { + if (!localOnly) return; + const url = baseUrl.trim().toLowerCase(); + const localUrl = /^(http:\/\/)?(localhost|127\.0\.0\.1|0\.0\.0\.0)(?::|\/|$)/.test(url) || + url.startsWith('http://[::1]'); + if (providerType === 'echo') return; + if (providerType === 'openai-compatible' && localUrl) return; + throw normalizeError(new Error( + 'Enterprise local-providers-only policy is enabled. Choose Echo or a localhost OpenAI-compatible provider.' + )); +} diff --git a/src/core/audit/AuditPackBuilder.ts b/src/core/audit/AuditPackBuilder.ts new file mode 100644 index 00000000..e98610f6 --- /dev/null +++ b/src/core/audit/AuditPackBuilder.ts @@ -0,0 +1,302 @@ +import { existsSync, readFileSync } from 'fs'; +import { createHmac, createHash } from 'crypto'; +import { basename } from 'path'; +import type { ToolCallAudit } from '../tools/types'; + +export interface AuditPackManifest { + sessionId: string; + workspace: string; + extensionVersion: string; + model?: string; + createdAt: string; + logPath?: string; + eventCount: number; +} + +export interface AuditPackInput { + sessionId: string; + workspace: string; + extensionVersion: string; + model?: string; + logPath?: string; + summaryMarkdown: string; + toolAudit?: ToolCallAudit[]; + approvals?: unknown[]; + stripFileContents?: boolean; + signingKey?: string; +} + +export interface AuditPackBuildResult { + buffer: Buffer; + manifest: AuditPackManifest; + redactionReport: RedactionReport; + entries: string[]; +} + +export interface RedactionReport { + secretKeyRedactions: number; + longValueTruncations: number; + fileContentStrips: number; +} + +export class AuditPackBuilder { + build(input: AuditPackInput): AuditPackBuildResult { + const report: RedactionReport = { + secretKeyRedactions: 0, + longValueTruncations: 0, + fileContentStrips: 0, + }; + const sessionJsonl = input.logPath && existsSync(input.logPath) + ? sanitizeJsonl(readFileSync(input.logPath, 'utf8'), report, input.stripFileContents) + : ''; + const eventCount = sessionJsonl.trim() ? sessionJsonl.trim().split(/\r?\n/).length : 0; + const manifest: AuditPackManifest = { + sessionId: input.sessionId, + workspace: input.workspace, + extensionVersion: input.extensionVersion, + model: input.model, + createdAt: new Date().toISOString(), + logPath: input.logPath ? basename(input.logPath) : undefined, + eventCount, + }; + const files: Record = { + 'session.jsonl': sessionJsonl, + 'summary.md': input.summaryMarkdown, + 'manifest.json': JSON.stringify(manifest, null, 2), + 'tool-audit.json': JSON.stringify(sanitizeValue(input.toolAudit ?? [], report, input.stripFileContents), null, 2), + 'approvals.json': JSON.stringify(sanitizeValue(input.approvals ?? [], report, input.stripFileContents), null, 2), + 'redaction-report.json': JSON.stringify(report, null, 2), + }; + files['signature.json'] = JSON.stringify(createSignature(hashFiles(files), input.signingKey), null, 2); + return { + buffer: createZip(files), + manifest, + redactionReport: report, + entries: Object.keys(files), + }; + } +} + +export interface AuditSignature { + algorithm: 'sha256' | 'hmac-sha256'; + createdAt: string; + signedFiles: Record; + signature: string; +} + +export interface AuditVerificationResult { + ok: boolean; + errors: string[]; + entries: string[]; +} + +export function verifyAuditPack(buffer: Buffer, signingKey?: string): AuditVerificationResult { + const entries = readZipEntries(buffer); + const signatureText = entries['signature.json']; + if (!signatureText) { + return { ok: false, errors: ['signature.json is missing'], entries: Object.keys(entries) }; + } + const errors: string[] = []; + let signature: AuditSignature; + try { + signature = JSON.parse(signatureText) as AuditSignature; + } catch { + return { ok: false, errors: ['signature.json is malformed'], entries: Object.keys(entries) }; + } + + for (const [name, expectedHash] of Object.entries(signature.signedFiles ?? {})) { + const content = entries[name]; + if (content === undefined) { + errors.push(`${name} is missing`); + continue; + } + const actualHash = sha256(content); + if (actualHash !== expectedHash) { + errors.push(`${name} hash mismatch`); + } + } + + const expectedSignature = createSignature(signature.signedFiles, signingKey).signature; + if (signature.signature !== expectedSignature) { + errors.push('signature mismatch'); + } + + return { ok: errors.length === 0, errors, entries: Object.keys(entries) }; +} + +function createSignature(fileHashes: Record, signingKey?: string): AuditSignature { + const canonical = JSON.stringify(Object.keys(fileHashes).sort().map((name) => [name, fileHashes[name]])); + const key = signingKey || ''; + return { + algorithm: key ? 'hmac-sha256' : 'sha256', + createdAt: new Date().toISOString(), + signedFiles: fileHashes, + signature: key + ? createHmac('sha256', key).update(canonical).digest('hex') + : sha256(canonical), + }; +} + +function hashFiles(files: Record): Record { + return Object.fromEntries( + Object.entries(files).map(([name, content]) => [name, sha256(content)]) + ); +} + +function sha256(content: string | Buffer): string { + return createHash('sha256').update(content).digest('hex'); +} + +function sanitizeJsonl(jsonl: string, report: RedactionReport, stripFileContents = false): string { + return jsonl + .split(/\r?\n/) + .filter(Boolean) + .map((line) => { + try { + return JSON.stringify(sanitizeValue(JSON.parse(line), report, stripFileContents)); + } catch { + return '[malformed log line omitted]'; + } + }) + .join('\n') + (jsonl.trim() ? '\n' : ''); +} + +function sanitizeValue(value: unknown, report: RedactionReport, stripFileContents = false): unknown { + if (Array.isArray(value)) return value.map((item) => sanitizeValue(item, report, stripFileContents)); + if (typeof value === 'string') { + if (looksLikeSecret(value)) { + report.secretKeyRedactions += 1; + return '[REDACTED]'; + } + if (value.length > 8000) { + report.longValueTruncations += 1; + return `${value.slice(0, 8000)}... [truncated ${value.length - 8000} chars]`; + } + return value; + } + if (!value || typeof value !== 'object') return value; + const out: Record = {}; + for (const [key, nested] of Object.entries(value as Record)) { + if (shouldRedactKey(key)) { + report.secretKeyRedactions += 1; + out[key] = '[REDACTED]'; + } else if (stripFileContents && /^(content|fileContent|output|outputPreview)$/i.test(key) && typeof nested === 'string') { + report.fileContentStrips += 1; + out[key] = `[stripped ${nested.length} chars]`; + } else { + out[key] = sanitizeValue(nested, report, stripFileContents); + } + } + return out; +} + +function shouldRedactKey(key: string): boolean { + const lower = key.toLowerCase(); + return lower.includes('apikey') || + lower.includes('api_key') || + lower === 'authorization' || + lower.includes('secret') || + lower.includes('password') || + lower === 'token' || + lower === 'accesstoken' || + lower === 'refreshtoken'; +} + +function looksLikeSecret(value: string): boolean { + return /\b(sk-[A-Za-z0-9_-]{12,}|ghp_[A-Za-z0-9_]{20,}|Bearer\s+[A-Za-z0-9._-]{16,})\b/.test(value); +} + +function createZip(files: Record): Buffer { + const localParts: Buffer[] = []; + const centralParts: Buffer[] = []; + let offset = 0; + + for (const [name, content] of Object.entries(files)) { + const nameBuf = Buffer.from(name.replace(/\\/g, '/')); + const data = Buffer.from(content, 'utf8'); + const crc = crc32(data); + const local = Buffer.alloc(30); + local.writeUInt32LE(0x04034b50, 0); + local.writeUInt16LE(20, 4); + local.writeUInt16LE(0, 6); + local.writeUInt16LE(0, 8); + local.writeUInt16LE(0, 10); + local.writeUInt16LE(0, 12); + local.writeUInt32LE(crc, 14); + local.writeUInt32LE(data.length, 18); + local.writeUInt32LE(data.length, 22); + local.writeUInt16LE(nameBuf.length, 26); + local.writeUInt16LE(0, 28); + localParts.push(local, nameBuf, data); + + const central = Buffer.alloc(46); + central.writeUInt32LE(0x02014b50, 0); + central.writeUInt16LE(20, 4); + central.writeUInt16LE(20, 6); + central.writeUInt16LE(0, 8); + central.writeUInt16LE(0, 10); + central.writeUInt16LE(0, 12); + central.writeUInt16LE(0, 14); + central.writeUInt32LE(crc, 16); + central.writeUInt32LE(data.length, 20); + central.writeUInt32LE(data.length, 24); + central.writeUInt16LE(nameBuf.length, 28); + central.writeUInt16LE(0, 30); + central.writeUInt16LE(0, 32); + central.writeUInt16LE(0, 34); + central.writeUInt16LE(0, 36); + central.writeUInt32LE(0, 38); + central.writeUInt32LE(offset, 42); + centralParts.push(central, nameBuf); + offset += local.length + nameBuf.length + data.length; + } + + const centralDir = Buffer.concat(centralParts); + const end = Buffer.alloc(22); + end.writeUInt32LE(0x06054b50, 0); + end.writeUInt16LE(0, 4); + end.writeUInt16LE(0, 6); + end.writeUInt16LE(Object.keys(files).length, 8); + end.writeUInt16LE(Object.keys(files).length, 10); + end.writeUInt32LE(centralDir.length, 12); + end.writeUInt32LE(offset, 16); + end.writeUInt16LE(0, 20); + return Buffer.concat([...localParts, centralDir, end]); +} + +function readZipEntries(buffer: Buffer): Record { + const entries: Record = {}; + let offset = 0; + while (offset + 30 <= buffer.length && buffer.readUInt32LE(offset) === 0x04034b50) { + const compressionMethod = buffer.readUInt16LE(offset + 8); + const compressedSize = buffer.readUInt32LE(offset + 18); + const fileNameLength = buffer.readUInt16LE(offset + 26); + const extraLength = buffer.readUInt16LE(offset + 28); + const nameStart = offset + 30; + const dataStart = nameStart + fileNameLength + extraLength; + const dataEnd = dataStart + compressedSize; + if (dataEnd > buffer.length) break; + const name = buffer.slice(nameStart, nameStart + fileNameLength).toString('utf8'); + if (compressionMethod === 0) { + entries[name] = buffer.slice(dataStart, dataEnd).toString('utf8'); + } + offset = dataEnd; + } + return entries; +} + +function crc32(buffer: Buffer): number { + let crc = 0xffffffff; + for (const byte of buffer) { + crc = (crc >>> 8) ^ CRC_TABLE[(crc ^ byte) & 0xff]; + } + return (crc ^ 0xffffffff) >>> 0; +} + +const CRC_TABLE = Array.from({ length: 256 }, (_, n) => { + let c = n; + for (let k = 0; k < 8; k++) { + c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; + } + return c >>> 0; +}); diff --git a/src/core/audit/index.ts b/src/core/audit/index.ts new file mode 100644 index 00000000..a47e15e9 --- /dev/null +++ b/src/core/audit/index.ts @@ -0,0 +1,2 @@ +export * from './AuditPackBuilder'; + diff --git a/src/core/config/schema.ts b/src/core/config/schema.ts index cdb12cf3..194d35ac 100644 --- a/src/core/config/schema.ts +++ b/src/core/config/schema.ts @@ -2,7 +2,10 @@ import { z } from 'zod'; export const ProviderTypeSchema = z.enum([ 'openai-compatible', + 'openrouter', 'openai', + 'azure-openai', + 'bedrock', 'anthropic', 'gemini', 'deepseek', @@ -15,11 +18,15 @@ export const ProviderConfigSchema = z.object({ type: ProviderTypeSchema.default('echo'), baseUrl: z.string().url().default('http://localhost:11434/v1'), model: z.string().default('qwen3-coder:30b'), + apiVersion: z.string().default('2024-10-21'), + region: z.string().default('us-east-1'), apiKeyRef: z.string().default('thunder.apiKey'), contextWindow: z.number().int().positive().default(8192), supportsStreaming: z.boolean().default(true), supportsTools: z.boolean().default(true), supportsEmbeddings: z.boolean().default(false), + supportsVision: z.boolean().optional(), + supportsReasoning: z.boolean().optional(), }); export const EmbeddingProviderSchema = z.enum(['hash', 'minilm']).default('minilm'); @@ -43,6 +50,18 @@ export const ContextConfigSchema = z.object({ rerankerEnabled: z.boolean().default(true), rerankerCandidatePool: z.number().int().min(5).max(50).default(20), rerankerTopK: z.number().int().min(3).max(30).default(8), + microTaskRoutingEnabled: z.boolean().default(true), +}); + +export const UiConfigSchema = z.object({ + showReasoning: z.boolean().default(true), + reasoningPreviewMaxChars: z.number().int().min(0).max(100_000).default(8000), +}); + +export const EnterpriseConfigSchema = z.object({ + localProvidersOnly: z.boolean().default(false), + stripFileContentsFromAuditPacks: z.boolean().default(false), + autoExportAuditPackOnSessionEnd: z.boolean().default(false), }); export const AgentDepthSchema = z.enum(['auto', 'quick', 'standard', 'deep', 'pilot', 'enterprise']); @@ -121,6 +140,7 @@ export const BuiltinMcpTogglesSchema = z.object({ filesystem: z.boolean().default(true), memory: z.boolean().default(true), sequentialThinking: z.boolean().default(true), + puppeteer: z.boolean().default(false), }); export const McpConfigSchema = z.object({ @@ -149,6 +169,9 @@ export const TelemetryConfigSchema = z.object({ sessionLogging: z.boolean().default(true), /** Extra diagnostics: tool inputs, context sources, LLM step metadata. Off by default for speed. */ debugMetrics: z.boolean().default(false), + webhookUrl: z.string().default(''), + webhookSecret: z.string().default(''), + webhookTimeoutMs: z.number().int().min(1000).max(60_000).default(5000), }); export const ThunderConfigSchema = z.object({ @@ -164,6 +187,8 @@ export const ThunderConfigSchema = z.object({ scm: ScmConfigSchema.default({}), github: GitHubConfigSchema.default({}), telemetry: TelemetryConfigSchema.default({}), + ui: UiConfigSchema.default({}), + enterprise: EnterpriseConfigSchema.default({}), }); export type ProviderType = z.infer; @@ -172,6 +197,8 @@ export type EmbeddingProviderKind = z.infer; export type VectorBackendKind = z.infer; export type IndexingConfig = z.infer; export type ContextConfig = z.infer; +export type UiConfig = z.infer; +export type EnterpriseConfig = z.infer; export type SafetyConfig = z.infer; export type MemoryConfig = z.infer; export type AgentDepth = z.infer; diff --git a/src/core/config/ui/mappers.ts b/src/core/config/ui/mappers.ts index 4545c4e1..3e226961 100644 --- a/src/core/config/ui/mappers.ts +++ b/src/core/config/ui/mappers.ts @@ -23,7 +23,7 @@ export function normalizeProviderSettings( previousContextWindow: number ): ProviderSettingsPayload { const model = settings.model.trim(); - return { + const normalized: ProviderSettingsPayload = { providerType: settings.providerType, baseUrl: settings.baseUrl.trim(), model, @@ -34,6 +34,53 @@ export function normalizeProviderSettings( previousContextWindow ), }; + if (settings.apiVersion !== undefined) { + normalized.apiVersion = settings.apiVersion.trim(); + } + if (settings.region !== undefined) { + normalized.region = settings.region.trim(); + } + return normalized; +} + +export interface ProviderValidationResult { + ok: boolean; + errors: string[]; +} + +export function validateProviderSettings(settings: ProviderSettingsPayload): ProviderValidationResult { + const errors: string[] = []; + const providerType = settings.providerType; + const baseUrl = settings.baseUrl.trim(); + const model = settings.model.trim(); + + if (providerType !== 'echo' && !baseUrl) { + errors.push('API base URL is required.'); + } + if (providerType !== 'echo' && baseUrl) { + try { + const url = new URL(baseUrl); + if (!['http:', 'https:'].includes(url.protocol)) { + errors.push('API base URL must use http or https.'); + } + } catch { + errors.push('API base URL must be a valid URL.'); + } + } + if (!model) { + errors.push(providerType === 'azure-openai' ? 'Azure deployment name is required.' : 'Model is required.'); + } + if (providerType === 'azure-openai' && !settings.apiVersion?.trim()) { + errors.push('Azure API version is required.'); + } + if (providerType === 'bedrock' && !settings.region?.trim()) { + errors.push('AWS region is required.'); + } + if (!Number.isFinite(settings.contextWindow) || settings.contextWindow < 1024) { + errors.push('Context window must be at least 1024 tokens.'); + } + + return { ok: errors.length === 0, errors }; } export function normalizeAgentSettings(settings: AgentSettingsPayload): AgentSettingsPayload { diff --git a/src/core/config/ui/payloads.ts b/src/core/config/ui/payloads.ts index 3f9c1a00..b524f2a8 100644 --- a/src/core/config/ui/payloads.ts +++ b/src/core/config/ui/payloads.ts @@ -4,7 +4,10 @@ export type AgentDepthView = 'auto' | 'quick' | 'standard' | 'deep' | 'pilot' | export type ProviderTypeView = | 'echo' | 'openai-compatible' + | 'openrouter' | 'openai' + | 'azure-openai' + | 'bedrock' | 'anthropic' | 'gemini' | 'deepseek' @@ -15,6 +18,8 @@ export interface ProviderSettingsPayload { providerType: ProviderTypeView; baseUrl: string; model: string; + apiVersion?: string; + region?: string; contextWindow: number; } @@ -49,6 +54,7 @@ export interface McpToggles { filesystem: boolean; memory: boolean; sequentialThinking: boolean; + puppeteer: boolean; } export interface McpCustomServerView { @@ -73,6 +79,9 @@ export interface McpSettingsPayload { export interface TelemetrySettingsPayload { sessionLogging: boolean; debugMetrics: boolean; + webhookUrl?: string; + webhookSecret?: string; + webhookTimeoutMs?: number; } export interface IndexingSettingsPayload { diff --git a/src/core/config/vscode/read.ts b/src/core/config/vscode/read.ts index f14bb0db..caa06cd3 100644 --- a/src/core/config/vscode/read.ts +++ b/src/core/config/vscode/read.ts @@ -14,11 +14,15 @@ export function readThunderConfigFromSettings(): ThunderConfig { type: config.get('provider.type'), baseUrl: config.get('provider.baseUrl'), model: config.get('provider.model'), + apiVersion: config.get('provider.apiVersion'), + region: config.get('provider.region'), apiKeyRef: config.get('provider.apiKeyRef'), contextWindow: config.get('provider.contextWindow'), supportsStreaming: config.get('provider.supportsStreaming'), supportsTools: config.get('provider.supportsTools'), supportsEmbeddings: config.get('provider.supportsEmbeddings'), + supportsVision: config.get('provider.supportsVision'), + supportsReasoning: config.get('provider.supportsReasoning'), }, indexing: { enabled: config.get('indexing.enabled'), @@ -37,6 +41,7 @@ export function readThunderConfigFromSettings(): ThunderConfig { rerankerEnabled: config.get('context.rerankerEnabled'), rerankerCandidatePool: config.get('context.rerankerCandidatePool'), rerankerTopK: config.get('context.rerankerTopK'), + microTaskRoutingEnabled: config.get('context.microTaskRoutingEnabled'), }, safety: { requireApprovalForWrites: config.get('safety.requireApprovalForWrites'), @@ -103,6 +108,18 @@ export function readThunderConfigFromSettings(): ThunderConfig { telemetry: { sessionLogging: config.get('telemetry.sessionLogging'), debugMetrics: config.get('telemetry.debugMetrics'), + webhookUrl: config.get('telemetry.webhookUrl'), + webhookSecret: config.get('telemetry.webhookSecret'), + webhookTimeoutMs: config.get('telemetry.webhookTimeoutMs'), + }, + ui: { + showReasoning: config.get('ui.showReasoning'), + reasoningPreviewMaxChars: config.get('ui.reasoningPreviewMaxChars'), + }, + enterprise: { + localProvidersOnly: config.get('enterprise.localProvidersOnly'), + stripFileContentsFromAuditPacks: config.get('enterprise.stripFileContentsFromAuditPacks'), + autoExportAuditPackOnSessionEnd: config.get('enterprise.autoExportAuditPackOnSessionEnd'), }, }; diff --git a/src/core/config/vscode/write.ts b/src/core/config/vscode/write.ts index 2232b1cf..663d25f4 100644 --- a/src/core/config/vscode/write.ts +++ b/src/core/config/vscode/write.ts @@ -17,6 +17,12 @@ export async function updateProviderSettings(settings: ProviderSettingsPayload): await config.update('provider.type', settings.providerType, target); await config.update('provider.baseUrl', settings.baseUrl.trim(), target); await config.update('provider.model', settings.model.trim(), target); + if (settings.apiVersion !== undefined) { + await config.update('provider.apiVersion', settings.apiVersion.trim(), target); + } + if (settings.region !== undefined) { + await config.update('provider.region', settings.region.trim(), target); + } await config.update('provider.contextWindow', settings.contextWindow, target); } @@ -80,6 +86,15 @@ export async function updateTelemetrySettings(settings: TelemetrySettingsPayload const target = vscode.ConfigurationTarget.Global; await config.update('telemetry.sessionLogging', settings.sessionLogging, target); await config.update('telemetry.debugMetrics', settings.debugMetrics, target); + if (settings.webhookUrl !== undefined) { + await config.update('telemetry.webhookUrl', settings.webhookUrl.trim(), target); + } + if (settings.webhookSecret !== undefined) { + await config.update('telemetry.webhookSecret', settings.webhookSecret, target); + } + if (settings.webhookTimeoutMs !== undefined) { + await config.update('telemetry.webhookTimeoutMs', settings.webhookTimeoutMs, target); + } } export async function updateAllSettings(settings: ThunderSettingsPayload): Promise { diff --git a/src/core/headless/AgentRunner.ts b/src/core/headless/AgentRunner.ts new file mode 100644 index 00000000..55b49ede --- /dev/null +++ b/src/core/headless/AgentRunner.ts @@ -0,0 +1,108 @@ +import { createProvider } from '../llm/createProvider'; +import type { ProviderType } from '../config/schema'; +import type { ChatDelta, LlmProvider } from '../llm/types'; +import { getProviderPreset } from '../llm/providerPresets'; + +export interface HeadlessRunnerOptions { + cwd: string; + providerType?: ProviderType; + baseUrl?: string; + model?: string; + apiKey?: string; + approval?: 'auto' | 'manual'; + json?: boolean; +} + +export interface HeadlessPlan { + goal: string; + cwd: string; + provider: string; + model: string; + approval: 'auto' | 'manual'; + steps: Array<{ id: string; title: string; risk: 'low' | 'medium' | 'high'; readOnly: boolean }>; +} + +export class HeadlessAgentRunner { + private readonly provider: LlmProvider; + private readonly providerType: ProviderType; + private readonly model: string; + private readonly approval: 'auto' | 'manual'; + + constructor(private readonly options: HeadlessRunnerOptions) { + this.providerType = options.providerType ?? 'echo'; + const preset = getProviderPreset(this.providerType); + this.model = options.model ?? preset?.model ?? 'echo'; + this.approval = options.approval ?? 'manual'; + this.provider = createProvider({ + type: this.providerType, + baseUrl: options.baseUrl ?? preset?.baseUrl, + model: this.model, + contextWindow: preset?.contextWindow, + supportsStreaming: true, + supportsTools: false, + supportsEmbeddings: false, + }, options.apiKey ?? resolveApiKey(this.providerType)); + } + + async ask(prompt: string): Promise { + return this.complete([ + { + role: 'system', + content: [ + 'You are Mitii headless ask mode.', + 'Answer in concise Markdown.', + 'Do not claim to have edited files or used VS Code APIs.', + ].join('\n'), + }, + { role: 'user', content: prompt }, + ]); + } + + plan(prompt: string): HeadlessPlan { + return { + goal: prompt, + cwd: this.options.cwd, + provider: this.providerType, + model: this.model, + approval: this.approval, + steps: [ + { id: 'discover', title: 'Inspect the repository context relevant to the request', risk: 'low', readOnly: true }, + { id: 'design', title: 'Identify files, interfaces, and tests that need changes', risk: 'low', readOnly: true }, + { id: 'execute', title: 'Apply scoped changes in the VS Code extension runtime or a future tool-enabled headless loop', risk: 'medium', readOnly: false }, + { id: 'verify', title: 'Run focused tests and summarize residual risk', risk: 'low', readOnly: true }, + ], + }; + } + + async *agent(prompt: string): AsyncIterable<{ type: string; message?: string; plan?: HeadlessPlan; content?: string }> { + yield { type: 'start', message: 'headless agent started' }; + const plan = this.plan(prompt); + yield { type: 'plan', plan }; + const content = await this.ask([ + prompt, + '', + 'Headless agent mode has no filesystem write tools in this runtime. Provide the best implementation guidance and verification checklist.', + ].join('\n')); + yield { type: 'assistant_delta', content }; + yield { type: 'end', message: 'headless agent completed' }; + } + + private async complete(messages: Array<{ role: 'system' | 'user'; content: string }>): Promise { + let content = ''; + for await (const delta of this.provider.complete({ messages, stream: true })) { + content += deltaContent(delta); + } + return content; + } +} + +function deltaContent(delta: ChatDelta): string { + return delta.content ?? ''; +} + +function resolveApiKey(providerType: ProviderType): string | undefined { + if (providerType === 'anthropic') return process.env.ANTHROPIC_API_KEY ?? process.env.MITII_API_KEY; + if (providerType === 'gemini') return process.env.GEMINI_API_KEY ?? process.env.MITII_API_KEY; + if (providerType === 'openrouter') return process.env.OPENROUTER_API_KEY ?? process.env.MITII_API_KEY; + return process.env.MITII_API_KEY ?? process.env.OPENAI_API_KEY; +} diff --git a/src/core/headless/HeadlessAgentHost.ts b/src/core/headless/HeadlessAgentHost.ts new file mode 100644 index 00000000..7c83845b --- /dev/null +++ b/src/core/headless/HeadlessAgentHost.ts @@ -0,0 +1,549 @@ +import { join } from 'path'; +import { ThunderSession, type ThunderMode } from '../session/ThunderSession'; +import { IndexService } from '../indexing/IndexService'; +import { IgnoreService } from '../indexing/IgnoreService'; +import { WorkspaceScanner } from '../indexing/WorkspaceScanner'; +import { IndexQueue } from '../indexing/IndexQueue'; +import { FtsIndex } from '../indexing/FtsIndex'; +import { HybridRetriever } from '../context/HybridRetriever'; +import { createContextReranker } from '../context/ContextReranker'; +import { ContextBudgeter } from '../context/ContextBudgeter'; +import { CurrentEditorContextSource, OpenFilesContextSource } from '../context/sources/editorSources'; +import { FtsContextSource, RepoMapContextSource, MemoryContextSource, WorkspaceOverviewContextSource } from '../context/sources/indexSources'; +import { IndexedFileSearchContextSource } from '../context/sources/indexedFileSource'; +import { MentionedFileContextSource } from '../context/sources/mentionedFileSource'; +import { GitService } from '../context/GitService'; +import { GitDiffContextSource } from '../context/DiagnosticsService'; +import { RepoMapService } from '../context/RepoMapService'; +import { setVerifyCommandPatterns } from '../plans/PlanActEngine'; +import { ChatOrchestrator } from '../orchestration/ChatOrchestrator'; +import { ToolRuntime } from '../tools/ToolRuntime'; +import { + createReadFileTool, createReadFilesTool, createListFilesTool, createSearchTool, + createSearchBatchTool, createSearchScriptCatalogTool, createSpawnResearchAgentTool, + createExecuteWorkspaceScriptTool, createUseSkillTool, + createRepoMapTool, createRetrieveContextTool, createGitDiffTool, + createDiagnosticsTool, createWriteFileTool, createApplyPatchTool, createRunCommandTool, + createMemorySearchTool, createMemoryWriteTool, createSaveTaskStateTool, + createFetchWebTool, createAskQuestionTool, createProjectCatalogTool, createAnalyzeChangeImpactTool, + setSubagentTracker, +} from '../tools/builtinTools'; +import { ProjectCatalogContextSource, discoverProjectCatalog, saveProjectCatalog } from '../modes/ask'; +import { createMarkStepCompleteTool, createProposePlanMutationTool } from '../tools/planTools'; +import type { AssistantStreamChunk, LlmProvider } from '../llm/types'; +import { createProvider } from '../llm/createProvider'; +import { scaffoldMitiiWorkspace } from '../mcp/scaffoldMitiiWorkspace'; +import { AgentTaskState } from '../runtime/AgentTaskState'; +import { + resolveProjectVerifyCommands, + formatVerifyPlanForAgent, +} from '../runtime/verifyCommandDiscovery'; +import { ToolPolicyEngine } from '../safety/ToolPolicyEngine'; +import { resolveEffectiveSafety } from '../safety/autonomyPresets'; +import { ApprovalQueue } from '../safety/ApprovalQueue'; +import { ToolExecutor } from '../safety/ToolExecutor'; +import { MemoryService } from '../memory/MemoryService'; +import { SessionService } from '../session/SessionService'; +import { PlanPersistence } from '../plans/PlanPersistence'; +import { PlanFileStore } from '../plans/PlanFileStore'; +import { MemoryExtractor } from '../runtime/MemoryExtractor'; +import { SubagentTracker } from '../runtime/SubagentTracker'; +import { PassiveMemoryInjector } from '../memory/PassiveMemoryInjector'; +import { MemoryHookService } from '../memory/MemoryHookService'; +import { PostEditValidator } from '../apply/PostEditValidator'; +import { McpManager } from '../mcp/McpManager'; +import { ProjectRulesContextSource, ProjectRulesService } from '../rules/ProjectRulesService'; +import { SkillCatalogContextSource, SkillCatalogService } from '../skills/SkillCatalogService'; +import { createLogger } from '../telemetry/Logger'; +import { SessionLogService } from '../telemetry/SessionLogService'; +import { MicroTaskExecutor } from '../microtasks'; +import { HeadlessAgentRunner, type HeadlessPlan } from './AgentRunner'; +import { + buildHeadlessConfig, + resolveApiKey, + resolveMitiiPackageRoot, + type HeadlessAgentOptions, +} from './HeadlessConfig'; +import { HeadlessDiagnosticsService, HeadlessDiagnosticsContextSource } from './HeadlessDiagnosticsService'; +import { headlessDiscoverFiles } from './headlessDiscoverFiles'; +import { defaultMcpToggles } from '../mcp/mcpToggles'; +import type { ThunderConfig } from '../config/schema'; +import { chunkContent } from '../llm/streamChunks'; + +const log = createLogger('HeadlessAgentHost'); + +const AUTO_GRANT_TOOLS = [ + 'write_file', 'apply_patch', 'run_command', 'ask_question', 'memory_write', +] as const; + +export interface HeadlessRunMetrics { + durationMs: number; + toolCalls: number; + errors: string[]; + sessionLogPath?: string; + auditTools: string[]; +} + +export class HeadlessAgentHost { + private readonly options: HeadlessAgentOptions; + private readonly config: ThunderConfig; + private readonly packageRoot: string; + private readonly stubRunner: HeadlessAgentRunner; + private initialized = false; + + private indexService?: IndexService; + private ignoreService = new IgnoreService(); + private scanner?: WorkspaceScanner; + private indexQueue?: IndexQueue; + private gitService?: GitService; + private skillCatalogService?: SkillCatalogService; + private memoryService?: MemoryService; + private diagnosticsService = new HeadlessDiagnosticsService(); + private postEditValidator?: PostEditValidator; + private sessionService?: SessionService; + private planPersistence?: PlanPersistence; + private approvalQueue?: ApprovalQueue; + private policyEngine?: ToolPolicyEngine; + private toolRuntime = new ToolRuntime(); + private toolExecutor?: ToolExecutor; + private chatOrchestrator?: ChatOrchestrator; + private memoryExtractor?: MemoryExtractor; + private mcpManager = new McpManager(); + private sessionLog = new SessionLogService(); + private subagentTracker = new SubagentTracker(); + private agentTaskState = new AgentTaskState(); + private session?: ThunderSession; + private provider?: LlmProvider; + + constructor(options: HeadlessAgentOptions) { + this.options = options; + this.packageRoot = options.packageRoot ?? resolveMitiiPackageRoot(join(__dirname, '..')); + this.config = buildHeadlessConfig(options); + this.stubRunner = new HeadlessAgentRunner({ + cwd: options.cwd, + providerType: options.providerType ?? this.config.provider.type, + baseUrl: options.baseUrl ?? this.config.provider.baseUrl, + model: options.model ?? this.config.provider.model, + apiKey: options.apiKey ?? resolveApiKey(options.providerType ?? this.config.provider.type), + approval: options.approval ?? 'manual', + }); + } + + get isRealRuntime(): boolean { + return this.options.runtime !== 'stub'; + } + + getSessionLog(): SessionLogService { + return this.sessionLog; + } + + getToolAudit(): ReturnType { + return this.toolRuntime.getAuditLog(); + } + + async initialize(): Promise { + if (this.initialized) return; + if (!this.isRealRuntime) { + this.initialized = true; + return; + } + + const workspace = this.options.cwd; + this.indexService = new IndexService(workspace); + await this.indexService.initialize(); + + scaffoldMitiiWorkspace(workspace, { extensionRoot: this.packageRoot, forceBundledSkills: false }); + try { + saveProjectCatalog(discoverProjectCatalog(workspace)); + } catch (error) { + log.warn('Project catalog discovery failed', { + error: error instanceof Error ? error.message : String(error), + }); + } + + const db = this.indexService.getDb(); + if (!db) throw new Error('Failed to open index database'); + + this.ignoreService.load(workspace, { + respectGitignore: this.config.indexing.respectGitignore, + respectThunderignore: this.config.indexing.respectThunderignore, + }); + + this.scanner = new WorkspaceScanner(db, workspace); + this.indexQueue = new IndexQueue(db, { + maxConcurrency: this.config.indexing.maxConcurrency, + maxFileSizeBytes: this.config.indexing.maxFileSizeBytes, + }); + + this.gitService = new GitService(workspace); + await this.gitService.initialize(); + + this.diagnosticsService.setWorkspaceRoot(workspace); + this.postEditValidator = new PostEditValidator(this.diagnosticsService as never); + + this.skillCatalogService = new SkillCatalogService(workspace); + this.skillCatalogService.refresh(); + + this.memoryService = new MemoryService(db, workspace, { + maxItems: this.config.memory.maxItems, + hybridSearchEnabled: this.config.memory.hybridSearchEnabled, + }); + + this.sessionService = new SessionService(db); + this.planPersistence = new PlanPersistence(db); + this.approvalQueue = new ApprovalQueue(db); + + const effectiveSafety = resolveEffectiveSafety(this.config.safety); + setVerifyCommandPatterns(this.config.agent.verifyCommands); + + this.policyEngine = new ToolPolicyEngine( + effectiveSafety, + (path) => this.ignoreService.isIgnored(path), + () => true + ); + + this.toolRuntime.setSessionLog(this.sessionLog); + setSubagentTracker(this.subagentTracker); + + this.toolExecutor = new ToolExecutor( + this.toolRuntime, + this.policyEngine, + this.approvalQueue, + () => this.session?.id ?? '', + () => this.session?.mode ?? 'plan', + () => this.autoResolvePendingApprovals(), + () => this.agentTaskState, + this.sessionLog, + () => this.toolExecutor?.setPlanPhaseLock('execute') + ); + + const retriever = this.buildRetriever(db, workspace); + const budgeter = new ContextBudgeter(); + this.chatOrchestrator = new ChatOrchestrator(retriever, budgeter, db); + this.configureOrchestrator(workspace); + + const repoMap = new RepoMapService(db, workspace); + const fts = new FtsIndex(db); + this.registerTools(workspace, repoMap, fts, retriever, budgeter); + + const mcpToggles = { + ...defaultMcpToggles(), + puppeteer: this.config.mcp.builtinServers.puppeteer ?? false, + }; + await this.mcpManager.reload(this.config.mcp, workspace, this.toolRuntime, mcpToggles); + + this.memoryExtractor = new MemoryExtractor( + this.memoryService, + this.config.memory.summarizeAfterTask + ); + + if (this.config.indexing.autoIndexOnOpen) { + await this.indexWorkspace(workspace); + } + + this.provider = createProvider(this.config.provider, this.options.apiKey ?? resolveApiKey(this.config.provider.type)); + this.initialized = true; + } + + async ask(prompt: string): Promise { + await this.initialize(); + if (!this.isRealRuntime) return this.stubRunner.ask(prompt); + return this.runMode('ask', prompt); + } + + async plan(prompt: string): Promise> { + await this.initialize(); + if (!this.isRealRuntime) return this.stubRunner.plan(prompt); + const content = await this.runMode('plan', prompt); + try { + return JSON.parse(content) as Record; + } catch { + return { goal: prompt, content, steps: [] }; + } + } + + async *agent(prompt: string): AsyncIterable<{ type: string; message?: string; plan?: HeadlessPlan; content?: string }> { + await this.initialize(); + if (!this.isRealRuntime) { + yield* this.stubRunner.agent(prompt); + return; + } + + yield { type: 'start', message: 'headless agent started' }; + let content = ''; + for await (const chunk of this.streamMode('agent', prompt)) { + const text = chunkContent(chunk); + if (text) { + content += text; + yield { type: 'assistant_delta', content: text }; + } + } + yield { type: 'end', message: 'headless agent completed', content }; + } + + async runWithMetrics(mode: ThunderMode, prompt: string): Promise<{ output: string; metrics: HeadlessRunMetrics }> { + const started = Date.now(); + const errors: string[] = []; + let output = ''; + + try { + if (mode === 'ask') { + output = await this.ask(prompt); + } else if (mode === 'plan') { + output = JSON.stringify(await this.plan(prompt)); + } else { + const parts: string[] = []; + for await (const event of this.agent(prompt)) { + if (event.content) parts.push(event.content); + } + output = parts.join(''); + } + } catch (error) { + errors.push(error instanceof Error ? error.message : String(error)); + } + + const audit = this.getToolAudit(); + return { + output, + metrics: { + durationMs: Date.now() - started, + toolCalls: audit.length, + errors, + sessionLogPath: this.sessionLog.getLogPath() || undefined, + auditTools: audit.map((entry) => entry.toolName), + }, + }; + } + + dispose(): void { + this.indexService?.dispose(); + this.initialized = false; + } + + private configureOrchestrator(workspace: string): void { + if (!this.chatOrchestrator || !this.toolExecutor) return; + + const passiveMemoryInjector = new PassiveMemoryInjector(this.memoryService!); + const memoryHookService = new MemoryHookService(workspace); + + this.chatOrchestrator.configure({ + toolRuntime: this.toolRuntime, + toolExecutor: this.toolExecutor, + sessionService: this.sessionService, + planPersistence: this.planPersistence, + memoryExtractor: this.memoryExtractor, + memoryConfig: this.config.memory, + agentConfig: this.config.agent, + passiveMemoryInjector, + memoryHookService, + postEditValidator: this.postEditValidator, + sessionLog: this.sessionLog, + workspace, + memoryService: this.memoryService, + taskState: this.agentTaskState, + skillCatalog: this.skillCatalogService, + allowNetwork: () => resolveEffectiveSafety(this.config.safety).allowNetwork, + runVerifyHooks: async (commands, userMessage) => this.runVerifyHooks(workspace, commands, userMessage ?? ''), + microTaskRoutingEnabled: this.config.context.microTaskRoutingEnabled, + microTaskExecutorFactory: (provider) => new MicroTaskExecutor({ + workspace, + git: this.gitService!, + provider, + sessionLog: this.sessionLog, + }), + onPostWrite: async () => undefined, + onDiffPreview: async () => undefined, + }); + this.chatOrchestrator.setToolExecutor(this.toolExecutor); + } + + private registerTools( + workspace: string, + repoMap: RepoMapService, + fts: FtsIndex, + retriever: HybridRetriever, + budgeter: ContextBudgeter + ): void { + this.toolRuntime.register(createReadFileTool(workspace, this.ignoreService)); + this.toolRuntime.register(createReadFilesTool(workspace, this.ignoreService)); + this.toolRuntime.register(createListFilesTool(workspace, this.ignoreService)); + this.toolRuntime.register(createSearchTool(fts, workspace)); + this.toolRuntime.register(createSearchBatchTool(fts, workspace)); + this.toolRuntime.register(createSearchScriptCatalogTool(workspace, this.packageRoot)); + this.toolRuntime.register(createExecuteWorkspaceScriptTool(workspace, this.packageRoot, this.ignoreService)); + this.toolRuntime.register(createUseSkillTool(this.skillCatalogService!)); + this.toolRuntime.register(createSpawnResearchAgentTool()); + this.toolRuntime.register(createRepoMapTool(repoMap)); + this.toolRuntime.register(createRetrieveContextTool(retriever, budgeter)); + this.toolRuntime.register(createGitDiffTool(this.gitService!)); + this.toolRuntime.register(createDiagnosticsTool(this.diagnosticsService as never)); + this.toolRuntime.register(createProjectCatalogTool(workspace)); + this.toolRuntime.register(createAnalyzeChangeImpactTool(workspace)); + this.toolRuntime.register(createWriteFileTool(workspace, this.ignoreService)); + this.toolRuntime.register(createApplyPatchTool(workspace, this.ignoreService)); + this.toolRuntime.register(createRunCommandTool(workspace, () => this.session?.mode ?? 'plan')); + this.toolRuntime.register(createMemorySearchTool(this.memoryService!)); + this.toolRuntime.register(createMemoryWriteTool(this.memoryService!, () => this.session?.id ?? '')); + this.toolRuntime.register(createSaveTaskStateTool(this.memoryService!, () => this.session?.id ?? '', () => this.agentTaskState)); + this.toolRuntime.register(createFetchWebTool(() => this.config.safety.allowNetwork)); + this.toolRuntime.register(createAskQuestionTool()); + + const sessionIdForPlans = () => this.session?.id ?? ''; + const planToolsCtx = { + getPlan: () => this.planPersistence?.getActive(sessionIdForPlans())?.plan ?? null, + setPlan: (plan: import('../plans/PlanActEngine').ThunderPlan) => { + const sid = sessionIdForPlans(); + if (sid) this.planPersistence?.updatePlan(sid, plan); + }, + planPersistence: this.planPersistence, + getSessionId: sessionIdForPlans, + setPlanPhaseLock: (phase: import('../plans/PlanActEngine').PlanPhase | undefined) => { + this.toolExecutor?.setPlanPhaseLock(phase); + }, + get planFileStore() { + const sid = sessionIdForPlans(); + return sid ? new PlanFileStore(workspace, sid) : undefined; + }, + }; + this.toolRuntime.register(createMarkStepCompleteTool(planToolsCtx)); + this.toolRuntime.register(createProposePlanMutationTool(planToolsCtx)); + } + + private buildRetriever(db: import('../indexing/ThunderDb').ThunderDb, workspace: string): HybridRetriever { + const sources = []; + const projectRulesService = new ProjectRulesService(workspace); + sources.push(new ProjectRulesContextSource(projectRulesService)); + if (this.skillCatalogService) { + sources.push(new SkillCatalogContextSource(this.skillCatalogService)); + } + sources.push(new ProjectCatalogContextSource(workspace)); + sources.push( + new MentionedFileContextSource(workspace), + new WorkspaceOverviewContextSource(workspace), + new CurrentEditorContextSource(workspace, db), + new OpenFilesContextSource(workspace, db), + new FtsContextSource(db), + new IndexedFileSearchContextSource(db, workspace), + new RepoMapContextSource(db, workspace) + ); + if (this.gitService) sources.push(new GitDiffContextSource(this.gitService)); + sources.push(new HeadlessDiagnosticsContextSource(this.diagnosticsService)); + if (this.memoryService) sources.push(new MemoryContextSource(this.memoryService)); + + const reranker = createContextReranker(undefined, false); + return new HybridRetriever(sources, reranker, { + enabled: this.config.context.rerankerEnabled, + candidatePool: this.config.context.rerankerCandidatePool, + topK: this.config.context.rerankerTopK, + }); + } + + private async indexWorkspace(workspace: string): Promise { + if (!this.scanner || !this.indexQueue) return; + const files = headlessDiscoverFiles(workspace, this.ignoreService, this.config.indexing); + const diff = this.scanner.computeDiff(files); + this.scanner.persistScan(diff); + const jobs = [...diff.added, ...diff.changed].map((f) => ({ + fileId: this.scanner!.getFileId(f.relPath)!, + relPath: f.relPath, + absPath: f.absPath, + language: f.language, + })).filter((j) => j.fileId !== undefined); + + if (jobs.length === 0) return; + this.indexQueue.enqueue(jobs); + + const deadline = Date.now() + 120_000; + while (this.indexQueue.getStatus().running || this.indexQueue.getStatus().queued > 0) { + if (Date.now() > deadline) break; + await sleep(250); + } + this.sessionLog.append('index_complete', 'Headless indexing finished', { + workspace, + jobCount: jobs.length, + }); + } + + private async runMode(mode: ThunderMode, prompt: string): Promise { + const parts: string[] = []; + for await (const chunk of this.streamMode(mode, prompt)) { + const text = chunkContent(chunk); + if (text) parts.push(text); + } + return parts.join(''); + } + + private async *streamMode(mode: ThunderMode, prompt: string): AsyncIterable { + if (!this.chatOrchestrator || !this.provider) { + throw new Error('Headless agent host is not initialized'); + } + + this.session = new ThunderSession(this.options.cwd, mode); + this.sessionLog.configure(this.options.cwd, this.session.id, true, this.config.telemetry.debugMetrics); + this.toolRuntime.clearAuditLog(); + this.agentTaskState.reset(); + this.agentTaskState.setLimits({ + maxSequentialThinkingCalls: this.config.agent.maxSequentialThinkingCallsPerTurn, + }); + + if (this.options.approval === 'auto') { + for (const tool of AUTO_GRANT_TOOLS) { + this.approvalQueue?.grantForTask(this.session.id, tool); + } + } + + this.sessionService?.ensureSession(this.session, prompt.slice(0, 64)); + yield* this.chatOrchestrator.send(this.session, this.provider, prompt, []); + } + + private autoResolvePendingApprovals(): void { + if (this.options.approval !== 'auto' || !this.approvalQueue || !this.session) return; + for (const request of this.approvalQueue.getPending()) { + this.approvalQueue.grantForTask(this.session.id, request.toolName); + this.approvalQueue.resolve(request.id, 'approved'); + this.sessionLog.append('approval_decision', `auto-approved: ${request.toolName}`, { + id: request.id, + toolName: request.toolName, + scope: 'task', + }); + } + } + + private async runVerifyHooks(workspace: string, commands: string[], userMessage: string): Promise { + const lines: string[] = []; + const touchedFiles = this.getTouchedFilesFromAudit(); + const plan = resolveProjectVerifyCommands(workspace, commands, { touchedFiles, userMessage }); + lines.push(formatVerifyPlanForAgent(plan)); + + for (const command of plan.commands) { + const trimmed = command.trim(); + if (!trimmed) continue; + try { + const result = await this.toolRuntime.execute('run_command', { command: trimmed }); + const body = result.success + ? (result.output || '(no output)') + : (result.error ?? result.output ?? 'command failed'); + lines.push(`$ ${trimmed}\n${body.slice(0, 4000)}`); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + lines.push(`$ ${trimmed}\n${msg}`); + } + } + + return lines.join('\n\n'); + } + + private getTouchedFilesFromAudit(): string[] { + const files = new Set(); + for (const { toolName, input, result } of this.toolRuntime.getAuditLog()) { + if (!result.success || !['write_file', 'apply_patch'].includes(toolName)) continue; + const path = (input as Record).path; + if (typeof path === 'string') files.add(path); + } + return [...files]; + } +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/src/core/headless/HeadlessConfig.ts b/src/core/headless/HeadlessConfig.ts new file mode 100644 index 00000000..8e96e2a2 --- /dev/null +++ b/src/core/headless/HeadlessConfig.ts @@ -0,0 +1,94 @@ +import { existsSync } from 'fs'; +import { join } from 'path'; +import type { ProviderType, ThunderConfig } from '../config/schema'; +import { defaultThunderConfig } from '../config/defaults'; +import { resolveEffectiveSafety } from '../safety/autonomyPresets'; + +export type HeadlessRuntime = 'real' | 'stub'; + +export interface HeadlessAgentOptions { + cwd: string; + packageRoot?: string; + runtime?: HeadlessRuntime; + providerType?: ProviderType; + baseUrl?: string; + model?: string; + apiKey?: string; + approval?: 'auto' | 'manual'; + allowNetwork?: boolean; + enablePuppeteer?: boolean; + indexWorkspace?: boolean; + configOverrides?: Partial; +} + +export function resolveMitiiPackageRoot(fromDir: string): string { + let current = fromDir; + for (let depth = 0; depth < 4; depth += 1) { + if (existsSync(join(current, 'package.json'))) return current; + const parent = join(current, '..'); + if (parent === current) break; + current = parent; + } + return fromDir; +} + +export function buildHeadlessConfig(options: HeadlessAgentOptions): ThunderConfig { + const base = defaultThunderConfig(); + const approvalMode = options.approval === 'auto' ? 'auto' as const : 'review_all' as const; + const safety = resolveEffectiveSafety({ + ...base.safety, + approvalMode, + allowUntrustedWorkspace: true, + allowNetwork: options.allowNetwork ?? false, + }); + + const mcp = { + ...base.mcp, + enabled: true, + preloadBuiltin: true, + builtinServers: { + ...base.mcp.builtinServers, + puppeteer: options.enablePuppeteer ?? false, + }, + }; + + const config: ThunderConfig = { + ...base, + ...options.configOverrides, + provider: { + ...base.provider, + type: options.providerType ?? base.provider.type, + baseUrl: options.baseUrl ?? base.provider.baseUrl, + model: options.model ?? base.provider.model, + supportsTools: options.runtime === 'stub' ? false : true, + }, + safety, + mcp, + indexing: { + ...base.indexing, + vectorsEnabled: false, + autoIndexOnOpen: options.indexWorkspace !== false, + ...(options.configOverrides?.indexing ?? {}), + }, + agent: { + ...base.agent, + verifyOnActComplete: true, + ...(options.configOverrides?.agent ?? {}), + }, + telemetry: { + ...base.telemetry, + sessionLogging: true, + debugMetrics: true, + ...(options.configOverrides?.telemetry ?? {}), + }, + }; + + return config; +} + +export function resolveApiKey(providerType: ProviderType): string | undefined { + if (providerType === 'anthropic') return process.env.ANTHROPIC_API_KEY ?? process.env.MITII_API_KEY; + if (providerType === 'gemini') return process.env.GEMINI_API_KEY ?? process.env.MITII_API_KEY; + if (providerType === 'openrouter') return process.env.OPENROUTER_API_KEY ?? process.env.MITII_API_KEY; + return process.env.MITII_API_KEY ?? process.env.OPENAI_API_KEY; +} diff --git a/src/core/headless/HeadlessDiagnosticsService.ts b/src/core/headless/HeadlessDiagnosticsService.ts new file mode 100644 index 00000000..0e715bb4 --- /dev/null +++ b/src/core/headless/HeadlessDiagnosticsService.ts @@ -0,0 +1,47 @@ +import type { ContextItem, ContextQuery, ContextSource } from '../context/types'; + +/** Headless diagnostics stub — no VS Code language service in CLI/benchmark runs. */ +export class HeadlessDiagnosticsService { + setWorkspaceRoot(_root: string): void { + // Headless runtime has no editor diagnostics integration. + } + + getDiagnostics(): Array<{ file: string; severity: string; message: string; line: number }> { + return []; + } + + formatCompact(_maxItems = 20): string { + return ''; + } + + getHeavyFiles(): string[] { + return []; + } + + getFileErrors(_relPath: string): Array<{ line: number; message: string }> { + return []; + } + + async waitForFileErrors(_relPath: string, _maxWaitMs = 2500): Promise> { + return []; + } +} + +export class HeadlessDiagnosticsContextSource implements ContextSource { + readonly id = 'diagnostics'; + + constructor(private readonly diagnosticsService: HeadlessDiagnosticsService) {} + + async retrieve(_query: ContextQuery): Promise { + const formatted = this.diagnosticsService.formatCompact(); + if (!formatted) return []; + return [{ + id: 'diagnostics', + source: this.id, + content: formatted, + score: 5, + reason: 'Headless diagnostics (empty in CLI runtime)', + tokenEstimate: Math.ceil(formatted.length / 4), + }]; + } +} diff --git a/src/core/headless/headlessDiscoverFiles.ts b/src/core/headless/headlessDiscoverFiles.ts new file mode 100644 index 00000000..d53a056a --- /dev/null +++ b/src/core/headless/headlessDiscoverFiles.ts @@ -0,0 +1,58 @@ +import { readdirSync, statSync } from 'fs'; +import { join, relative } from 'path'; +import type { IgnoreService } from '../indexing/IgnoreService'; +import type { DiscoveredFile } from '../indexing/FileDiscoveryService'; +import { isBinaryByExtension, detectLanguage } from '../indexing/fileUtils'; +import type { IndexingConfig } from '../config/schema'; + +/** File discovery without VS Code configuration APIs — used by headless host and benchmarks. */ +export function headlessDiscoverFiles( + workspacePath: string, + ignoreService: IgnoreService, + config: Pick +): DiscoveredFile[] { + const results: DiscoveredFile[] = []; + + const walk = (dir: string): void => { + let entries: string[]; + try { + entries = readdirSync(dir); + } catch { + return; + } + + for (const entry of entries) { + const absPath = join(dir, entry); + const relPath = relative(workspacePath, absPath).replace(/\\/g, '/'); + + if (ignoreService.isIgnored(relPath)) continue; + + let stat; + try { + stat = statSync(absPath); + } catch { + continue; + } + + if (stat.isDirectory()) { + walk(absPath); + continue; + } + + if (!stat.isFile()) continue; + if (stat.size > config.hardSkipSizeBytes) continue; + if (isBinaryByExtension(relPath)) continue; + + results.push({ + absPath, + relPath, + size: stat.size, + mtime: stat.mtimeMs, + language: detectLanguage(relPath), + }); + } + }; + + walk(workspacePath); + return results; +} diff --git a/src/core/headless/index.ts b/src/core/headless/index.ts new file mode 100644 index 00000000..d28dc0ef --- /dev/null +++ b/src/core/headless/index.ts @@ -0,0 +1,4 @@ +export * from './release'; +export * from './AgentRunner'; +export * from './HeadlessAgentHost'; +export * from './HeadlessConfig'; diff --git a/src/core/headless/release.ts b/src/core/headless/release.ts new file mode 100644 index 00000000..52289727 --- /dev/null +++ b/src/core/headless/release.ts @@ -0,0 +1,43 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { dirname, join } from 'path'; +import { GitHistoryCollector, generateChangelogEntry, generateReleaseNotes, insertChangelogEntry } from '../release'; + +export interface PrepareReleaseResult { + changelogEntry: string; + releaseNotes: string; + changelogPath: string; + releaseNotesPath: string; +} + +export async function generateHeadlessChangelog(cwd: string, since?: string): Promise { + const collector = new GitHistoryCollector(cwd); + const tag = since ?? await collector.getLatestTag() ?? undefined; + const commits = await collector.getCommitsSinceTag(tag); + return generateChangelogEntry({ commits, version: readPackageVersion(cwd), date: new Date() }); +} + +export async function prepareHeadlessRelease(cwd: string, since?: string): Promise { + const collector = new GitHistoryCollector(cwd); + const tag = since ?? await collector.getLatestTag() ?? undefined; + const commits = await collector.getCommitsSinceTag(tag); + const version = readPackageVersion(cwd); + const changelogEntry = generateChangelogEntry({ commits, version, date: new Date() }); + const releaseNotes = generateReleaseNotes({ commits, version, date: new Date() }); + const changelogPath = join(cwd, 'CHANGELOG.md'); + const existing = existsSync(changelogPath) ? readFileSync(changelogPath, 'utf8') : '# Changelog\n\n## [Unreleased]\n'; + writeFileSync(changelogPath, insertChangelogEntry(existing, changelogEntry), 'utf8'); + const releaseNotesPath = join(cwd, '.mitii', 'release-notes.md'); + mkdirSync(dirname(releaseNotesPath), { recursive: true }); + writeFileSync(releaseNotesPath, releaseNotes, 'utf8'); + return { changelogEntry, releaseNotes, changelogPath, releaseNotesPath }; +} + +function readPackageVersion(cwd: string): string { + try { + const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as { version?: string }; + return pkg.version ?? '0.0.0'; + } catch { + return '0.0.0'; + } +} + diff --git a/src/core/llm/AnthropicProvider.ts b/src/core/llm/AnthropicProvider.ts index 2bf403cc..06a5bedd 100644 --- a/src/core/llm/AnthropicProvider.ts +++ b/src/core/llm/AnthropicProvider.ts @@ -21,6 +21,8 @@ export class AnthropicProvider implements LlmProvider { supportsStreaming: config.capabilities?.supportsStreaming ?? true, supportsTools: config.capabilities?.supportsTools ?? true, supportsEmbeddings: false, + supportsVision: config.capabilities?.supportsVision ?? true, + supportsReasoning: config.capabilities?.supportsReasoning ?? false, }; } @@ -150,6 +152,26 @@ function splitAnthropicMessages(messages: ChatMessage[]): { out.push({ role: 'assistant', content }); continue; } + if (msg.attachments?.length && (msg.role === 'user' || msg.role === 'assistant')) { + const content: Array> = []; + if (msg.content) content.push({ type: 'text', text: msg.content }); + for (const attachment of msg.attachments) { + if (attachment.kind !== 'image') continue; + content.push({ + type: 'image', + source: { + type: 'base64', + media_type: attachment.mimeType, + data: attachment.data, + }, + }); + } + out.push({ + role: msg.role === 'assistant' ? 'assistant' : 'user', + content, + }); + continue; + } out.push({ role: msg.role === 'assistant' ? 'assistant' : 'user', content: msg.content, diff --git a/src/core/llm/BedrockProvider.ts b/src/core/llm/BedrockProvider.ts new file mode 100644 index 00000000..6a32b365 --- /dev/null +++ b/src/core/llm/BedrockProvider.ts @@ -0,0 +1,115 @@ +import { + BedrockRuntimeClient, + ConverseCommand, + ConverseStreamCommand, + type Message, + type SystemContentBlock, +} from '@aws-sdk/client-bedrock-runtime'; +import type { ChatDelta, ChatMessage, ChatRequest, LlmProvider, ModelCapabilities } from './types'; +import { normalizeProviderError } from './errors'; +import { estimateTokensAsync } from './tokenEstimate'; + +export interface BedrockProviderConfig { + region: string; + model: string; + capabilities?: Partial; +} + +export class BedrockProvider implements LlmProvider { + readonly id = 'bedrock'; + readonly capabilities: ModelCapabilities; + private readonly client: BedrockRuntimeClient; + + constructor(private readonly config: BedrockProviderConfig) { + this.capabilities = { + contextWindow: config.capabilities?.contextWindow ?? 200_000, + supportsStreaming: config.capabilities?.supportsStreaming ?? true, + supportsTools: false, + supportsEmbeddings: false, + supportsVision: config.capabilities?.supportsVision ?? true, + supportsReasoning: config.capabilities?.supportsReasoning ?? false, + }; + this.client = new BedrockRuntimeClient({ region: config.region || 'us-east-1' }); + } + + async *complete(request: ChatRequest): AsyncIterable { + const input = { + modelId: request.model ?? this.config.model, + ...formatBedrockMessages(request.messages), + inferenceConfig: { + temperature: request.temperature ?? 0.2, + maxTokens: request.maxTokens, + }, + }; + + try { + if (request.stream === false) { + const response = await this.client.send(new ConverseCommand(input)); + const content = response.output?.message?.content + ?.map((block) => block.text ?? '') + .join('') ?? ''; + if (content) yield { content }; + yield { done: true, finish_reason: response.stopReason }; + return; + } + + const response = await this.client.send(new ConverseStreamCommand(input)); + for await (const event of response.stream ?? []) { + const text = event.contentBlockDelta?.delta?.text; + if (text) yield { content: text }; + if (event.messageStop?.stopReason) { + yield { done: true, finish_reason: event.messageStop.stopReason }; + return; + } + } + yield { done: true }; + } catch (error) { + throw normalizeProviderError(error); + } + } + + async countTokens(text: string): Promise { + return estimateTokensAsync(text); + } +} + +function formatBedrockMessages(messages: ChatMessage[]): { + messages: Message[]; + system?: SystemContentBlock[]; +} { + const system: SystemContentBlock[] = []; + const out: Message[] = []; + + for (const message of messages) { + if (message.role === 'system') { + if (message.content.trim()) system.push({ text: message.content }); + continue; + } + + const role = message.role === 'assistant' ? 'assistant' : 'user'; + const prefix = message.role === 'tool' + ? `Tool result${message.name ? ` from ${message.name}` : ''}:\n` + : ''; + const text = `${prefix}${message.content}`.trim(); + if (!text) continue; + + const previous = out[out.length - 1]; + if (previous?.role === role) { + previous.content?.push({ text }); + } else { + out.push({ + role, + content: [{ text }], + }); + } + } + + if (out.length === 0) { + out.push({ role: 'user', content: [{ text: '' }] }); + } + + return { + messages: out, + ...(system.length > 0 ? { system } : {}), + }; +} diff --git a/src/core/llm/EchoProvider.ts b/src/core/llm/EchoProvider.ts index da540b2d..32189784 100644 --- a/src/core/llm/EchoProvider.ts +++ b/src/core/llm/EchoProvider.ts @@ -8,6 +8,8 @@ export class EchoProvider implements LlmProvider { supportsStreaming: true, supportsTools: false, supportsEmbeddings: false, + supportsVision: false, + supportsReasoning: false, }; async *complete(request: ChatRequest): AsyncIterable { diff --git a/src/core/llm/GeminiProvider.ts b/src/core/llm/GeminiProvider.ts index b8ca7f23..3ef1d864 100644 --- a/src/core/llm/GeminiProvider.ts +++ b/src/core/llm/GeminiProvider.ts @@ -20,6 +20,8 @@ export class GeminiProvider implements LlmProvider { supportsStreaming: config.capabilities?.supportsStreaming ?? true, supportsTools: config.capabilities?.supportsTools ?? true, supportsEmbeddings: false, + supportsVision: config.capabilities?.supportsVision ?? true, + supportsReasoning: config.capabilities?.supportsReasoning ?? false, }; } @@ -175,6 +177,24 @@ function toGeminiContents(messages: ChatMessage[]): Array> = []; + if (msg.content) parts.push({ text: msg.content }); + for (const attachment of msg.attachments) { + if (attachment.kind !== 'image') continue; + parts.push({ + inlineData: { + mimeType: attachment.mimeType, + data: attachment.data, + }, + }); + } + out.push({ + role: msg.role === 'assistant' ? 'model' : 'user', + parts, + }); + continue; + } out.push({ role: msg.role === 'assistant' ? 'model' : 'user', parts: [{ text: msg.content }], diff --git a/src/core/llm/LlmProviderRegistry.ts b/src/core/llm/LlmProviderRegistry.ts index 7472a2e0..96bff0d8 100644 --- a/src/core/llm/LlmProviderRegistry.ts +++ b/src/core/llm/LlmProviderRegistry.ts @@ -40,6 +40,8 @@ export class LlmProviderRegistry { type: options.type, baseUrl: options.baseUrl ?? '', model: options.model ?? '', + apiVersion: options.apiVersion ?? '2024-10-21', + region: options.region ?? 'us-east-1', apiKeyRef: 'thunder.apiKey', contextWindow: options.contextWindow ?? 8192, supportsStreaming: options.supportsStreaming ?? true, diff --git a/src/core/llm/OpenAiCompatibleProvider.ts b/src/core/llm/OpenAiCompatibleProvider.ts index 456ab333..00764e7f 100644 --- a/src/core/llm/OpenAiCompatibleProvider.ts +++ b/src/core/llm/OpenAiCompatibleProvider.ts @@ -8,30 +8,50 @@ export interface OpenAiCompatibleConfig { model: string; apiKey?: string; capabilities?: Partial; + providerId?: string; + defaultHeaders?: Record; + authHeader?: 'authorization' | 'api-key' | 'x-api-key'; + chatCompletionsPath?: string; + queryParams?: Record; + includeReasoning?: boolean; + reasoningEffort?: 'low' | 'medium' | 'high'; } export class OpenAiCompatibleProvider implements LlmProvider { - readonly id = 'openai-compatible'; + readonly id: string; readonly capabilities: ModelCapabilities; constructor(private readonly config: OpenAiCompatibleConfig) { + this.id = config.providerId ?? 'openai-compatible'; this.capabilities = { contextWindow: config.capabilities?.contextWindow ?? 8192, supportsStreaming: config.capabilities?.supportsStreaming ?? true, supportsTools: config.capabilities?.supportsTools ?? true, supportsEmbeddings: config.capabilities?.supportsEmbeddings ?? false, + supportsVision: config.capabilities?.supportsVision ?? false, + supportsReasoning: config.capabilities?.supportsReasoning ?? false, }; } async *complete(request: ChatRequest): AsyncIterable { - const url = `${this.config.baseUrl.replace(/\/$/, '')}/chat/completions`; + const url = buildChatCompletionsUrl(this.config); const headers: Record = { 'Content-Type': 'application/json', + ...(this.config.defaultHeaders ?? {}), }; if (this.config.apiKey) { - headers['Authorization'] = `Bearer ${this.config.apiKey}`; + const authHeader = this.config.authHeader ?? 'authorization'; + if (authHeader === 'api-key') { + headers['api-key'] = this.config.apiKey; + } else if (authHeader === 'x-api-key') { + headers['x-api-key'] = this.config.apiKey; + } else { + headers['Authorization'] = `Bearer ${this.config.apiKey}`; + } } + const includeReasoning = request.includeReasoning ?? this.config.includeReasoning; + const reasoningEffort = request.reasoningEffort ?? this.config.reasoningEffort; const body: Record = { model: request.model ?? this.config.model, messages: sanitizeOpenAiCompatibleMessages(request.messages).map(formatMessage), @@ -39,6 +59,12 @@ export class OpenAiCompatibleProvider implements LlmProvider { max_tokens: request.maxTokens, stream: request.stream !== false, }; + if (includeReasoning) { + body.include_reasoning = true; + } + if (reasoningEffort) { + body.reasoning_effort = reasoningEffort; + } if (this.capabilities.supportsTools && request.tools && request.tools.length > 0) { body.tools = request.tools; @@ -73,6 +99,9 @@ export class OpenAiCompatibleProvider implements LlmProvider { choices?: Array<{ message?: { content?: string; + reasoning?: string; + reasoning_content?: string; + redacted_reasoning?: string; tool_calls?: Array<{ id: string; type: 'function'; @@ -86,6 +115,10 @@ export class OpenAiCompatibleProvider implements LlmProvider { if (message?.content) { yield { content: message.content }; } + const reasoning = message?.reasoning ?? message?.reasoning_content ?? message?.redacted_reasoning; + if (reasoning) { + yield { reasoning }; + } if (message?.tool_calls) { for (const [index, tc] of message.tool_calls.entries()) { yield { @@ -165,6 +198,16 @@ export function sanitizeOpenAiCompatibleMessages(messages: ChatRequest['messages return sanitized; } +function buildChatCompletionsUrl(config: OpenAiCompatibleConfig): string { + const root = config.baseUrl.replace(/\/$/, ''); + const path = (config.chatCompletionsPath ?? 'chat/completions').replace(/^\//, ''); + const url = new URL(`${root}/${path}`); + for (const [key, value] of Object.entries(config.queryParams ?? {})) { + if (value) url.searchParams.set(key, value); + } + return url.toString(); +} + function toolResultAsUserMessage(message: ChatRequest['messages'][number]): ChatRequest['messages'][number] { const label = message.name ? ` from ${message.name}` : ''; return { @@ -174,9 +217,21 @@ function toolResultAsUserMessage(message: ChatRequest['messages'][number]): Chat } function formatMessage(msg: ChatRequest['messages'][number]): Record { + const attachments = msg.attachments?.filter((attachment) => attachment.kind === 'image') ?? []; + const content = attachments.length > 0 && (msg.role === 'user' || msg.role === 'assistant') + ? [ + ...(msg.content ? [{ type: 'text', text: msg.content }] : []), + ...attachments.map((attachment) => ({ + type: 'image_url', + image_url: { + url: `data:${attachment.mimeType};base64,${attachment.data}`, + }, + })), + ] + : msg.content; const out: Record = { role: msg.role, - content: msg.content, + content, }; if (msg.name) out.name = msg.name; if (msg.tool_call_id) out.tool_call_id = msg.tool_call_id; diff --git a/src/core/llm/UsageTrackingProvider.ts b/src/core/llm/UsageTrackingProvider.ts index ea02f617..fe150532 100644 --- a/src/core/llm/UsageTrackingProvider.ts +++ b/src/core/llm/UsageTrackingProvider.ts @@ -47,6 +47,9 @@ export class UsageTrackingProvider implements LlmProvider { if (delta.content) { outputText += delta.content; } + if (delta.reasoning) { + outputText += delta.reasoning; + } if (delta.tool_calls) { outputText += JSON.stringify(delta.tool_calls); } diff --git a/src/core/llm/createProvider.ts b/src/core/llm/createProvider.ts index 4d6dd70d..7d833f21 100644 --- a/src/core/llm/createProvider.ts +++ b/src/core/llm/createProvider.ts @@ -4,8 +4,10 @@ import { EchoProvider } from './EchoProvider'; import { OpenAiCompatibleProvider } from './OpenAiCompatibleProvider'; import { AnthropicProvider } from './AnthropicProvider'; import { GeminiProvider } from './GeminiProvider'; +import { BedrockProvider } from './BedrockProvider'; import { getProviderPreset } from './providerPresets'; import { normalizeProviderModel } from './modelNormalize'; +import { detectModelCapabilities } from './modelCapabilities'; import { createLogger } from '../telemetry/Logger'; const log = createLogger('createProvider'); @@ -14,11 +16,15 @@ export interface ProviderResolveOptions { type?: ProviderType; baseUrl?: string; model?: string; + apiVersion?: string; + region?: string; apiKey?: string; contextWindow?: number; supportsStreaming?: boolean; supportsTools?: boolean; supportsEmbeddings?: boolean; + supportsVision?: boolean; + supportsReasoning?: boolean; } export function createProvider( @@ -34,18 +40,60 @@ export function createProvider( } const model = resolved.model; const key = apiKey; - const capabilities = { - contextWindow: config.contextWindow ?? preset?.contextWindow ?? 8192, - supportsStreaming: config.supportsStreaming ?? true, - supportsTools: config.supportsTools ?? true, - supportsEmbeddings: config.supportsEmbeddings ?? false, - }; + const apiVersion = 'apiVersion' in config && config.apiVersion + ? config.apiVersion + : '2024-10-21'; + const region = 'region' in config && config.region + ? config.region + : 'us-east-1'; + const capabilities = detectModelCapabilities(type, model, preset?.contextWindow ?? 8192, { + contextWindow: config.contextWindow, + supportsStreaming: config.supportsStreaming, + supportsTools: config.supportsTools, + supportsEmbeddings: config.supportsEmbeddings, + supportsVision: config.supportsVision, + supportsReasoning: config.supportsReasoning, + }); switch (type) { case 'anthropic': return new AnthropicProvider({ baseUrl, model, apiKey: key, capabilities }); case 'gemini': return new GeminiProvider({ baseUrl, model, apiKey: key, capabilities }); + case 'openrouter': + return new OpenAiCompatibleProvider({ + baseUrl, + model, + apiKey: key, + capabilities, + providerId: 'openrouter', + defaultHeaders: { + 'HTTP-Referer': 'https://mitii.dev', + 'X-Title': 'Mitii Agent', + }, + includeReasoning: true, + }); + case 'azure-openai': + return new OpenAiCompatibleProvider({ + baseUrl, + model, + apiKey: key, + capabilities, + providerId: 'azure-openai', + authHeader: 'api-key', + chatCompletionsPath: `openai/deployments/${encodeURIComponent(model)}/chat/completions`, + queryParams: { 'api-version': apiVersion }, + }); + case 'bedrock': + return new BedrockProvider({ + region, + model, + capabilities: { + ...capabilities, + supportsTools: false, + supportsEmbeddings: false, + }, + }); case 'openai': case 'deepseek': case 'cursor': diff --git a/src/core/llm/index.ts b/src/core/llm/index.ts index d75da1da..492fc0ac 100644 --- a/src/core/llm/index.ts +++ b/src/core/llm/index.ts @@ -1,7 +1,9 @@ export * from './types'; export * from './EchoProvider'; export * from './OpenAiCompatibleProvider'; +export * from './BedrockProvider'; export * from './LlmProviderRegistry'; export * from './tokenEstimate'; export * from './errors'; export * from './sseParser'; +export * from './streamChunks'; diff --git a/src/core/llm/modelCapabilities.ts b/src/core/llm/modelCapabilities.ts new file mode 100644 index 00000000..b3b399cf --- /dev/null +++ b/src/core/llm/modelCapabilities.ts @@ -0,0 +1,68 @@ +import type { ProviderType } from '../config/schema'; +import type { ModelCapabilities } from './types'; + +export interface CapabilityOverride { + contextWindow?: number; + supportsStreaming?: boolean; + supportsTools?: boolean; + supportsEmbeddings?: boolean; + supportsVision?: boolean; + supportsReasoning?: boolean; +} + +export function detectModelCapabilities( + providerType: ProviderType, + model: string, + presetContextWindow = 8192, + override: CapabilityOverride = {} +): ModelCapabilities { + const normalized = model.toLowerCase(); + const base: ModelCapabilities = { + contextWindow: presetContextWindow, + supportsStreaming: providerType !== 'echo', + supportsTools: providerType !== 'echo' && providerType !== 'bedrock', + supportsEmbeddings: false, + supportsVision: false, + supportsReasoning: false, + }; + + if (providerType === 'echo') { + base.supportsStreaming = true; + base.supportsTools = false; + } + + if (providerType === 'gemini') { + base.supportsVision = true; + base.supportsReasoning = /thinking|2\.5|pro/.test(normalized); + } + + if (providerType === 'anthropic' || providerType === 'bedrock') { + base.supportsVision = /claude|sonnet|opus|haiku/.test(normalized); + } + + if (providerType === 'openai' || providerType === 'openrouter' || providerType === 'codex') { + base.supportsVision = /gpt-4o|gpt-4\.1|o[134]|vision|claude|gemini|sonnet|opus/i.test(model); + base.supportsReasoning = /(^|[\/-])o[134]($|[-.])|reason|thinking|sonnet-4|claude-3\.7|claude-sonnet-4/i.test(model); + } + + if (providerType === 'deepseek') { + base.supportsReasoning = /reasoner|r1/.test(normalized); + } + + if (providerType === 'openai-compatible' || providerType === 'cursor') { + base.supportsVision = /vision|vl|gpt-4o|gpt-4\.1|llava|qwen.*vl|gemini|claude/.test(normalized); + base.supportsReasoning = /reason|thinking|r1|qwen3|o[134]/.test(normalized); + } + + return { + ...base, + ...definedOnly(override), + contextWindow: override.contextWindow ?? base.contextWindow, + }; +} + +function definedOnly(value: T): Partial { + return Object.fromEntries( + Object.entries(value).filter(([, nested]) => nested !== undefined) + ) as Partial; +} diff --git a/src/core/llm/providerPresets.ts b/src/core/llm/providerPresets.ts index e1af32a3..dd49693c 100644 --- a/src/core/llm/providerPresets.ts +++ b/src/core/llm/providerPresets.ts @@ -7,7 +7,7 @@ export interface ProviderPreset { model: string; contextWindow: number; requiresApiKey: boolean; - apiKeyHeader?: 'authorization' | 'x-api-key' | 'query'; + apiKeyHeader?: 'authorization' | 'api-key' | 'x-api-key' | 'query'; } export const PROVIDER_PRESETS: ProviderPreset[] = [ @@ -19,6 +19,14 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [ contextWindow: 8192, requiresApiKey: false, }, + { + type: 'openrouter', + label: 'OpenRouter', + baseUrl: 'https://openrouter.ai/api/v1', + model: 'anthropic/claude-sonnet-4', + contextWindow: 200_000, + requiresApiKey: true, + }, { type: 'openai', label: 'OpenAI', @@ -27,6 +35,23 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [ contextWindow: 128_000, requiresApiKey: true, }, + { + type: 'azure-openai', + label: 'Azure OpenAI', + baseUrl: 'https://your-resource.openai.azure.com', + model: 'your-deployment-name', + contextWindow: 128_000, + requiresApiKey: true, + apiKeyHeader: 'api-key', + }, + { + type: 'bedrock', + label: 'AWS Bedrock', + baseUrl: 'https://bedrock-runtime.us-east-1.amazonaws.com', + model: 'anthropic.claude-3-5-sonnet-20240620-v1:0', + contextWindow: 200_000, + requiresApiKey: false, + }, { type: 'anthropic', label: 'Anthropic (Claude)', diff --git a/src/core/llm/sseParser.ts b/src/core/llm/sseParser.ts index d3efca7b..1f9b912c 100644 --- a/src/core/llm/sseParser.ts +++ b/src/core/llm/sseParser.ts @@ -33,6 +33,9 @@ export async function* parseSseStream( choices?: Array<{ delta?: { content?: string; + reasoning?: string; + reasoning_content?: string; + redacted_reasoning?: string; tool_calls?: Array<{ index: number; id?: string; @@ -55,6 +58,9 @@ export async function* parseSseStream( if (delta?.content) { out.content = delta.content; } + if (delta?.reasoning || delta?.reasoning_content || delta?.redacted_reasoning) { + out.reasoning = delta.reasoning ?? delta.reasoning_content ?? delta.redacted_reasoning; + } if (delta?.tool_calls) { out.tool_calls = delta.tool_calls; } @@ -63,7 +69,7 @@ export async function* parseSseStream( out.done = true; } - if (out.content || out.tool_calls || out.done) { + if (out.content || out.reasoning || out.tool_calls || out.done) { yield out; } } catch (e) { diff --git a/src/core/llm/streamChunks.ts b/src/core/llm/streamChunks.ts new file mode 100644 index 00000000..8ac578d0 --- /dev/null +++ b/src/core/llm/streamChunks.ts @@ -0,0 +1,15 @@ +import type { AssistantStreamChunk } from './types'; + +export function chunkContent(chunk: AssistantStreamChunk): string { + return typeof chunk === 'string' ? chunk : (chunk.content ?? ''); +} + +export function chunkReasoning(chunk: AssistantStreamChunk): string { + return typeof chunk === 'string' ? '' : (chunk.reasoning ?? ''); +} + +export function toAssistantStreamChunk(content?: string, reasoning?: string): AssistantStreamChunk | undefined { + if (reasoning) return { content, reasoning }; + if (content) return content; + return undefined; +} diff --git a/src/core/llm/testConnection.ts b/src/core/llm/testConnection.ts index 29ec737f..6e6ee370 100644 --- a/src/core/llm/testConnection.ts +++ b/src/core/llm/testConnection.ts @@ -10,35 +10,54 @@ export interface ProviderConnectionResult { export async function testOpenAiCompatibleConnection( baseUrl: string, model: string, - apiKey?: string + apiKey?: string, + options: { + headers?: Record; + chatCompletionsPath?: string; + queryParams?: Record; + authHeader?: 'authorization' | 'api-key' | 'x-api-key'; + } = {} ): Promise { const root = baseUrl.replace(/\/$/, ''); - const headers: Record = {}; + const headers: Record = { ...(options.headers ?? {}) }; if (apiKey) { - headers['Authorization'] = `Bearer ${apiKey}`; + if (options.authHeader === 'api-key') { + headers['api-key'] = apiKey; + } else if (options.authHeader === 'x-api-key') { + headers['x-api-key'] = apiKey; + } else { + headers['Authorization'] = `Bearer ${apiKey}`; + } } try { - const modelsRes = await fetch(`${root}/models`, { headers }); - if (modelsRes.ok) { - const data = (await modelsRes.json()) as { data?: Array<{ id: string }> }; - const models = data.data?.map((m) => m.id) ?? []; - const hasModel = models.length === 0 || models.some((m) => m === model || m.startsWith(model)); - if (!hasModel && models.length > 0) { + if (!options.chatCompletionsPath) { + const modelsRes = await fetch(`${root}/models`, { headers }); + if (modelsRes.ok) { + const data = (await modelsRes.json()) as { data?: Array<{ id: string }> }; + const models = data.data?.map((m) => m.id) ?? []; + const hasModel = models.length === 0 || models.some((m) => m === model || m.startsWith(model)); + if (!hasModel && models.length > 0) { + return { + ok: false, + message: `Connected, but model "${model}" not found. Available: ${models.slice(0, 8).join(', ')}`, + models, + }; + } return { - ok: false, - message: `Connected, but model "${model}" not found. Available: ${models.slice(0, 8).join(', ')}`, + ok: true, + message: `Connected to ${root}. Model "${model}"${models.length ? ' found' : ' (could not list models)'}.`, models, }; } - return { - ok: true, - message: `Connected to ${root}. Model "${model}"${models.length ? ' found' : ' (could not list models)'}.`, - models, - }; } - const probe = await fetch(`${root}/chat/completions`, { + const probeUrl = new URL(`${root}/${(options.chatCompletionsPath ?? 'chat/completions').replace(/^\//, '')}`); + for (const [key, value] of Object.entries(options.queryParams ?? {})) { + if (value) probeUrl.searchParams.set(key, value); + } + + const probe = await fetch(probeUrl.toString(), { method: 'POST', headers: { ...headers, 'Content-Type': 'application/json' }, body: JSON.stringify({ @@ -134,7 +153,9 @@ export async function testProviderConnection( providerType: ProviderType, baseUrl: string, model: string, - apiKey?: string + apiKey?: string, + apiVersion = '2024-10-21', + region = 'us-east-1' ): Promise { if (providerType === 'echo') { return { ok: true, message: 'Echo mode — no network connection required.' }; @@ -145,8 +166,29 @@ export async function testProviderConnection( if (providerType === 'gemini') { return testGeminiConnection(baseUrl, model, apiKey); } + if (providerType === 'bedrock') { + return { + ok: true, + message: `AWS Bedrock configured for ${region}. Mitii will use the AWS default credential chain and model "${model}".`, + }; + } if (isCloudProvider(providerType) && !apiKey?.trim()) { return { ok: false, message: `${providerType} requires an API key.` }; } + if (providerType === 'openrouter') { + return testOpenAiCompatibleConnection(baseUrl, model, apiKey, { + headers: { + 'HTTP-Referer': 'https://mitii.dev', + 'X-Title': 'Mitii Agent', + }, + }); + } + if (providerType === 'azure-openai') { + return testOpenAiCompatibleConnection(baseUrl, model, apiKey, { + authHeader: 'api-key', + chatCompletionsPath: `openai/deployments/${encodeURIComponent(model)}/chat/completions`, + queryParams: { 'api-version': apiVersion }, + }); + } return testOpenAiCompatibleConnection(baseUrl, model, apiKey); } diff --git a/src/core/llm/types.ts b/src/core/llm/types.ts index 51e76f10..35fe08dc 100644 --- a/src/core/llm/types.ts +++ b/src/core/llm/types.ts @@ -3,6 +3,7 @@ import type { ToolDefinition } from './toolTypes'; export interface ChatMessage { role: 'system' | 'user' | 'assistant' | 'tool'; content: string; + attachments?: ChatImageAttachment[]; name?: string; tool_call_id?: string; tool_calls?: Array<{ @@ -12,6 +13,13 @@ export interface ChatMessage { }>; } +export interface ChatImageAttachment { + kind: 'image'; + mimeType: string; + data: string; + name?: string; +} + export interface ChatRequest { messages: ChatMessage[]; model?: string; @@ -20,6 +28,8 @@ export interface ChatRequest { stream?: boolean; tools?: ToolDefinition[]; toolChoice?: 'auto' | 'none' | 'required'; + reasoningEffort?: 'low' | 'medium' | 'high'; + includeReasoning?: boolean; } export interface ToolCallDelta { @@ -33,17 +43,27 @@ export interface ToolCallDelta { export interface ChatDelta { content?: string; + reasoning?: string; done?: boolean; error?: string; tool_calls?: ToolCallDelta[]; finish_reason?: string; } +export interface AssistantStreamDelta { + content?: string; + reasoning?: string; +} + +export type AssistantStreamChunk = string | AssistantStreamDelta; + export interface ModelCapabilities { contextWindow: number; supportsStreaming: boolean; supportsTools: boolean; supportsEmbeddings: boolean; + supportsVision?: boolean; + supportsReasoning?: boolean; } export interface LlmProvider { diff --git a/src/core/mcp/builtinServers.ts b/src/core/mcp/builtinServers.ts index 37542cff..b5e1b67b 100644 --- a/src/core/mcp/builtinServers.ts +++ b/src/core/mcp/builtinServers.ts @@ -7,6 +7,7 @@ export const BUILTIN_MCP_SERVER_NAMES = [ 'filesystem', 'memory', 'sequential-thinking', + 'puppeteer', ] as const; export type BuiltinMcpServerName = (typeof BUILTIN_MCP_SERVER_NAMES)[number]; @@ -39,6 +40,15 @@ export function buildBuiltinMcpServers(workspace: string): Record ({ filesystem: true, memory: true, sequentialThinking: true, + puppeteer: false, }); export function mcpToggleKeyToServerName(key: keyof McpToggles): string { - return key === 'sequentialThinking' ? 'sequential-thinking' : key; + if (key === 'sequentialThinking') return 'sequential-thinking'; + return key; } export function mcpServerNameToToggleKey(name: string): keyof McpToggles | undefined { if (name === 'filesystem') return 'filesystem'; if (name === 'memory') return 'memory'; if (name === 'sequential-thinking') return 'sequentialThinking'; + if (name === 'puppeteer') return 'puppeteer'; return undefined; } diff --git a/src/core/microtasks/MicroTaskExecutor.ts b/src/core/microtasks/MicroTaskExecutor.ts new file mode 100644 index 00000000..2b5de3bc --- /dev/null +++ b/src/core/microtasks/MicroTaskExecutor.ts @@ -0,0 +1,115 @@ +import { readFileSync } from 'fs'; +import { join } from 'path'; +import type { LlmProvider } from '../llm/types'; +import type { SessionLogService } from '../telemetry/SessionLogService'; +import { collectCommitMessageInput, generateCommitMessage, buildCommitMessagePrompt } from '../scm'; +import { estimateChatRequestTokens } from '../llm/UsageTrackingProvider'; +import type { GitService } from '../context/GitService'; +import { GitHistoryCollector } from '../release/GitHistoryCollector'; +import { generateChangelogEntry } from '../release/ChangelogGenerator'; +import { generateReleaseNotes } from '../release/ReleaseNotesGenerator'; +import type { MicroTaskId, MicroTaskResult } from './types'; + +export interface MicroTaskExecutorDeps { + workspace: string; + git: GitService; + provider?: LlmProvider; + sessionLog?: SessionLogService; +} + +export class MicroTaskExecutor { + constructor(private readonly deps: MicroTaskExecutorDeps) {} + + async execute(id: MicroTaskId, userMessage: string): Promise { + if (id === 'commit_message') return this.generateCommitMessage(userMessage); + if (id === 'release_notes_draft') return this.generateReleaseNotes(userMessage); + return this.generateChangelogEntry(userMessage); + } + + private async generateCommitMessage(_userMessage: string): Promise { + if (!this.deps.provider) { + throw new Error('No LLM provider configured for commit message generation.'); + } + if (!this.deps.git.isGitRepo) { + throw new Error('No Git repository found for this workspace.'); + } + const input = await collectCommitMessageInput(this.deps.git, { + stagedDiffMaxChars: 12_000, + unstagedDiffMaxChars: 4_000, + perFileMaxChars: 2_000, + }); + if (!input.stagedDiff.trim() && input.unstagedDiff?.trim()) { + throw new Error('Only unstaged changes found. Stage files before generating a commit message.'); + } + const prompt = buildCommitMessagePrompt(input); + this.logContext('commit_message', prompt, { + changedFiles: input.changedFiles.length, + hasUnstagedDiff: Boolean(input.unstagedDiff?.trim()), + }); + const result = await generateCommitMessage(input, this.deps.provider); + return { + id: 'commit_message', + content: result.fullMessage, + metadata: { + subject: result.subject, + promptTokens: estimateChatRequestTokens({ + messages: [ + { role: 'system', content: 'commit' }, + { role: 'user', content: prompt }, + ], + }), + }, + }; + } + + private async generateChangelogEntry(userMessage: string): Promise { + const collector = new GitHistoryCollector(this.deps.workspace); + const latestTag = await collector.getLatestTag(); + const commits = await collector.getCommitsSinceTag(extractSinceRef(userMessage) ?? latestTag ?? undefined); + const version = readPackageVersion(this.deps.workspace); + const content = generateChangelogEntry({ commits, version, date: new Date() }); + this.logContext('changelog_entry', JSON.stringify(commits), { + latestTag, + commitCount: commits.length, + version, + }); + return { id: 'changelog_entry', content, metadata: { latestTag, commitCount: commits.length, version } }; + } + + private async generateReleaseNotes(userMessage: string): Promise { + const collector = new GitHistoryCollector(this.deps.workspace); + const latestTag = await collector.getLatestTag(); + const commits = await collector.getCommitsSinceTag(extractSinceRef(userMessage) ?? latestTag ?? undefined); + const version = readPackageVersion(this.deps.workspace); + const content = generateReleaseNotes({ commits, version, date: new Date() }); + this.logContext('release_notes_draft', JSON.stringify(commits), { + latestTag, + commitCount: commits.length, + version, + }); + return { id: 'release_notes_draft', content, metadata: { latestTag, commitCount: commits.length, version } }; + } + + private logContext(id: MicroTaskId, context: string, data: Record): void { + this.deps.sessionLog?.append('microtask_context', `Micro-task context: ${id}`, { + id, + contextChars: context.length, + estimatedTokens: Math.ceil(context.length / 4), + ...data, + }); + } +} + +function extractSinceRef(message: string): string | undefined { + const match = message.match(/\b(?:since|from)\s+([A-Za-z0-9._/-]+)/i); + return match?.[1]; +} + +function readPackageVersion(workspace: string): string { + try { + const pkg = JSON.parse(readFileSync(join(workspace, 'package.json'), 'utf8')) as { version?: string }; + return pkg.version ?? '0.0.0'; + } catch { + return '0.0.0'; + } +} diff --git a/src/core/microtasks/index.ts b/src/core/microtasks/index.ts new file mode 100644 index 00000000..bcaff848 --- /dev/null +++ b/src/core/microtasks/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './MicroTaskExecutor'; + diff --git a/src/core/microtasks/types.ts b/src/core/microtasks/types.ts new file mode 100644 index 00000000..fd72f981 --- /dev/null +++ b/src/core/microtasks/types.ts @@ -0,0 +1,26 @@ +export type MicroTaskId = 'commit_message' | 'changelog_entry' | 'release_notes_draft'; + +export interface MicroTaskInput { + userMessage: string; + workspace: string; +} + +export interface MicroTaskResult { + id: MicroTaskId; + content: string; + metadata?: Record; +} + +const MICRO_TASK_PATTERNS: Array<[MicroTaskId, RegExp]> = [ + ['commit_message', /\b(commit message|commit msg|write commit|git commit)\b/i], + ['commit_message', /\b(?:commit|message|subject|summary)\b[\s\S]{0,80}\b(?:staged|stage|cached|git diff)\b/i], + ['commit_message', /\b(?:staged|stage|cached|git diff)\b[\s\S]{0,80}\b(?:commit|message|subject|summary)\b/i], + ['release_notes_draft', /\b(release notes?|what'?s new)\b/i], + ['changelog_entry', /\b(changelog|what changed since)\b/i], +]; + +export function detectMicroTask(userMessage: string): MicroTaskId | null { + const text = userMessage.trim(); + if (!text) return null; + return MICRO_TASK_PATTERNS.find(([, pattern]) => pattern.test(text))?.[0] ?? null; +} diff --git a/src/core/modes/agent/actSkillRouting.ts b/src/core/modes/agent/actSkillRouting.ts index ea3e7927..b526c088 100644 --- a/src/core/modes/agent/actSkillRouting.ts +++ b/src/core/modes/agent/actSkillRouting.ts @@ -11,6 +11,14 @@ export function resolveActSkillNames(intent: ActIntent, taskAnalysis?: TaskAnaly names.push('audit-cleanup'); } + if (/\b(console\.log|inline style|missing types?|type annotations?|eslint|lint|tech debt|code smells?)\b/i.test(taskAnalysis?.summary ?? '')) { + names.push('code-smells-and-tech-debt'); + } + + if (/\b(\.env|environment variable|missing keys?|secrets?|api keys?|tokens?)\b/i.test(taskAnalysis?.summary ?? '')) { + names.push('environment-and-secrets'); + } + if ( intent === 'resume_plan' || intent === 'bugfix' || @@ -77,4 +85,6 @@ ACT SKILLS: - Call use_skill to load a workspace playbook when the task needs a workflow that is not already injected. - For bug fixes and failed verification, use debugging-and-error-recovery. - For implementation and refactors, use test-driven-development when tests or verification strategy are unclear. -- For cleanup tasks, use audit-cleanup and prefer repository audit scripts over manual grep.`; +- For cleanup tasks, use audit-cleanup and prefer repository audit scripts over manual grep. +- For console logs, inline styles, missing types, lint hygiene, or tech debt, use code-smells-and-tech-debt. +- For .env files, environment variables, keys, tokens, or secrets, use environment-and-secrets and never print secret values.`; diff --git a/src/core/modes/ask/AskIntentRouter.ts b/src/core/modes/ask/AskIntentRouter.ts index 9e8bed02..99129cfb 100644 --- a/src/core/modes/ask/AskIntentRouter.ts +++ b/src/core/modes/ask/AskIntentRouter.ts @@ -7,7 +7,9 @@ const IMPLEMENT_RE = /\b(how (?:do|would|should) i (?:add|implement|build|create const DEBUG_RE = /\b(why .+(?:fail|failing|broken|error)|build failing|test failing|root cause|diagnos|debug)\b/i; const CROSS_PROJECT_RE = /\b(across projects?|between projects?|cross[- ]project|relate to|flow from|agent\s*(?:->|to)\s*docs|docs\s*(?:->|to)\s*agent|extension\s*(?:->|to)\s*website|monorepo)\b/i; const GENERAL_KNOWLEDGE_RE = /^(what is|what are|define|explain the concept|difference between)\b/i; -const CODEBASE_RE = /\b(codebase|repo|repository|workspace|project|this app|this extension|this code|our code|src\/|\.tsx?|\.jsx?|\.py|\.go|\.rs|\.mdx?|package\.json)\b/i; +const CODEBASE_RE = /\b(codebase|repo|repository|workspace|project|this app|this extension|this code|our code|src\/|\.tsx?|\.jsx?|\.py|\.go|\.rs|\.mdx?|package\.json)\b|@[\w./-]+/i; +const SCM_CONTEXT_RE = + /\b(commit message|commit msg|git commit|git diff|working tree|staged changes?|changes? in (?:stage|staging))\b|\b(?:commit|message|subject|summary)\b[\s\S]{0,80}\b(?:staged|stage|cached)\b|\b(?:staged|stage|cached)\b[\s\S]{0,80}\b(?:commit|message|subject|summary)\b/i; export function routeAskIntent(userMessage: string): AskRoute { const text = userMessage.trim(); @@ -36,6 +38,7 @@ function classifyAskIntent(text: string): AskIntent { if (COMPARE_RE.test(text)) return 'compare'; if (ARCHITECTURE_RE.test(text)) return 'architecture'; if (LOCATE_RE.test(text)) return 'locate'; + if (SCM_CONTEXT_RE.test(text)) return 'explain_code'; if (GENERAL_KNOWLEDGE_RE.test(text) && !CODEBASE_RE.test(text)) return 'general_knowledge'; if (CODEBASE_RE.test(text)) return 'explain_code'; return text.includes('?') ? 'explain_code' : 'general_knowledge'; diff --git a/src/core/modes/plan/planSkillRouting.ts b/src/core/modes/plan/planSkillRouting.ts index f285d95c..a6d72b66 100644 --- a/src/core/modes/plan/planSkillRouting.ts +++ b/src/core/modes/plan/planSkillRouting.ts @@ -14,6 +14,12 @@ export function resolvePlanningSkillNames( if (intent === 'audit' || taskAnalysis?.kind === 'audit') { names.push('audit-cleanup'); } + if (/\b(console\.log|inline style|missing types?|type annotations?|eslint|lint|tech debt|code smells?)\b/i.test(taskAnalysis?.summary ?? '')) { + names.push('code-smells-and-tech-debt'); + } + if (/\b(\.env|environment variable|missing keys?|secrets?|api keys?|tokens?)\b/i.test(taskAnalysis?.summary ?? '')) { + names.push('environment-and-secrets'); + } if (intent === 'bugfix' || taskAnalysis?.kind === 'question') { names.push('debugging-and-error-recovery'); } @@ -67,4 +73,5 @@ PLANNING SKILLS: - Call use_skill to load a workspace playbook when you need one not already injected below. - For task breakdown and phased plans, use_skill("planning-and-task-breakdown") if not pre-loaded. - For skill discovery/routing, use_skill("using-agent-skills") if not pre-loaded. +- For tech-debt and env/secrets tasks, prefer the bundled script-backed skills before manual inspection. - Follow loaded skill workflows: dependency graph, vertical slices, acceptance criteria, and verification commands per step.`; diff --git a/src/core/orchestration/ChatOrchestrator.ts b/src/core/orchestration/ChatOrchestrator.ts index e8e1dafa..fdbe060f 100644 --- a/src/core/orchestration/ChatOrchestrator.ts +++ b/src/core/orchestration/ChatOrchestrator.ts @@ -1,7 +1,8 @@ import * as vscode from 'vscode'; import { randomUUID } from 'crypto'; import type { ThunderDb } from '../indexing/ThunderDb'; -import type { LlmProvider, ChatMessage } from '../llm/types'; +import type { AssistantStreamChunk, LlmProvider, ChatMessage } from '../llm/types'; +import { chunkContent, toAssistantStreamChunk } from '../llm/streamChunks'; import type { ThunderSession } from '../session/ThunderSession'; import type { ContextItem, ContextPack } from '../context/types'; import type { @@ -69,9 +70,18 @@ import { estimateChatRequestTokens } from '../llm/UsageTrackingProvider'; import { resolveMaxContextItems } from '../context/resolveMaxContextItems'; import { enrichTask } from '../task'; import type { GitHubIssueFetcher } from '../integrations/github'; +import { detectMicroTask, type MicroTaskExecutor } from '../microtasks'; const log = createLogger('ChatOrchestrator'); +export const EMPTY_ASSISTANT_RESPONSE_MESSAGE = + 'I did not receive any response from the model for this turn. Please try again, or switch models if it keeps happening.'; + +export function normalizeAssistantResponse(fullResponse: string): { content: string; wasEmpty: boolean } { + if (fullResponse.trim()) return { content: fullResponse, wasEmpty: false }; + return { content: EMPTY_ASSISTANT_RESPONSE_MESSAGE, wasEmpty: true }; +} + export type ContextPackCallback = (pack: ContextPack, views: ContextItemView[], budget: ContextBudgetView) => void; export type PlanCallback = (plan: PlanView | null) => void; export type ActivityCallback = (entry: AgentActivityEntry) => void; @@ -109,6 +119,8 @@ export interface ChatOrchestratorDeps { githubTokenProvider?: () => Promise; githubIssueFetchEnabled?: boolean; githubIssueCommentLimit?: number; + microTaskExecutorFactory?: (provider: LlmProvider) => MicroTaskExecutor; + microTaskRoutingEnabled?: boolean; } export class ChatOrchestrator { @@ -197,6 +209,14 @@ export class ChatOrchestrator { }); } + private emitEmptyResponse(providerId: string): void { + this.emitActivity('error', 'Model returned an empty response', providerId); + this.deps.sessionLog?.append('error', 'Model returned an empty response', { + provider: providerId, + fallbackMessage: EMPTY_ASSISTANT_RESPONSE_MESSAGE, + }); + } + private setLiveStatus( label: string | null, detail?: string, @@ -215,8 +235,8 @@ export class ChatOrchestrator { provider: LlmProvider, userMessage: string, recentMessages: ChatMessage[] = [], - options?: { pinnedContext?: PinnedContextEntry[] } - ): AsyncIterable { + options?: { pinnedContext?: PinnedContextEntry[]; attachments?: ChatMessage['attachments'] } + ): AsyncIterable { this.abortController = new AbortController(); const signal = this.abortController.signal; const sessionLog = this.deps.sessionLog; @@ -233,6 +253,40 @@ export class ChatOrchestrator { auditMode: isAuditCleanupTask(userMessage), }); + const microTaskId = this.deps.microTaskRoutingEnabled === false || isApprovalContinuationMessage(userMessage) + ? null + : detectMicroTask(userMessage); + if (microTaskId && this.deps.microTaskExecutorFactory) { + this.setLiveStatus('Running micro-task', microTaskId.replace(/_/g, ' ')); + this.emitActivity('info', `Micro-task route: ${microTaskId}`, 'Using minimal Git/release context and no tools.'); + sessionTiming.start('microtask'); + const result = await this.deps.microTaskExecutorFactory(provider).execute(microTaskId, userMessage); + sessionTiming.end('microtask', sessionLog, result.metadata); + const normalizedResult = normalizeAssistantResponse(result.content); + const content = normalizedResult.content; + if (normalizedResult.wasEmpty) { + this.emitEmptyResponse(provider.id); + } + this.saveTurn(session.id, 'user', userMessage); + const emptyPack = emptyContextPack(); + await this.finishTurn( + session, + provider, + userMessage, + content, + emptyPack, + [], + Math.ceil(content.length / 4), + [ + { role: 'system', content: `Mitii micro-task: ${microTaskId}` }, + { role: 'user', content: userMessage }, + ] + ); + yield content; + this.setLiveStatus(null); + return; + } + const ws = this.deps.workspace ?? ''; const editor = vscode.window.activeTextEditor; const rawCurrentFile = editor && ws @@ -615,7 +669,7 @@ export class ChatOrchestrator { sharedPlanOptions )) { if (signal.aborted) break; - fullResponse += chunk; + fullResponse += chunkContent(chunk); yield chunk; } sessionTiming.end('plan_execution', sessionLog, { resumed: true, stepCount: plan.steps.length }); @@ -773,7 +827,7 @@ export class ChatOrchestrator { )) { if (signal.aborted) break; if (session.mode !== 'plan') { - fullResponse += chunk; + fullResponse += chunkContent(chunk); yield chunk; } } @@ -853,7 +907,7 @@ export class ChatOrchestrator { sharedPlanOptions )) { if (signal.aborted) break; - fullResponse += chunk; + fullResponse += chunkContent(chunk); yield chunk; } sessionTiming.end('plan_execution', sessionLog, { @@ -905,7 +959,7 @@ export class ChatOrchestrator { const isResume = isApprovalContinuationMessage(userMessage); const taskStateBlock = this.deps.taskState?.buildPromptBlock(); - const messages = buildPrompt( + const messages = attachImagesToLastUser(buildPrompt( session.mode, pack, userMessage, @@ -923,7 +977,7 @@ export class ChatOrchestrator { actPlan?.promptContext, ...taskEnrichment.contextBlocks ) - ); + ), options?.attachments); const promptTokens = estimateChatRequestTokens({ messages, tools: tools.length > 0 ? tools : undefined, @@ -974,7 +1028,7 @@ export class ChatOrchestrator { } )) { if (signal.aborted) break; - fullResponse += chunk; + fullResponse += chunkContent(chunk); emitLiveTokenUsage(); yield chunk; } @@ -1051,7 +1105,7 @@ export class ChatOrchestrator { } )) { if (signal.aborted) break; - fullResponse += chunk; + fullResponse += chunkContent(chunk); emitLiveTokenUsage(); yield chunk; } @@ -1065,12 +1119,20 @@ export class ChatOrchestrator { if (delta.content) { fullResponse += delta.content; emitLiveTokenUsage(); - yield delta.content; } + const chunk = toAssistantStreamChunk(delta.content, delta.reasoning); + if (chunk) yield chunk; if (delta.error) throw new Error(delta.error); } } + const normalizedResponse = normalizeAssistantResponse(fullResponse); + if (normalizedResponse.wasEmpty) { + fullResponse = normalizedResponse.content; + this.emitEmptyResponse(provider.id); + yield fullResponse; + } + await this.finishTurn( session, provider, @@ -1109,7 +1171,11 @@ export class ChatOrchestrator { const tokens = promptTokens || estimateChatRequestTokens({ messages: usageMessages }); this.emitTurnTokenUsage(tokens, pack, fullResponse, usageMessages, compacted); - if (!fullResponse) return; + const normalizedResponse = normalizeAssistantResponse(fullResponse); + fullResponse = normalizedResponse.content; + if (normalizedResponse.wasEmpty) { + this.emitEmptyResponse(provider.id); + } this.saveTurn(session.id, 'assistant', fullResponse); this.deps.sessionLog?.append('assistant_message', fullResponse.slice(0, 200), { @@ -1324,7 +1390,7 @@ export class ChatOrchestrator { return Boolean(this.agentLoop?.getSuspendState() && this.suspendContext); } - async *resumeAfterApproval(approved: ApprovedToolResult[]): AsyncIterable { + async *resumeAfterApproval(approved: ApprovedToolResult[]): AsyncIterable { if (!this.agentLoop || !this.suspendContext || approved.length === 0) return; const baseState = this.agentLoop.getSuspendState(); @@ -1377,7 +1443,7 @@ export class ChatOrchestrator { sharedLoopCallbacks )) { if (signal.aborted) break; - fullResponse += chunk; + fullResponse += chunkContent(chunk); yield chunk; } @@ -1716,6 +1782,36 @@ function mergePromptContexts(...blocks: Array): string | und return [...new Set(merged)].join('\n\n---\n\n'); } +function attachImagesToLastUser( + messages: ChatMessage[], + attachments: ChatMessage['attachments'] | undefined +): ChatMessage[] { + const images = attachments?.filter((attachment) => attachment.kind === 'image') ?? []; + if (images.length === 0) return messages; + const next = [...messages]; + for (let index = next.length - 1; index >= 0; index -= 1) { + if (next[index].role !== 'user') continue; + next[index] = { + ...next[index], + attachments: [...(next[index].attachments ?? []), ...images], + }; + return next; + } + return [...next, { role: 'user', content: 'Attached image context.', attachments: images }]; +} + +function emptyContextPack(): ContextPack { + return { + items: [], + totalTokens: 0, + formatted: '', + retrievedCount: 0, + budgetLimit: 0, + dropped: [], + truncatedCount: 0, + }; +} + export function contextPackToBudgetView(pack: ContextPack): ContextBudgetView { const sourceMap = new Map(); for (const item of pack.items) { diff --git a/src/core/plans/promptBuilder.ts b/src/core/plans/promptBuilder.ts index feef8fcd..31ba2be1 100644 --- a/src/core/plans/promptBuilder.ts +++ b/src/core/plans/promptBuilder.ts @@ -187,7 +187,7 @@ RULES: - The user's message may include a block with files/folders they pinned. Treat that as highest priority — focus there first before wider codebase context. - The user's message includes a ## Codebase Context section with real project files. READ IT and answer from it. - If ## Codebase Context includes a repo_map/workspace overview, use that provided map first. Do NOT repeatedly call list_files for the same structure unless the map is absent or demonstrably stale. -- Project rule files in context (AGENTS.md, CLAUDE.md, .mitii/rules, .clinerules, .continue/rules, etc.) are operating instructions for this workspace. Follow them unless they conflict with explicit user instructions or safety policy. +- \`MITII.md\` in context is the operating instructions file for this workspace. Follow it unless it conflicts with explicit user instructions or safety policy. - Focus on files and topics the user asked about. Do NOT pivot to unrelated open tabs or linter diagnostics unless the user asked to fix errors. - NEVER ask the user to paste README, package.json, or source files — they are already in context. - NEVER say context is "truncated" or "not fully visible" if file content appears in context — use what is provided. diff --git a/src/core/providers/ProviderProfilesService.ts b/src/core/providers/ProviderProfilesService.ts new file mode 100644 index 00000000..701939f6 --- /dev/null +++ b/src/core/providers/ProviderProfilesService.ts @@ -0,0 +1,182 @@ +import { createHash, randomUUID } from 'crypto'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; +import type { ProviderSettingsPayload } from '../config/ui/payloads'; +import { ensureThunderDir } from '../indexing/paths'; +import { createLogger } from '../telemetry/Logger'; + +const log = createLogger('ProviderProfilesService'); + +export interface ProviderProfileView { + id: string; + name: string; + providerType: ProviderSettingsPayload['providerType']; + baseUrl: string; + model: string; + apiVersion: string; + region: string; + contextWindow: number; + hasApiKey: boolean; +} + +interface ProviderProfileRecord { + id: string; + name: string; + providerType: ProviderSettingsPayload['providerType']; + baseUrl: string; + model: string; + apiVersion: string; + region: string; + contextWindow: number; + apiKeyHash?: string; +} + +interface ProviderProfilesFile { + activeId: string | null; + profiles: ProviderProfileRecord[]; +} + +export function hashProviderApiKey(key: string): string { + return createHash('sha256').update(key.trim()).digest('hex'); +} + +export function providerSecretRef(profileId: string): string { + return `mitii.provider.${profileId}`; +} + +function providersDir(workspace: string): string { + const dir = join(ensureThunderDir(workspace), 'providers'); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + return dir; +} + +function indexPath(workspace: string): string { + return join(providersDir(workspace), 'index.json'); +} + +function readProfilesFile(workspace: string): ProviderProfilesFile { + const file = indexPath(workspace); + if (!existsSync(file)) { + return { activeId: null, profiles: [] }; + } + try { + const parsed = JSON.parse(readFileSync(file, 'utf-8')) as ProviderProfilesFile; + return { + activeId: parsed.activeId ?? null, + profiles: Array.isArray(parsed.profiles) ? parsed.profiles : [], + }; + } catch (error) { + log.warn('Could not read provider profiles', { + error: error instanceof Error ? error.message : String(error), + }); + return { activeId: null, profiles: [] }; + } +} + +function writeProfilesFile(workspace: string, data: ProviderProfilesFile): void { + const file = indexPath(workspace); + writeFileSync(file, `${JSON.stringify(data, null, 2)}\n`, 'utf-8'); +} + +function toView(profile: ProviderProfileRecord): ProviderProfileView { + return { + id: profile.id, + name: profile.name, + providerType: profile.providerType, + baseUrl: profile.baseUrl, + model: profile.model, + apiVersion: profile.apiVersion, + region: profile.region, + contextWindow: profile.contextWindow, + hasApiKey: Boolean(profile.apiKeyHash), + }; +} + +export class ProviderProfilesService { + constructor(private readonly workspace: string) {} + + list(): ProviderProfileView[] { + if (!this.workspace) return []; + return readProfilesFile(this.workspace).profiles.map(toView); + } + + getActiveId(): string | null { + if (!this.workspace) return null; + return readProfilesFile(this.workspace).activeId; + } + + getActive(): ProviderProfileView | null { + if (!this.workspace) return null; + const file = readProfilesFile(this.workspace); + const active = file.profiles.find((profile) => profile.id === file.activeId); + return active ? toView(active) : null; + } + + getById(id: string): ProviderProfileView | null { + if (!this.workspace) return null; + const profile = readProfilesFile(this.workspace).profiles.find((item) => item.id === id); + return profile ? toView(profile) : null; + } + + upsert( + settings: ProviderSettingsPayload, + options: { id?: string; name?: string; apiKey?: string } + ): ProviderProfileView { + if (!this.workspace.trim()) { + throw new Error('Open a workspace to save provider profiles under .mitii/providers.'); + } + + const file = readProfilesFile(this.workspace); + const id = options.id ?? randomUUID(); + const existing = file.profiles.find((profile) => profile.id === id); + const name = + options.name?.trim() || + existing?.name || + `${settings.providerType} / ${settings.model}`.slice(0, 64); + + const next: ProviderProfileRecord = { + id, + name, + providerType: settings.providerType, + baseUrl: settings.baseUrl.trim(), + model: settings.model.trim(), + apiVersion: settings.apiVersion?.trim() ?? '', + region: settings.region?.trim() ?? '', + contextWindow: settings.contextWindow, + apiKeyHash: + options.apiKey?.trim() + ? hashProviderApiKey(options.apiKey) + : existing?.apiKeyHash, + }; + + const profiles = existing + ? file.profiles.map((profile) => (profile.id === id ? next : profile)) + : [...file.profiles, next]; + + writeProfilesFile(this.workspace, { + activeId: file.activeId ?? id, + profiles, + }); + + return toView(next); + } + + setActive(id: string): ProviderProfileView | null { + if (!this.workspace.trim()) return null; + const file = readProfilesFile(this.workspace); + const profile = file.profiles.find((item) => item.id === id); + if (!profile) return null; + writeProfilesFile(this.workspace, { ...file, activeId: id }); + return toView(profile); + } + + delete(id: string): void { + if (!this.workspace.trim()) return; + const file = readProfilesFile(this.workspace); + const profiles = file.profiles.filter((profile) => profile.id !== id); + const activeId = file.activeId === id ? profiles[0]?.id ?? null : file.activeId; + writeProfilesFile(this.workspace, { activeId, profiles }); + } +} diff --git a/src/core/release/ChangelogGenerator.ts b/src/core/release/ChangelogGenerator.ts new file mode 100644 index 00000000..cac6750e --- /dev/null +++ b/src/core/release/ChangelogGenerator.ts @@ -0,0 +1,55 @@ +import type { ConventionalCommit } from './GitHistoryCollector'; + +export interface ReleaseMarkdownInput { + commits: ConventionalCommit[]; + version: string; + date: Date; +} + +export function generateChangelogEntry(input: ReleaseMarkdownInput): string { + const date = formatDate(input.date); + const groups = groupCommits(input.commits); + const lines = [`## [${input.version}] - ${date}`, '']; + + appendSection(lines, 'Breaking', groups.breaking); + appendSection(lines, 'Added', groups.added); + appendSection(lines, 'Fixed', groups.fixed); + appendSection(lines, 'Changed', groups.changed); + + if (input.commits.length === 0) { + lines.push('No commits found since the selected tag.', ''); + } + return lines.join('\n').trimEnd() + '\n'; +} + +export function insertChangelogEntry(existing: string, entry: string): string { + const normalized = existing.trim() || '# Changelog\n\n## [Unreleased]\n'; + if (/## \[Unreleased\]/.test(normalized)) { + return normalized.replace(/(## \[Unreleased\][^\n]*)/, `$1\n\n${entry.trimEnd()}`).trimEnd() + '\n'; + } + return `${normalized}\n\n## [Unreleased]\n\n${entry}`.trimEnd() + '\n'; +} + +function groupCommits(commits: ConventionalCommit[]) { + return { + breaking: commits.filter((c) => c.breaking), + added: commits.filter((c) => c.type === 'feat' && !c.breaking), + fixed: commits.filter((c) => c.type === 'fix' && !c.breaking), + changed: commits.filter((c) => !c.breaking && c.type !== 'feat' && c.type !== 'fix'), + }; +} + +function appendSection(lines: string[], title: string, commits: ConventionalCommit[]): void { + if (commits.length === 0) return; + lines.push(`### ${title}`); + for (const commit of commits) { + const scope = commit.scope ? `**${commit.scope}:** ` : ''; + const hash = commit.hash ? ` (${commit.hash})` : ''; + lines.push(`- ${scope}${commit.description}${hash}`); + } + lines.push(''); +} + +function formatDate(date: Date): string { + return date.toISOString().slice(0, 10); +} diff --git a/src/core/release/GitHistoryCollector.ts b/src/core/release/GitHistoryCollector.ts new file mode 100644 index 00000000..57560d16 --- /dev/null +++ b/src/core/release/GitHistoryCollector.ts @@ -0,0 +1,80 @@ +import simpleGit, { type SimpleGit } from 'simple-git'; + +export interface ConventionalCommit { + hash: string; + subject: string; + type: string; + scope?: string; + description: string; + breaking: boolean; + body?: string; +} + +export class GitHistoryCollector { + private readonly git: SimpleGit; + + constructor(workspace: string) { + this.git = simpleGit(workspace); + } + + async getTags(): Promise { + try { + const tags = await this.git.tags(); + return tags.all; + } catch { + return []; + } + } + + async getLatestTag(): Promise { + try { + const tag = await this.git.raw(['describe', '--tags', '--abbrev=0']); + return tag.trim() || null; + } catch { + return null; + } + } + + async getCommitsSinceTag(tag?: string): Promise { + try { + const range = tag ? `${tag}..HEAD` : 'HEAD'; + const raw = await this.git.raw([ + 'log', + range, + '--pretty=format:%H%x1f%s%x1f%b%x1e', + ]); + return raw + .split('\x1e') + .map((entry) => entry.trim()) + .filter(Boolean) + .map(parseCommitRecord); + } catch { + return []; + } + } +} + +export function parseCommitRecord(record: string): ConventionalCommit { + const [hash = '', subject = '', body = ''] = record.split('\x1f'); + const parsed = parseConventionalSubject(subject, body); + return { + hash: hash.slice(0, 12), + subject, + body: body.trim() || undefined, + ...parsed, + }; +} + +export function parseConventionalSubject(subject: string, body = ''): Omit { + const match = subject.match(/^([a-z]+)(?:\(([^)]+)\))?(!)?:\s+(.+)$/i); + const breaking = Boolean(match?.[3]) || /\bBREAKING CHANGE:/i.test(body); + if (!match) { + return { type: 'other', description: subject.trim(), breaking }; + } + return { + type: match[1].toLowerCase(), + scope: match[2], + description: match[4].trim(), + breaking, + }; +} diff --git a/src/core/release/ReleaseNotesGenerator.ts b/src/core/release/ReleaseNotesGenerator.ts new file mode 100644 index 00000000..9a8d130a --- /dev/null +++ b/src/core/release/ReleaseNotesGenerator.ts @@ -0,0 +1,39 @@ +import type { ReleaseMarkdownInput } from './ChangelogGenerator'; + +export function generateReleaseNotes(input: ReleaseMarkdownInput): string { + const highlights = input.commits.filter((c) => c.type === 'feat' || c.breaking).slice(0, 5); + const fixes = input.commits.filter((c) => c.type === 'fix').slice(0, 6); + const lines = [`# Mitii ${input.version} Release Notes`, '']; + + if (highlights.length > 0) { + lines.push('## Highlights'); + for (const commit of highlights) { + lines.push(`- ${commit.description}`); + } + lines.push(''); + } + + if (fixes.length > 0) { + lines.push('## Fixes'); + for (const commit of fixes) { + lines.push(`- ${commit.description}`); + } + lines.push(''); + } + + const breaking = input.commits.filter((c) => c.breaking); + if (breaking.length > 0) { + lines.push('## Migration Notes'); + for (const commit of breaking) { + lines.push(`- ${commit.description}`); + } + lines.push(''); + } + + if (input.commits.length === 0) { + lines.push('No user-facing changes were found for this range.', ''); + } + + return lines.join('\n').trimEnd() + '\n'; +} + diff --git a/src/core/release/index.ts b/src/core/release/index.ts new file mode 100644 index 00000000..c45503b4 --- /dev/null +++ b/src/core/release/index.ts @@ -0,0 +1,4 @@ +export * from './GitHistoryCollector'; +export * from './ChangelogGenerator'; +export * from './ReleaseNotesGenerator'; + diff --git a/src/core/rules/ProjectRulesService.ts b/src/core/rules/ProjectRulesService.ts index f4374342..74648d03 100644 --- a/src/core/rules/ProjectRulesService.ts +++ b/src/core/rules/ProjectRulesService.ts @@ -1,30 +1,11 @@ -import { existsSync, readdirSync, readFileSync, statSync } from 'fs'; +import { existsSync, readFileSync, statSync } from 'fs'; import { join } from 'path'; import type { ContextItem, ContextQuery, ContextSource } from '../context/types'; import { createLogger } from '../telemetry/Logger'; const log = createLogger('ProjectRulesService'); -const RULE_FILES = [ - 'AGENTS.md', - 'CLAUDE.md', - 'WARP.md', - '.cursorrules', - '.clinerules', -]; - -const RULE_DIRS = [ - '.mitii/rules', - '.mitii/agents', - '.mitii/checks', - '.mitii/prompts', - '.clinerules', - '.continue/rules', - '.continue/agents', - '.continue/checks', - '.continue/prompts', - '.cursor/rules', -]; +const RULE_FILE = 'MITII.md'; export interface ProjectRuleFile { relPath: string; @@ -34,36 +15,15 @@ export interface ProjectRuleFile { export class ProjectRulesService { constructor(private readonly workspace: string) {} - load(maxFiles = 24, maxCharsPerFile = 5000): ProjectRuleFile[] { + load(maxCharsPerFile = 5000): ProjectRuleFile[] { if (!this.workspace) return []; const files: ProjectRuleFile[] = []; - - for (const relPath of RULE_FILES) { - this.tryAddFile(files, relPath, maxCharsPerFile); - } - - for (const relDir of RULE_DIRS) { - const absDir = join(this.workspace, relDir); - if (!existsSync(absDir)) continue; - if (!statSync(absDir).isDirectory()) continue; - try { - for (const entry of walkRuleDir(this.workspace, relDir, 2)) { - this.tryAddFile(files, entry, maxCharsPerFile); - if (files.length >= maxFiles) return files; - } - } catch (error) { - log.warn('Could not read rules directory', { - relDir, - error: error instanceof Error ? error.message : String(error), - }); - } - } - - return files.slice(0, maxFiles); + this.tryAddFile(files, RULE_FILE, maxCharsPerFile); + return files; } count(): number { - return this.load(200, 1).length; + return this.load(1).length; } private tryAddFile(files: ProjectRuleFile[], relPath: string, maxChars: number): void { @@ -75,8 +35,11 @@ export class ProjectRulesService { if (!st.isFile() || st.size > 256_000) return; const content = readFileSync(abs, 'utf-8').slice(0, maxChars).trim(); if (content) files.push({ relPath, content }); - } catch { - // Ignore unreadable rule files. + } catch (error) { + log.warn('Could not read project rules file', { + relPath, + error: error instanceof Error ? error.message : String(error), + }); } } } @@ -98,22 +61,3 @@ export class ProjectRulesContextSource implements ContextSource { })); } } - -function walkRuleDir(workspace: string, relDir: string, maxDepth: number): string[] { - const out: string[] = []; - const walk = (currentRel: string, depth: number) => { - if (depth > maxDepth) return; - const abs = join(workspace, currentRel); - const entries = readdirSync(abs, { withFileTypes: true }); - for (const entry of entries) { - const childRel = `${currentRel}/${entry.name}`; - if (entry.isDirectory()) { - walk(childRel, depth + 1); - } else if (/\.(md|mdc)$/i.test(entry.name) || entry.name === '.cursorrules') { - out.push(childRel); - } - } - }; - walk(relDir, 0); - return out.sort(); -} diff --git a/src/core/runtime/AgentLoop.ts b/src/core/runtime/AgentLoop.ts index 57c4e757..c42fa7ab 100644 --- a/src/core/runtime/AgentLoop.ts +++ b/src/core/runtime/AgentLoop.ts @@ -1,5 +1,6 @@ -import type { LlmProvider, ChatMessage } from '../llm/types'; +import type { AssistantStreamChunk, LlmProvider, ChatMessage } from '../llm/types'; import type { ToolDefinition, ToolCall } from '../llm/toolTypes'; +import { toAssistantStreamChunk } from '../llm/streamChunks'; import type { ToolExecutor } from '../safety/ToolExecutor'; import { formatToolResult } from '../tools/builtinTools'; import { NO_TOOLS_AUDIT_NUDGE } from './taskKind'; @@ -109,7 +110,7 @@ export class AgentLoop { signal?: AbortSignal, callbacks?: AgentLoopCallbacks, options?: AgentLoopOptions - ): AsyncIterable { + ): AsyncIterable { const messages: ChatMessage[] = [...initialMessages]; let pendingApproval = false; this.lastPendingApproval = false; @@ -158,8 +159,9 @@ export class AgentLoop { if (delta.error) throw new Error(delta.error); if (delta.content) { stepContent += delta.content; - yield delta.content; } + const chunk = toAssistantStreamChunk(delta.content, delta.reasoning); + if (chunk) yield chunk; if (delta.tool_calls) { for (const partial of delta.tool_calls) { const existing = toolCallsMap.get(partial.index); @@ -432,7 +434,8 @@ export class AgentLoop { })) { if (signal?.aborted) break; if (delta.error) throw new Error(delta.error); - if (delta.content) yield delta.content; + const chunk = toAssistantStreamChunk(delta.content, delta.reasoning); + if (chunk) yield chunk; if (delta.done) break; } } @@ -447,7 +450,7 @@ export class AgentLoop { approved: ApprovedToolResult[], signal?: AbortSignal, callbacks?: AgentLoopCallbacks - ): AsyncIterable { + ): AsyncIterable { const messages: ChatMessage[] = state.messages.map((m) => ({ ...m })); const tools = state.tools; const options = state.options; @@ -537,8 +540,9 @@ export class AgentLoop { if (delta.error) throw new Error(delta.error); if (delta.content) { stepContent += delta.content; - yield delta.content; } + const chunk = toAssistantStreamChunk(delta.content, delta.reasoning); + if (chunk) yield chunk; if (delta.tool_calls) { for (const partial of delta.tool_calls) { const existing = toolCallsMap.get(partial.index); diff --git a/src/core/runtime/PlanExecutor.ts b/src/core/runtime/PlanExecutor.ts index 1dcc7770..d4bae3aa 100644 --- a/src/core/runtime/PlanExecutor.ts +++ b/src/core/runtime/PlanExecutor.ts @@ -1,5 +1,6 @@ -import type { LlmProvider } from '../llm/types'; +import type { AssistantStreamChunk, LlmProvider } from '../llm/types'; import type { ToolDefinition } from '../llm/toolTypes'; +import { chunkContent } from '../llm/streamChunks'; import type { ThunderSession } from '../session/ThunderSession'; import type { PlanPhase, ThunderPlan } from '../plans/PlanActEngine'; import { @@ -231,7 +232,7 @@ export class PlanExecutor { maxAutoContinues: options?.planMaxAutoContinues ?? 1, } )) { - output += chunk; + output += chunkContent(chunk); if (output.length > 12_000) { output = output.slice(-12_000); } @@ -251,7 +252,7 @@ export class PlanExecutor { signal?: AbortSignal, loopCallbacks?: AgentLoopCallbacks, options?: PlanExecutorOptions - ): AsyncIterable { + ): AsyncIterable { this.stepSummaries = []; this.touchedFiles.clear(); const maxRetries = options?.stepMaxRetries ?? 2; @@ -392,7 +393,7 @@ export class PlanExecutor { } )) { yield chunk; - stepOutput += chunk; + stepOutput += chunkContent(chunk); } pendingApproval = this.agentLoop.hadPendingApproval(); } @@ -539,7 +540,7 @@ export class PlanExecutor { signal?: AbortSignal, loopCallbacks?: AgentLoopCallbacks, options?: PlanExecutorOptions - ): AsyncIterable { + ): AsyncIterable { const touchedFiles = options?.touchedFiles ?? Array.from(this.touchedFiles); const workspaceErrors = await this.collectWorkspaceErrors(touchedFiles); const verifyContextBlock = options?.workspace diff --git a/src/core/safety/ToolExecutor.ts b/src/core/safety/ToolExecutor.ts index 1cc4c1d0..870e6f0c 100644 --- a/src/core/safety/ToolExecutor.ts +++ b/src/core/safety/ToolExecutor.ts @@ -137,9 +137,22 @@ export class ToolExecutor { if (policy.decision === 'require_approval') { if (!this.approvalQueue.hasApprovalGrant(sessionId, resolvedName)) { - this.approvalQueue.createRequest(sessionId, resolvedName, input, policy, { + const request = this.approvalQueue.createRequest(sessionId, resolvedName, input, policy, { toolCallId: context?.toolCallId, }); + this.sessionLog?.append('approval_request', `${request.kind ?? 'approval'}: ${resolvedName}`, { + id: request.id, + toolName: request.toolName, + kind: request.kind, + risk: request.risk, + reason: request.reason, + files: request.files, + contentLength: request.contentLength, + question: request.question, + options: request.options, + optionCount: request.options?.length ?? 0, + toolCallId: request.toolCallId, + }); this.onPendingApproval?.(); this.logRejectedToolCall(resolvedName, input, false, 'Awaiting approval', 'Awaiting approval'); return { success: false, output: '', pendingApproval: true, error: 'Awaiting approval' }; diff --git a/src/core/scm/GitDiffCollector.ts b/src/core/scm/GitDiffCollector.ts index 70773409..fa99ae0b 100644 --- a/src/core/scm/GitDiffCollector.ts +++ b/src/core/scm/GitDiffCollector.ts @@ -3,7 +3,12 @@ import type { CommitMessageInput } from './commitMessageTypes'; export async function collectCommitMessageInput( git: GitService, - options: { scope?: string; stagedDiffMaxChars?: number; unstagedDiffMaxChars?: number } = {} + options: { + scope?: string; + stagedDiffMaxChars?: number; + unstagedDiffMaxChars?: number; + perFileMaxChars?: number; + } = {} ): Promise { const [stagedDiff, unstagedDiff, changedFiles, recentCommits, branch] = await Promise.all([ git.getStagedDiff(options.stagedDiffMaxChars ?? 16_000), @@ -14,11 +19,40 @@ export async function collectCommitMessageInput( ]); return { - stagedDiff, - unstagedDiff, + stagedDiff: budgetDiff(stagedDiff, { + totalMaxChars: options.stagedDiffMaxChars ?? 16_000, + perFileMaxChars: options.perFileMaxChars, + }), + unstagedDiff: budgetDiff(unstagedDiff, { + totalMaxChars: options.unstagedDiffMaxChars ?? 8_000, + perFileMaxChars: options.perFileMaxChars, + }), changedFiles, recentCommits, branch, scope: options.scope, }; } + +export function budgetDiff( + diff: string, + options: { totalMaxChars: number; perFileMaxChars?: number } +): string { + if (!diff || diff.length <= options.totalMaxChars && !options.perFileMaxChars) { + return diff; + } + + const perFileMax = options.perFileMaxChars ?? options.totalMaxChars; + const files = diff.split(/(?=^diff --git )/m).filter(Boolean); + const budgeted = files.map((fileDiff) => { + if (fileDiff.length <= perFileMax) return fileDiff; + const header = fileDiff + .split(/\r?\n/) + .filter((line) => /^(diff --git|index |--- |\+\+\+ |@@ )/.test(line)) + .join('\n'); + return `${header}\n[diff truncated: ${fileDiff.length - header.length} chars omitted]\n`; + }).join(''); + + if (budgeted.length <= options.totalMaxChars) return budgeted; + return `${budgeted.slice(0, options.totalMaxChars)}\n[diff truncated: ${budgeted.length - options.totalMaxChars} chars omitted]\n`; +} diff --git a/src/core/scm/ReviewDiffCollector.ts b/src/core/scm/ReviewDiffCollector.ts new file mode 100644 index 00000000..22bf8e4a --- /dev/null +++ b/src/core/scm/ReviewDiffCollector.ts @@ -0,0 +1,95 @@ +import type { GitService } from '../context/GitService'; +import { budgetDiff } from './GitDiffCollector'; + +export interface ReviewDiffFile { + path: string; + status: string; + additions: number; + deletions: number; + diff: string; +} + +export interface ReviewDiff { + branch: string | null; + files: ReviewDiffFile[]; + summary: { + fileCount: number; + additions: number; + deletions: number; + }; + truncated: boolean; + updatedAt: number; +} + +export async function collectReviewDiff( + git: GitService, + options: { totalMaxChars?: number; perFileMaxChars?: number } = {} +): Promise { + const totalMaxChars = options.totalMaxChars ?? 32_000; + const perFileMaxChars = options.perFileMaxChars ?? 8_000; + const [branch, changedFiles, stagedDiff, unstagedDiff] = await Promise.all([ + git.getCurrentBranch(), + git.getChangedFilesDetailed(), + git.getStagedDiff(totalMaxChars), + git.getUnstagedDiff(totalMaxChars), + ]); + + const combined = [stagedDiff, unstagedDiff].filter(Boolean).join('\n'); + const budgeted = budgetDiff(combined, { totalMaxChars, perFileMaxChars }); + const files = parseReviewDiffFiles(budgeted, changedFiles); + return { + branch, + files, + summary: { + fileCount: files.length, + additions: files.reduce((sum, file) => sum + file.additions, 0), + deletions: files.reduce((sum, file) => sum + file.deletions, 0), + }, + truncated: combined.length > budgeted.length || /\[diff truncated:/.test(budgeted), + updatedAt: Date.now(), + }; +} + +export function parseReviewDiffFiles(diff: string, changedFiles: string[] = []): ReviewDiffFile[] { + const statusByPath = new Map(); + for (const line of changedFiles) { + const [status, ...pathParts] = line.split(/\s+/); + const path = pathParts[pathParts.length - 1]; + if (status && path) statusByPath.set(path, status); + } + + const chunks = diff.split(/(?=^diff --git )/m).filter(Boolean); + const parsed = chunks.map((chunk) => { + const path = parseDiffPath(chunk); + const additions = chunk.split(/\r?\n/).filter((line) => line.startsWith('+') && !line.startsWith('+++')).length; + const deletions = chunk.split(/\r?\n/).filter((line) => line.startsWith('-') && !line.startsWith('---')).length; + return { + path, + status: statusByPath.get(path) ?? inferStatus(chunk), + additions, + deletions, + diff: chunk.trimEnd(), + }; + }); + + if (parsed.length > 0) return parsed; + return [...statusByPath.entries()].map(([path, status]) => ({ + path, + status, + additions: 0, + deletions: 0, + diff: '', + })); +} + +function parseDiffPath(chunk: string): string { + const header = chunk.match(/^diff --git a\/(.+?) b\/(.+)$/m); + return header?.[2] ?? header?.[1] ?? 'unknown'; +} + +function inferStatus(chunk: string): string { + if (/^new file mode /m.test(chunk)) return 'A'; + if (/^deleted file mode /m.test(chunk)) return 'D'; + if (/^rename from /m.test(chunk)) return 'R'; + return 'M'; +} diff --git a/src/core/scm/index.ts b/src/core/scm/index.ts index cd5f66c1..bff3fe06 100644 --- a/src/core/scm/index.ts +++ b/src/core/scm/index.ts @@ -2,3 +2,4 @@ export * from './commitMessageTypes'; export * from './commitMessagePrompt'; export * from './CommitMessageGenerator'; export * from './GitDiffCollector'; +export * from './ReviewDiffCollector'; diff --git a/src/core/session/ThunderSession.ts b/src/core/session/ThunderSession.ts index babe2fbe..93b54d34 100644 --- a/src/core/session/ThunderSession.ts +++ b/src/core/session/ThunderSession.ts @@ -31,13 +31,17 @@ export class ThunderSession { readonly createdAt: number; updatedAt: number; - constructor(workspace: string, mode: ThunderMode = 'plan') { - this.id = randomUUID(); + constructor( + workspace: string, + mode: ThunderMode = 'plan', + restored?: { id?: string; title?: string | null; createdAt?: number; updatedAt?: number } + ) { + this.id = restored?.id?.trim() || randomUUID(); this.workspace = workspace; this.mode = normalizeThunderMode(mode); - this.title = null; - this.createdAt = Date.now(); - this.updatedAt = this.createdAt; + this.title = restored?.title ?? null; + this.createdAt = restored?.createdAt ?? Date.now(); + this.updatedAt = restored?.updatedAt ?? this.createdAt; } touch(): void { diff --git a/bundled-skills/README.md b/src/core/skills/bundled/README.md similarity index 100% rename from bundled-skills/README.md rename to src/core/skills/bundled/README.md diff --git a/bundled-skills/audit-cleanup/SKILL.md b/src/core/skills/bundled/audit-cleanup/SKILL.md similarity index 62% rename from bundled-skills/audit-cleanup/SKILL.md rename to src/core/skills/bundled/audit-cleanup/SKILL.md index e4cf41ba..0f2ef03d 100644 --- a/bundled-skills/audit-cleanup/SKILL.md +++ b/src/core/skills/bundled/audit-cleanup/SKILL.md @@ -14,12 +14,15 @@ Scripts use AST parsing and finish in **~3s**. 1. `execute_workspace_script({ script: "audit-dependencies.mjs" })` — depcheck, all deps at once 2. `execute_workspace_script({ script: "audit-dead-code.sh" })` — knip: unused files, deps, exports -3. read_file `package.json` only if scripts are unavailable -4. Classify: **high** (safe), **medium** (likely), **low** (review) -5. Plan mode: report only. Act mode: remove after user confirms +3. `execute_workspace_script({ script: "check-circular-deps.mjs" })` — dependency cycles and import graph risks +4. `execute_workspace_script({ script: "audit-package-engines.mjs" })` — Node/npm/VS Code engine drift +5. read_file `package.json` only if scripts are unavailable +6. Classify: **high** (safe), **medium** (likely), **low** (review) +7. Plan mode: report only. Act mode: remove after user confirms ## Do NOT - spawn_research_agent to grep each dependency - search package-by-package through 18 prod + 46 dev deps - re-run depcheck after script output is in chat history +- replace deterministic scripts with LLM-only investigation diff --git a/src/core/skills/bundled/browser-testing-with-devtools/SKILL.md b/src/core/skills/bundled/browser-testing-with-devtools/SKILL.md new file mode 100644 index 00000000..86b40358 --- /dev/null +++ b/src/core/skills/bundled/browser-testing-with-devtools/SKILL.md @@ -0,0 +1,39 @@ +--- +name: browser-testing-with-devtools +description: Browser automation and UI verification with Puppeteer MCP for React, Next.js, and web apps. +--- + +# Browser testing with Puppeteer + +Use this skill when validating UI behavior, screenshots, or client-side flows in JavaScript web apps. + +## When to use + +- React / Next.js / Vite UI verification +- Screenshot or DOM assertions after Agent edits +- Smoke-testing pages in benchmark or CI fixtures + +## MCP setup + +Mitii preloads `@modelcontextprotocol/server-puppeteer` when `thunder.mcp.builtinServers.puppeteer` is enabled. + +Headless CLI: + +```bash +mitii agent "Open the home page and verify the title" --runtime real --enable-puppeteer --approval auto +``` + +## Tools + +- `mcp__puppeteer__puppeteer_navigate` +- `mcp__puppeteer__puppeteer_screenshot` +- `mcp__puppeteer__puppeteer_click` +- `mcp__puppeteer__puppeteer_fill` +- `mcp__puppeteer__puppeteer_evaluate` + +## Workflow + +1. Start or assume a local dev server (`npm run dev`) when testing a fixture repo. +2. Navigate to the page under test. +3. Capture screenshot or evaluate DOM selectors. +4. Report pass/fail with evidence in the session log. diff --git a/bundled-skills/code-review-and-quality/SKILL.md b/src/core/skills/bundled/code-review-and-quality/SKILL.md similarity index 100% rename from bundled-skills/code-review-and-quality/SKILL.md rename to src/core/skills/bundled/code-review-and-quality/SKILL.md diff --git a/src/core/skills/bundled/code-smells-and-tech-debt/SKILL.md b/src/core/skills/bundled/code-smells-and-tech-debt/SKILL.md new file mode 100644 index 00000000..e92e4138 --- /dev/null +++ b/src/core/skills/bundled/code-smells-and-tech-debt/SKILL.md @@ -0,0 +1,31 @@ +--- +name: code-smells-and-tech-debt +description: Find and classify console logs, inline styles, missing type annotations, and targeted lint issues. Use for tech-debt cleanup, lint hygiene, console.log removal, style cleanup, and missing TypeScript types. +--- + +# Code Smells and Tech Debt + +Use deterministic scripts first, then inspect only the files that matter. Do not run broad manual grep before the scripts have summarized the workspace. + +## Steps + +1. `execute_workspace_script({ script: "find-console-logs.sh" })` — report committed debugging logs and risky console usage +2. `execute_workspace_script({ script: "find-inline-styles.sh" })` — report inline style usage that may violate UI conventions +3. `execute_workspace_script({ script: "check-missing-types.sh" })` — report missing annotations and weak typing hotspots +4. `execute_workspace_script({ script: "safe-lint-target.sh", args: [""] })` — run targeted lint/type checks only after choosing touched files +5. Classify findings: + - **fix now**: unsafe logs, obvious type holes, lint errors in touched files + - **defer**: broad refactors, generated files, low-risk style cleanup outside scope + - **ignore**: intentional diagnostics, examples, tests where console output is asserted + +## Mode Rules + +- Plan mode: report findings, risk, and proposed fix order only. +- Act mode: make scoped fixes after the task explicitly asks for cleanup or after the user approves the finding list. +- Keep behavioral changes separate from mechanical cleanup unless the cleanup is required to fix the bug. + +## Do NOT + +- edit generated files or vendored code +- convert every inline style during an unrelated task +- rerun the same script when its fresh output is already present in chat history diff --git a/bundled-skills/debugging-and-error-recovery/SKILL.md b/src/core/skills/bundled/debugging-and-error-recovery/SKILL.md similarity index 100% rename from bundled-skills/debugging-and-error-recovery/SKILL.md rename to src/core/skills/bundled/debugging-and-error-recovery/SKILL.md diff --git a/src/core/skills/bundled/environment-and-secrets/SKILL.md b/src/core/skills/bundled/environment-and-secrets/SKILL.md new file mode 100644 index 00000000..fdcaeaf8 --- /dev/null +++ b/src/core/skills/bundled/environment-and-secrets/SKILL.md @@ -0,0 +1,28 @@ +--- +name: environment-and-secrets +description: Safely inspect environment variable templates, missing keys, and secret setup without exposing secret values. Use for .env, env.example, missing environment variable, API key, token, and secret configuration tasks. +--- + +# Environment and Secrets + +Secrets are operational data, not chat content. Report key names and file paths, never values. + +## Steps + +1. `execute_workspace_script({ script: "sync-env-files.mjs" })` — compare `.env*` files with templates and report missing keys +2. Read `.env.example`, `.env.template`, or documented config files when script output points to them. +3. Report missing keys by name only, grouped by file. +4. Guide the user to fill local `.env` files from committed examples. +5. If code changes are needed, update validation, docs, or examples without committing real credentials. + +## Safety Rules + +- Never print, summarize, or transform secret values. +- Never copy values from `.env` into docs, tests, logs, prompts, or generated files. +- Prefer placeholder values such as `YOUR_API_KEY_HERE`. +- If a secret is already exposed in tracked files, stop and report it as a security concern. + +## Mode Rules + +- Plan mode: produce a remediation checklist only. +- Act mode: update examples, validation, and docs; do not create real secrets. diff --git a/bundled-skills/git-workflow-and-versioning/SKILL.md b/src/core/skills/bundled/git-workflow-and-versioning/SKILL.md similarity index 95% rename from bundled-skills/git-workflow-and-versioning/SKILL.md rename to src/core/skills/bundled/git-workflow-and-versioning/SKILL.md index d17d7995..fd23c0a3 100644 --- a/bundled-skills/git-workflow-and-versioning/SKILL.md +++ b/src/core/skills/bundled/git-workflow-and-versioning/SKILL.md @@ -210,6 +210,18 @@ This pattern catches wrong assumptions early and gives reviewers a clear map of ## Pre-Commit Hygiene +When Mitii workspace scripts are available, run the safety helpers before commit-sensitive work: + +```bash +npm run git:untracked +npm run checkpoint:write +npm run checkpoint:read +``` + +- `list-untracked-files.sh` before committing so new files are intentionally included or ignored. +- `write-checkpoint.sh` before an approval pause or risky edit batch. +- `read-checkpoint.sh` on resume so the next step starts from the saved state rather than stale memory. + Before every commit: ```bash diff --git a/bundled-skills/performance-optimization/SKILL.md b/src/core/skills/bundled/performance-optimization/SKILL.md similarity index 100% rename from bundled-skills/performance-optimization/SKILL.md rename to src/core/skills/bundled/performance-optimization/SKILL.md diff --git a/bundled-skills/planning-and-task-breakdown/SKILL.md b/src/core/skills/bundled/planning-and-task-breakdown/SKILL.md similarity index 100% rename from bundled-skills/planning-and-task-breakdown/SKILL.md rename to src/core/skills/bundled/planning-and-task-breakdown/SKILL.md diff --git a/bundled-skills/test-driven-development/SKILL.md b/src/core/skills/bundled/test-driven-development/SKILL.md similarity index 100% rename from bundled-skills/test-driven-development/SKILL.md rename to src/core/skills/bundled/test-driven-development/SKILL.md diff --git a/bundled-skills/using-agent-skills/SKILL.md b/src/core/skills/bundled/using-agent-skills/SKILL.md similarity index 95% rename from bundled-skills/using-agent-skills/SKILL.md rename to src/core/skills/bundled/using-agent-skills/SKILL.md index 975fb5c2..c93834be 100644 --- a/bundled-skills/using-agent-skills/SKILL.md +++ b/src/core/skills/bundled/using-agent-skills/SKILL.md @@ -160,7 +160,7 @@ For a complete feature, the typical skill sequence is: 16. shipping-and-launch → Deploy safely ``` -Not every task needs every skill. A bug fix might only need: `debugging-and-error-recovery` → `test-driven-development` → `code-review-and-quality`. +Not every task needs every skill. A bug fix might only need: `debugging-and-error-recovery` → `test-driven-development` → `code-review-and-quality`. A cleanup task might need: `audit-cleanup` → `code-smells-and-tech-debt` → `git-workflow-and-versioning`. ## Quick Reference @@ -179,9 +179,12 @@ Not every task needs every skill. A bug fix might only need: `debugging-and-erro | Verify | test-driven-development | Failing test first, then make it pass | | Verify | browser-testing-with-devtools | Chrome DevTools MCP for runtime verification | | Verify | debugging-and-error-recovery | Reproduce → localize → fix → guard | +| Verify | audit-cleanup | Script-first dependency, dead-code, cycle, and engines audit | +| Verify | code-smells-and-tech-debt | Console logs, inline styles, missing types, and targeted lint cleanup | | Review | code-review-and-quality | Five-axis review with quality gates | | Review | code-simplification | Preserve behavior while reducing unnecessary complexity | | Review | security-and-hardening | OWASP prevention, input validation, least privilege | +| Review | environment-and-secrets | Env/template drift and secret handling without exposing values | | Review | performance-optimization | Measure first, optimize only what matters | | Ship | git-workflow-and-versioning | Atomic commits, clean history | | Ship | ci-cd-and-automation | Automated quality gates on every change | diff --git a/src/core/skills/installBundledSkills.ts b/src/core/skills/installBundledSkills.ts index 27029f49..46c4b45b 100644 --- a/src/core/skills/installBundledSkills.ts +++ b/src/core/skills/installBundledSkills.ts @@ -1,6 +1,7 @@ import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync } from 'fs'; import { basename, join } from 'path'; import { createLogger } from '../telemetry/Logger'; +import { resolveBundledSkillsRoot } from './resolveBundledSkillsRoot'; const log = createLogger('BundledSkills'); @@ -17,14 +18,14 @@ export function installBundledSkills( extensionRoot: string, options: { force?: boolean } = {} ): InstallBundledSkillsResult { - const bundledRoot = join(extensionRoot, 'bundled-skills'); + const bundledRoot = resolveBundledSkillsRoot(extensionRoot); const destinationRoot = join(workspace, '.mitii', 'skills'); const installed: string[] = []; const skipped: string[] = []; - if (!existsSync(bundledRoot)) { - log.warn('Bundled skills directory missing', { bundledRoot }); - return { installed, skipped, bundledRoot, destinationRoot }; + if (!bundledRoot || !existsSync(bundledRoot)) { + log.warn('Bundled skills directory missing', { extensionRoot }); + return { installed, skipped, bundledRoot: bundledRoot ?? '', destinationRoot }; } mkdirSync(destinationRoot, { recursive: true }); @@ -71,14 +72,14 @@ export function installBundledSkills( } export function listBundledSkillNames(extensionRoot: string): string[] { - const bundledRoot = join(extensionRoot, 'bundled-skills'); - if (!existsSync(bundledRoot)) return []; + const bundledRoot = resolveBundledSkillsRoot(extensionRoot); + if (!bundledRoot || !existsSync(bundledRoot)) return []; return listBundledSkillDirs(bundledRoot).map((dir) => basename(dir)).sort(); } export function readBundledSkillManifest(extensionRoot: string): Array<{ name: string; description: string }> { - const bundledRoot = join(extensionRoot, 'bundled-skills'); - if (!existsSync(bundledRoot)) return []; + const bundledRoot = resolveBundledSkillsRoot(extensionRoot); + if (!bundledRoot || !existsSync(bundledRoot)) return []; return listBundledSkillDirs(bundledRoot).map((dir) => { const content = readFileSync(join(dir, 'SKILL.md'), 'utf8'); diff --git a/src/core/skills/resolveBundledSkillsRoot.ts b/src/core/skills/resolveBundledSkillsRoot.ts new file mode 100644 index 00000000..fdcb08e1 --- /dev/null +++ b/src/core/skills/resolveBundledSkillsRoot.ts @@ -0,0 +1,32 @@ +import { existsSync, readdirSync, statSync } from 'fs'; +import { join } from 'path'; + +const CANDIDATE_SUFFIXES = [ + 'src/core/skills/bundled', + 'dist/core/skills/bundled', +] as const; + +/** Resolve bundled skills root from the source tree or compiled extension output. */ +export function resolveBundledSkillsRoot(packageRoot: string): string | undefined { + for (const suffix of CANDIDATE_SUFFIXES) { + const candidate = join(packageRoot, suffix); + if (hasSkillDirs(candidate)) return candidate; + } + return undefined; +} + +function hasSkillDirs(root: string): boolean { + if (!existsSync(root)) return false; + try { + return readdirSync(root).some((entry) => { + const abs = join(root, entry); + try { + return statSync(abs).isDirectory() && existsSync(join(abs, 'SKILL.md')); + } catch { + return false; + } + }); + } catch { + return false; + } +} diff --git a/src/core/telemetry/SessionLogService.ts b/src/core/telemetry/SessionLogService.ts index 19a504a0..2b17b68c 100644 --- a/src/core/telemetry/SessionLogService.ts +++ b/src/core/telemetry/SessionLogService.ts @@ -2,6 +2,7 @@ import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } fr import { join } from 'path'; import { AGENT_NAME } from '../../shared/brand'; import { createLogger } from './Logger'; +import { WebhookEmitter, type WebhookEmitterConfig } from './WebhookEmitter'; const log = createLogger('SessionLogService'); @@ -29,7 +30,9 @@ export type SessionLogEventType = | 'index_start' | 'index_complete' | 'turn_complete' - | 'ui_trace'; + | 'ui_trace' + | 'microtask_context' + | 'audit_export'; export interface SessionLogEvent { ts: number; @@ -52,6 +55,7 @@ export class SessionLogService { private sessionId = ''; private logPath = ''; private logStartedAt = 0; + private webhookEmitter = new WebhookEmitter(); configure(workspace: string, sessionId: string, enabled = true, debugMetrics = false): void { const sessionChanged = this.sessionId !== sessionId; @@ -82,6 +86,10 @@ export class SessionLogService { return this.debugMetrics; } + configureWebhook(config: WebhookEmitterConfig): void { + this.webhookEmitter.configure(config); + } + getLogPath(): string { return this.logPath; } @@ -126,6 +134,7 @@ export class SessionLogService { try { appendFileSync(this.logPath, `${JSON.stringify(event)}\n`, 'utf-8'); + this.webhookEmitter.emit(event); } catch (error) { log.warn('Failed to append session log', { error: error instanceof Error ? error.message : String(error), @@ -160,6 +169,14 @@ export class SessionLogService { message: 'Session started', data: header, })}\n`, 'utf-8'); + this.webhookEmitter.emit({ + ts, + time: formatTimestampForLog(ts), + sessionId: this.sessionId, + type: 'session_start', + message: 'Session started', + data: sanitizeLogData(header), + }); } catch (error) { log.warn('Failed to write session log header', { error: error instanceof Error ? error.message : String(error), diff --git a/src/core/telemetry/WebhookEmitter.ts b/src/core/telemetry/WebhookEmitter.ts new file mode 100644 index 00000000..29c8ee2e --- /dev/null +++ b/src/core/telemetry/WebhookEmitter.ts @@ -0,0 +1,92 @@ +import { createHmac } from 'crypto'; +import type { SessionLogEvent } from './SessionLogService'; +import { createLogger } from './Logger'; + +const log = createLogger('WebhookEmitter'); + +export interface WebhookEmitterConfig { + url?: string; + secret?: string; + timeoutMs?: number; + maxRetries?: number; +} + +export class WebhookEmitter { + private url = ''; + private secret = ''; + private timeoutMs = 5000; + private maxRetries = 2; + private queue: Promise = Promise.resolve(); + + configure(config: WebhookEmitterConfig): void { + this.url = config.url?.trim() ?? ''; + this.secret = config.secret ?? ''; + this.timeoutMs = config.timeoutMs ?? 5000; + this.maxRetries = config.maxRetries ?? 2; + } + + isEnabled(): boolean { + return Boolean(this.url); + } + + emit(event: SessionLogEvent): void { + if (!this.isEnabled()) return; + const payload = JSON.stringify(event); + this.queue = this.queue + .then(() => this.postWithRetry(payload)) + .catch((error) => { + log.warn('Webhook delivery failed', { + error: error instanceof Error ? error.message : String(error), + }); + }); + } + + async flush(): Promise { + await this.queue; + } + + private async postWithRetry(payload: string): Promise { + let lastError: unknown; + for (let attempt = 0; attempt <= this.maxRetries; attempt += 1) { + try { + await this.post(payload); + return; + } catch (error) { + lastError = error; + if (attempt < this.maxRetries) { + await sleep(250 * (attempt + 1)); + } + } + } + throw lastError instanceof Error ? lastError : new Error(String(lastError)); + } + + private async post(payload: string): Promise { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), this.timeoutMs); + try { + const headers: Record = { + 'Content-Type': 'application/json', + 'User-Agent': 'Mitii-AI-Agent', + }; + if (this.secret) { + headers['X-Mitii-Signature'] = `sha256=${createHmac('sha256', this.secret).update(payload).digest('hex')}`; + } + const response = await fetch(this.url, { + method: 'POST', + headers, + body: payload, + signal: controller.signal, + }); + if (!response.ok) { + throw new Error(`Webhook returned ${response.status}`); + } + } finally { + clearTimeout(timer); + } + } +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/src/core/telemetry/index.ts b/src/core/telemetry/index.ts index f450b9ed..04ed8647 100644 --- a/src/core/telemetry/index.ts +++ b/src/core/telemetry/index.ts @@ -1,3 +1,4 @@ export * from './Logger'; export * from './errors'; export * from './SessionLogService'; +export * from './WebhookEmitter'; diff --git a/src/core/util/paths.ts b/src/core/util/paths.ts index 71849bf3..e4ddce6b 100644 --- a/src/core/util/paths.ts +++ b/src/core/util/paths.ts @@ -1,6 +1,6 @@ import { AGENT_NAME } from '../../shared/brand'; import * as vscode from 'vscode'; -import { basename, dirname, join, relative, resolve, isAbsolute } from 'path'; +import { basename, dirname, join, relative, resolve, isAbsolute, win32 } from 'path'; import { existsSync, readdirSync, statSync } from 'fs'; /** @@ -9,6 +9,9 @@ import { existsSync, readdirSync, statSync } from 'fs'; export function normalizeWorkspaceRoot(workspaceRoot: string | undefined | null): string | null { if (!workspaceRoot?.trim()) return null; const trimmed = workspaceRoot.trim(); + if (isWindowsAbsolutePath(trimmed)) { + return win32.normalize(trimmed); + } const abs = resolve(isAbsolute(trimmed) ? trimmed : resolve(trimmed)); if (!abs) return null; return abs; @@ -87,6 +90,12 @@ export function resolveWorkspaceRelPath( if (!trimmed || trimmed === '.' || trimmed === './') return ''; const normalized = trimmed.replace(/\\/g, '/'); + if (isWindowsAbsolutePath(trimmed)) { + const relPath = win32.relative(win32.normalize(workspace), win32.normalize(trimmed)); + if (!relPath || relPath === '.') return ''; + if (relPath.startsWith('..') || isWindowsAbsolutePath(relPath)) return null; + return normalizeRelPath(relPath); + } if (isAbsolute(normalized)) { const relPath = relative(normalizedWorkspace, resolve(normalized)).replace(/\\/g, '/'); @@ -126,6 +135,10 @@ export function resolveWorkspaceRelPath( return relPath; } +function isWindowsAbsolutePath(value: string): boolean { + return /^[A-Za-z]:[\\/]/.test(value) || /^\\\\[^\\]+\\[^\\]+/.test(value); +} + /** Common extension / naming variants when a path is missing. */ export function pathExistenceVariants(relPath: string): string[] { const variants = new Set([relPath]); diff --git a/src/extension.ts b/src/extension.ts index f44cb809..85fd66c8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,6 +4,7 @@ import { registerCommands } from './vscode/commands'; import { ThunderWebviewProvider } from './vscode/webview/ThunderWebviewProvider'; import { createLogger } from './core/telemetry/Logger'; import { AGENT_FULL_NAME } from './shared/brand'; +import { notifyNativeModuleHealth } from './vscode/nativeModuleHealth'; const log = createLogger('extension'); @@ -12,6 +13,7 @@ let webviewProvider: ThunderWebviewProvider | undefined; export async function activate(context: vscode.ExtensionContext): Promise { log.info(`${AGENT_FULL_NAME} activating`); + void notifyNativeModuleHealth(); controller = new ThunderController(context); await controller.initialize(); diff --git a/src/node/cli.ts b/src/node/cli.ts new file mode 100644 index 00000000..57bcb0f0 --- /dev/null +++ b/src/node/cli.ts @@ -0,0 +1,200 @@ +#!/usr/bin/env node +import { existsSync, readFileSync, writeFileSync } from 'fs'; +import { join, resolve } from 'path'; +import { AuditPackBuilder, verifyAuditPack } from '../core/audit'; +import { HeadlessAgentHost, generateHeadlessChangelog, prepareHeadlessRelease } from '../core/headless'; +import type { HeadlessRuntime } from '../core/headless/HeadlessConfig'; +import type { ProviderType } from '../core/config/schema'; + +async function main(argv: string[]): Promise { + const [command, ...args] = argv; + const cwd = resolve(valueOf(args, '--cwd') ?? process.cwd()); + const since = valueOf(args, '--since'); + const json = args.includes('--json'); + const prompt = positional(args).join(' ').trim(); + + if (!command || command === '--help' || command === 'help') { + printHelp(); + return 0; + } + + if (command === 'changelog') { + const changelog = await generateHeadlessChangelog(cwd, since); + process.stdout.write(json ? JSON.stringify({ changelog }, null, 2) + '\n' : changelog); + return 0; + } + + if (command === 'prepare-release') { + const result = await prepareHeadlessRelease(cwd, since); + process.stdout.write(json ? JSON.stringify(result, null, 2) + '\n' : result.releaseNotes); + return 0; + } + + if (command === 'export-audit') { + const session = valueOf(args, '--session'); + const output = valueOf(args, '--output') ?? join(cwd, `.mitii/audit/mitii-audit-${Date.now()}.zip`); + const logPath = session && existsSync(session) ? session : latestSessionLog(cwd); + const pack = new AuditPackBuilder().build({ + sessionId: session ?? 'headless', + workspace: cwd, + extensionVersion: readPackageVersion(cwd), + logPath, + summaryMarkdown: logPath ? `# Mitii audit export\n\nLog: ${logPath}\n` : '# Mitii audit export\n\nNo session log found.\n', + }); + writeFileSync(output, pack.buffer); + process.stdout.write(json ? JSON.stringify({ output, entries: pack.entries }, null, 2) + '\n' : `${output}\n`); + return 0; + } + + if (command === 'verify-audit') { + const target = positional(args)[0]; + if (!target) { + process.stderr.write('verify-audit requires a zip path.\n'); + return 2; + } + const result = verifyAuditPack(readFileSync(resolve(cwd, target)), process.env.MITII_AUDIT_SIGNING_KEY); + process.stdout.write(json ? JSON.stringify(result, null, 2) + '\n' : formatAuditVerification(result)); + return result.ok ? 0 : 1; + } + + if (command === 'ask') { + const host = createHost(cwd, args); + try { + const answer = await host.ask(prompt || readStdin()); + process.stdout.write(json ? JSON.stringify({ answer }, null, 2) + '\n' : `${answer}\n`); + return 0; + } finally { + host.dispose(); + } + } + + if (command === 'plan') { + const host = createHost(cwd, args); + try { + const plan = await host.plan(prompt || readStdin()); + process.stdout.write(JSON.stringify(plan, null, 2) + '\n'); + return 0; + } finally { + host.dispose(); + } + } + + if (command === 'agent') { + const host = createHost(cwd, args); + try { + for await (const event of host.agent(prompt || readStdin())) { + if (json) { + process.stdout.write(JSON.stringify(event) + '\n'); + } else if (event.content) { + process.stdout.write(`${event.content}\n`); + } else if (event.message) { + process.stderr.write(`${event.message}\n`); + } + } + return 0; + } finally { + host.dispose(); + } + } + + if (command === 'commit-msg') { + process.stderr.write(`${command} requires git diff context from the VS Code extension runtime. Use changelog, prepare-release, export-audit, verify-audit, ask, plan, or agent headlessly.\n`); + return 2; + } + + process.stderr.write(`Unknown command: ${command}\n`); + printHelp(); + return 1; +} + +function createHost(cwd: string, args: string[]): HeadlessAgentHost { + const provider = (valueOf(args, '--provider') as ProviderType | undefined) ?? 'echo'; + const runtime = (valueOf(args, '--runtime') as HeadlessRuntime | undefined) + ?? (provider === 'echo' ? 'stub' : 'real'); + return new HeadlessAgentHost({ + cwd, + runtime, + providerType: provider, + baseUrl: valueOf(args, '--base-url'), + model: valueOf(args, '--model'), + approval: (valueOf(args, '--approval') as 'auto' | 'manual' | undefined) ?? 'auto', + enablePuppeteer: args.includes('--enable-puppeteer'), + allowNetwork: args.includes('--allow-network'), + }); +} + +function valueOf(args: string[], name: string): string | undefined { + const idx = args.indexOf(name); + return idx >= 0 ? args[idx + 1] : undefined; +} + +function positional(args: string[]): string[] { + const out: string[] = []; + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + if (arg.startsWith('--')) { + if (!['--json'].includes(arg)) index += 1; + continue; + } + out.push(arg); + } + return out; +} + +function readStdin(): string { + try { + return readFileSync(0, 'utf8').trim(); + } catch { + return ''; + } +} + +function latestSessionLog(cwd: string): string | undefined { + const dir = join(cwd, '.mitii', 'logs'); + if (!existsSync(dir)) return undefined; + const fs = require('fs') as typeof import('fs'); + const files = fs.readdirSync(dir) + .filter((file) => file.endsWith('.jsonl')) + .sort(); + const last = files[files.length - 1]; + return last ? join(dir, last) : undefined; +} + +function readPackageVersion(cwd: string): string { + try { + const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as { version?: string }; + return pkg.version ?? '0.0.0'; + } catch { + return '0.0.0'; + } +} + +function printHelp(): void { + process.stdout.write([ + 'Mitii CLI', + '', + 'Commands:', + ' mitii changelog [--since ] [--cwd ] [--json]', + ' mitii prepare-release [--since ] [--cwd ] [--json]', + ' mitii export-audit [--session ] [--output ] [--cwd ] [--json]', + ' mitii verify-audit [--cwd ] [--json]', + ' mitii ask "question" [--runtime real|stub] [--provider echo|openai|...] [--model ] [--base-url ] [--cwd ] [--json]', + ' mitii plan "goal" [--runtime real|stub] [--provider echo|openai|...] [--model ] [--approval auto|manual] [--cwd ]', + ' mitii agent "goal" [--runtime real|stub] [--provider echo|openai|...] [--model ] [--approval auto|manual] [--enable-puppeteer] [--allow-network] [--json]', + '', + ].join('\n')); +} + +function formatAuditVerification(result: ReturnType): string { + if (result.ok) { + return `Audit pack verified (${result.entries.length} entries).\n`; + } + return `Audit pack verification failed:\n${result.errors.map((error) => `- ${error}`).join('\n')}\n`; +} + +void main(process.argv.slice(2)).then((code) => { + process.exitCode = code; +}).catch((error) => { + process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`); + process.exitCode = 1; +}); diff --git a/src/node/vscode-shim.ts b/src/node/vscode-shim.ts new file mode 100644 index 00000000..7fe5cba7 --- /dev/null +++ b/src/node/vscode-shim.ts @@ -0,0 +1,54 @@ +/** + * Minimal VS Code API shim for headless CLI / benchmark runs. + * Production extension code still uses the real `vscode` module. + */ + +export const Uri = { + file: (path: string) => ({ scheme: 'file', fsPath: path, path }), +}; + +export const workspace = { + getConfiguration: (_section?: string) => ({ + get: (_key: string, defaultValue?: T) => defaultValue as T, + }), + workspaceFolders: undefined as undefined | Array<{ uri: { fsPath: string } }>, + asRelativePath: (uri: { fsPath?: string; path?: string }, _includeWorkspaceFolder?: boolean) => { + const path = uri.fsPath ?? uri.path ?? ''; + return path.split('/').pop() ?? path; + }, + createFileSystemWatcher: () => ({ + onDidChange: () => ({ dispose: () => undefined }), + onDidCreate: () => ({ dispose: () => undefined }), + onDidDelete: () => ({ dispose: () => undefined }), + dispose: () => undefined, + }), +}; + +export const window = { + activeTextEditor: undefined, + tabGroups: { all: [] as Array<{ tabs: unknown[] }> }, + showInformationMessage: async (..._args: unknown[]) => undefined, + showWarningMessage: async (..._args: unknown[]) => undefined, + showErrorMessage: async (..._args: unknown[]) => undefined, + showOpenDialog: async () => undefined, +}; + +export const languages = { + getDiagnostics: () => [] as Array<[unknown, unknown[]]>, + DiagnosticSeverity: { Error: 0, Warning: 1, Information: 2, Hint: 3 }, +}; + +export const DiagnosticSeverity = languages.DiagnosticSeverity; + +export class RelativePattern { + constructor( + readonly base: { fsPath: string }, + readonly pattern: string + ) {} +} + +export const commands = { + executeCommand: async (..._args: unknown[]) => undefined, +}; + +export type Uri = ReturnType; diff --git a/src/vscode/commands.ts b/src/vscode/commands.ts index 8111f101..ebf29c62 100644 --- a/src/vscode/commands.ts +++ b/src/vscode/commands.ts @@ -27,10 +27,22 @@ export function registerCommands( await controller.exportSessionLog(); }), + vscode.commands.registerCommand('thunder.exportAuditPack', async () => { + await controller.exportAuditPack(); + }), + vscode.commands.registerCommand('thunder.openSessionLog', async () => { await controller.openSessionLog(); }), + vscode.commands.registerCommand('thunder.generateChangelog', async () => { + await controller.generateChangelog(); + }), + + vscode.commands.registerCommand('thunder.prepareRelease', async () => { + await controller.prepareRelease(); + }), + vscode.commands.registerCommand('thunder.showInlineDiff', async (approvalId?: string) => { if (typeof approvalId === 'string') { await controller.showInlineDiffForApproval(approvalId); diff --git a/src/vscode/nativeModuleHealth.ts b/src/vscode/nativeModuleHealth.ts new file mode 100644 index 00000000..15828634 --- /dev/null +++ b/src/vscode/nativeModuleHealth.ts @@ -0,0 +1,51 @@ +import * as vscode from 'vscode'; +import { AGENT_NAME } from '../shared/brand'; + +export interface NativeModuleHealthResult { + ok: boolean; + moduleName: string; + message: string; + rebuildCommand: string; +} + +export function checkBetterSqliteHealth(): NativeModuleHealthResult { + const rebuildCommand = detectEditorRebuildCommand(); + try { + require('better-sqlite3'); + return { + ok: true, + moduleName: 'better-sqlite3', + message: 'better-sqlite3 loaded successfully.', + rebuildCommand, + }; + } catch (error) { + return { + ok: false, + moduleName: 'better-sqlite3', + message: error instanceof Error ? error.message : String(error), + rebuildCommand, + }; + } +} + +export async function notifyNativeModuleHealth(result = checkBetterSqliteHealth()): Promise { + if (result.ok) return; + + const action = 'Copy rebuild command'; + const choice = await vscode.window.showWarningMessage( + `${AGENT_NAME}: ${result.moduleName} failed to load. Rebuild native modules for this editor runtime.`, + action + ); + if (choice === action) { + await vscode.env.clipboard.writeText(result.rebuildCommand); + void vscode.window.showInformationMessage(`${AGENT_NAME}: copied ${result.rebuildCommand}`); + } +} + +export function detectEditorRebuildCommand(env: NodeJS.ProcessEnv = process.env): string { + const editor = (env.THUNDER_EDITOR || env.VSCODE_PID || '').toString().toLowerCase(); + if (editor.includes('cursor') || env.CURSOR_TRACE_ID || env.CURSOR_APP_NAME) { + return 'THUNDER_EDITOR=cursor npm run rebuild:native'; + } + return 'npm run rebuild:native'; +} diff --git a/src/vscode/webview/ThunderWebviewProvider.ts b/src/vscode/webview/ThunderWebviewProvider.ts index d8653eb4..d75fa933 100644 --- a/src/vscode/webview/ThunderWebviewProvider.ts +++ b/src/vscode/webview/ThunderWebviewProvider.ts @@ -2,6 +2,7 @@ import * as vscode from 'vscode'; import { ThunderController } from '../../core/app/ThunderController'; import { createLogger } from '../../core/telemetry/Logger'; import { normalizeError, formatUserError } from '../../core/telemetry/errors'; +import { chunkContent, chunkReasoning } from '../../core/llm/streamChunks'; import { AGENT_FULL_NAME, AGENT_NAME, brandMessage } from '../../shared/brand'; import { type ExtensionToWebviewMessage, @@ -73,6 +74,14 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { this.postMessage({ type: 'state', payload: this.state }); }); + this.controller.setPreservedUiGetter(() => ({ + tab: this.state.tab, + mode: this.state.mode, + messages: this.state.messages, + currentSessionId: this.state.currentSessionId, + chatHistory: this.state.chatHistory, + loading: this.state.loading, + })); this.controller.setAutoFixCallback(async (message) => { await this.runChatCompletion(message, true); }); @@ -100,6 +109,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { }); webviewView.onDidDispose(() => { + this.archiveCurrentThread(); this.view = undefined; }); } @@ -158,7 +168,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { case 'sendMessage': { const content = message.payload.content.trim(); const pinnedContext = message.payload.pinnedContext ?? this.state.pinnedContext; - await this.runChatCompletion(content, true, pinnedContext); + await this.runChatCompletion(content, true, pinnedContext, message.payload.attachments ?? []); break; } @@ -204,6 +214,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { this.postMessage({ type: 'state', payload: this.state }); break; } + const restoredPlan = this.controller.restoreChatSession(message.payload.id, { mode: this.state.mode }); this.state = { ...this.state, tab: 'chat', @@ -212,6 +223,9 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { currentSessionId: message.payload.id, messages: thread.messages, chatHistory: this.historySummaries(), + plan: restoredPlan, + agentActivity: [], + agentLiveStatus: null, }; this.postMessage({ type: 'state', payload: this.state }); break; @@ -220,6 +234,9 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { case 'setMode': { this.state = { ...this.state, mode: message.payload }; this.controller.getSession()?.setMode(message.payload); + if (message.payload === 'review') { + await this.controller.refreshReviewDiff(); + } this.postMessage({ type: 'setMode', payload: message.payload }); break; } @@ -318,6 +335,21 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { await this.controller.testProviderConnection(message.payload); break; + case 'saveProviderProfile': + await this.controller.saveProviderProfile(message.payload); + await this.syncState(); + break; + + case 'selectProviderProfile': + await this.controller.selectProviderProfile(message.payload.id); + await this.syncState(); + break; + + case 'deleteProviderProfile': + await this.controller.deleteProviderProfile(message.payload.id); + await this.syncState(); + break; + case 'pickWorkspaceFolder': await this.controller.pickWorkspaceFolder(); await this.syncState(); @@ -436,13 +468,23 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { this.postMessage({ type: 'state', payload: this.state }); break; } + + case 'refreshReviewDiff': + await this.controller.refreshReviewDiff(); + break; + + case 'completeOnboarding': + await this.controller.completeOnboarding(); + await this.syncState(); + break; } } private async runChatCompletion( content: string, appendUser: boolean, - pinnedContext = this.state.pinnedContext + pinnedContext = this.state.pinnedContext, + attachments: ChatMessage['attachments'] = [] ): Promise { if (!content || this.state.loading) return; @@ -450,6 +492,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { id: `msg-${Date.now()}`, role: 'user', content, + attachments, timestamp: Date.now(), }; @@ -469,11 +512,12 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { const recentMessages = messages .filter((m) => m.role === 'user' || m.role === 'assistant') .slice(0, -1) - .map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content })); + .map((m) => ({ role: m.role as 'user' | 'assistant', content: m.content, attachments: m.attachments })); - const stream = await this.controller.sendMessage(content, recentMessages, { pinnedContext }); + const stream = await this.controller.sendMessage(content, recentMessages, { pinnedContext, attachments }); let rawContent = ''; let fullContent = ''; + let reasoningContent = ''; this.state = { ...this.state, @@ -485,17 +529,18 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { this.postMessage({ type: 'state', payload: this.state }); for await (const chunk of stream) { - rawContent += chunk; + rawContent += chunkContent(chunk); + reasoningContent += chunkReasoning(chunk); fullContent = stripLeakedChannelMarkers(rawContent); this.state = { ...this.state, messages: this.state.messages.map((m) => - m.id === assistantId ? { ...m, content: fullContent, streaming: true } : m + m.id === assistantId ? { ...m, content: fullContent, reasoningContent, streaming: true } : m ), }; this.postMessage({ type: 'updateLastAssistant', - payload: { content: fullContent, streaming: true }, + payload: { content: fullContent, reasoningContent, streaming: true }, }); } @@ -505,7 +550,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { ...this.state, loading: false, messages: this.state.messages.map((m) => - m.id === assistantId ? { ...m, content: fullContent, streaming: false } : m + m.id === assistantId ? { ...m, content: fullContent, reasoningContent, streaming: false } : m ), approvals: pendingApprovals.map((r) => ({ id: r.id, @@ -514,6 +559,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { files: r.files, risk: r.risk, reason: r.reason, + contentLength: r.contentLength, kind: r.kind, question: r.question, options: r.options, @@ -599,21 +645,23 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { const assistantId = lastAssistant.id; let rawContent = lastAssistant.content; let fullContent = stripLeakedChannelMarkers(rawContent); + let reasoningContent = lastAssistant.reasoningContent ?? ''; try { const stream = this.controller.resumeAfterApproval(); for await (const chunk of stream) { - rawContent += chunk; + rawContent += chunkContent(chunk); + reasoningContent += chunkReasoning(chunk); fullContent = stripLeakedChannelMarkers(rawContent); this.state = { ...this.state, messages: this.state.messages.map((m) => - m.id === assistantId ? { ...m, content: fullContent, streaming: true } : m + m.id === assistantId ? { ...m, content: fullContent, reasoningContent, streaming: true } : m ), }; this.postMessage({ type: 'updateLastAssistant', - payload: { content: fullContent, streaming: true }, + payload: { content: fullContent, reasoningContent, streaming: true }, }); } @@ -623,7 +671,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { ...this.state, loading: false, messages: this.state.messages.map((m) => - m.id === assistantId ? { ...m, content: fullContent, streaming: false } : m + m.id === assistantId ? { ...m, content: fullContent, reasoningContent, streaming: false } : m ), approvals: pendingApprovals.map((r) => ({ id: r.id, @@ -632,6 +680,7 @@ export class ThunderWebviewProvider implements vscode.WebviewViewProvider { files: r.files, risk: r.risk, reason: r.reason, + contentLength: r.contentLength, kind: r.kind, question: r.question, options: r.options, diff --git a/src/vscode/webview/messages.ts b/src/vscode/webview/messages.ts index d46e80dd..ac12c1a1 100644 --- a/src/vscode/webview/messages.ts +++ b/src/vscode/webview/messages.ts @@ -27,10 +27,20 @@ export type { export type WebviewTab = 'chat' | 'history' | 'settings'; +export interface ChatImageAttachment { + kind: 'image'; + mimeType: string; + data: string; + name?: string; + size?: number; +} + export interface ChatMessage { id: string; role: 'user' | 'assistant' | 'system'; content: string; + attachments?: ChatImageAttachment[]; + reasoningContent?: string; timestamp: number; streaming?: boolean; } @@ -221,11 +231,40 @@ export interface CheckpointView { strategy?: string; } +export interface ReviewDiffFileView { + path: string; + status: string; + additions: number; + deletions: number; + diff: string; +} + +export interface ReviewDiffView { + branch: string | null; + files: ReviewDiffFileView[]; + summary: { + fileCount: number; + additions: number; + deletions: number; + }; + truncated: boolean; + updatedAt: number; +} + +export interface OnboardingView { + shouldShow: boolean; + completed: boolean; + providerConfigured: boolean; + workspaceIndexed: boolean; +} + export interface SettingsView { appVersion: string; providerType: string; baseUrl: string; model: string; + apiVersion: string; + region: string; contextWindow: number; indexingEnabled: boolean; approvalMode: ApprovalMode; @@ -269,6 +308,22 @@ export interface SettingsView { actModel: string; actBaseUrl: string; checkpointStrategy: 'file-copy' | 'git-stash' | 'shadow-git'; + showReasoning: boolean; + reasoningPreviewMaxChars: number; + providerProfiles: ProviderProfileView[]; + activeProviderProfileId: string | null; +} + +export interface ProviderProfileView { + id: string; + name: string; + providerType: string; + baseUrl: string; + model: string; + apiVersion: string; + region: string; + contextWindow: number; + hasApiKey: boolean; } export interface McpServerStatusView { @@ -309,6 +364,8 @@ export interface WebviewState { indexing: IndexingStatusView; memories: MemoryItemView[]; checkpoints: CheckpointView[]; + reviewDiff: ReviewDiffView | null; + onboarding: OnboardingView; settings: SettingsView; contextToggles: ContextToggles; mcpToggles: McpToggles; @@ -324,6 +381,8 @@ export interface WebviewState { workspaceNotice: WorkspaceNoticeView | null; tokenUsage: TokenUsageView; workspaceTrusted: boolean; + settingsSaving: boolean; + testingConnection: boolean; } export type WorkspaceNoticeView = { @@ -335,7 +394,7 @@ export type WorkspaceNoticeView = { export type ExtensionToWebviewMessage = | { type: 'state'; payload: WebviewState } | { type: 'appendMessage'; payload: ChatMessage } - | { type: 'updateLastAssistant'; payload: { content: string; streaming: boolean } } + | { type: 'updateLastAssistant'; payload: { content: string; reasoningContent?: string; streaming: boolean } } | { type: 'setError'; payload: string | null } | { type: 'setLoading'; payload: boolean } | { type: 'setMode'; payload: ThunderMode } @@ -348,12 +407,13 @@ export type ExtensionToWebviewMessage = | { type: 'setAgentLiveStatus'; payload: AgentLiveStatusView | null } | { type: 'setSubagents'; payload: SubagentStatusView[] } | { type: 'setTokenUsage'; payload: TokenUsageView } + | { type: 'setReviewDiff'; payload: ReviewDiffView | null } | { type: 'setContextPaths'; payload: { requestId: string; paths: ContextPathSuggestion[] } }; // Webview -> Extension messages export type WebviewToExtensionMessage = | { type: 'ready' } - | { type: 'sendMessage'; payload: { content: string; pinnedContext?: PinnedContextView[] } } + | { type: 'sendMessage'; payload: { content: string; pinnedContext?: PinnedContextView[]; attachments?: ChatImageAttachment[] } } | { type: 'retryLastMessage' } | { type: 'newChat' } | { type: 'openChatThread'; payload: { id: string } } @@ -371,6 +431,9 @@ export type WebviewToExtensionMessage = | { type: 'saveMcpSettings'; payload: McpSettingsPayload } | { type: 'saveAllSettings'; payload: ThunderSettingsPayload } | { type: 'testProviderConnection'; payload?: ProviderSettingsPayload } + | { type: 'saveProviderProfile'; payload: { id?: string; name?: string; settings: ProviderSettingsPayload; apiKey?: string } } + | { type: 'selectProviderProfile'; payload: { id: string } } + | { type: 'deleteProviderProfile'; payload: { id: string } } | { type: 'pickWorkspaceFolder' } | { type: 'setWorkspaceOverride'; payload: { path: string } } | { type: 'clearWorkspaceOverride' } @@ -390,12 +453,15 @@ export type WebviewToExtensionMessage = | { type: 'clearPinnedContext' } | { type: 'searchContextPaths'; payload: { query: string; requestId: string } } | { type: 'pickContextPath' } + | { type: 'refreshReviewDiff' } + | { type: 'completeOnboarding' } | { type: 'refreshPanels' }; export const defaultMcpToggles = (): McpToggles => ({ filesystem: true, memory: true, sequentialThinking: true, + puppeteer: false, }); export const defaultContextToggles = (): ContextToggles => ({ @@ -412,6 +478,8 @@ export const defaultSettingsView = (): SettingsView => ({ providerType: 'echo', baseUrl: 'http://localhost:11434/v1', model: 'qwen3-coder:30b', + apiVersion: '2024-10-21', + region: 'us-east-1', contextWindow: 8192, indexingEnabled: true, approvalMode: 'review_all', @@ -453,6 +521,10 @@ export const defaultSettingsView = (): SettingsView => ({ actModel: '', actBaseUrl: '', checkpointStrategy: 'git-stash', + showReasoning: true, + reasoningPreviewMaxChars: 8000, + providerProfiles: [], + activeProviderProfileId: null, }); export const initialWebviewState = (): WebviewState => ({ @@ -476,6 +548,13 @@ export const initialWebviewState = (): WebviewState => ({ indexing: { indexed: 0, queued: 0, running: false, failed: 0, total: 0, activeWorkers: 0, processed: 0, runTotal: 0 }, memories: [], checkpoints: [], + reviewDiff: null, + onboarding: { + shouldShow: false, + completed: false, + providerConfigured: false, + workspaceIndexed: false, + }, settings: defaultSettingsView(), contextToggles: defaultContextToggles(), mcpToggles: defaultMcpToggles(), @@ -510,4 +589,6 @@ export const initialWebviewState = (): WebviewState => ({ breakdown: [], }, workspaceTrusted: true, + settingsSaving: false, + testingConnection: false, }); diff --git a/src/webview-ui/src/App.tsx b/src/webview-ui/src/App.tsx index c9a21537..d9759ba0 100644 --- a/src/webview-ui/src/App.tsx +++ b/src/webview-ui/src/App.tsx @@ -7,6 +7,8 @@ import { ContextPanel } from './components/ContextPanel'; import { ContextWarningBanner } from './components/ContextWarningBanner'; import { ErrorBanner } from './components/ErrorBanner'; import { SettingsPanel } from './components/SettingsPanel'; +import { OnboardingPanel } from './components/OnboardingPanel'; +import { ReviewPanel } from './components/ReviewPanel'; import { ApprovalCards } from './components/ApprovalCards'; import { IndexingStatusBar } from './components/IndexingStatusBar'; import { WorkspaceBanner } from './components/WorkspaceBanner'; @@ -16,7 +18,7 @@ import { DevPanels } from './components/DevPanels'; import { IconButton } from './components/IconButton'; import { IconChat, IconHistory, IconPlus, IconSettings } from './components/Icons'; import { deriveSafetySettings } from './utils/approvalMode'; -import type { AgentDepthView, AgentSettingsPayload, SettingsView } from '../../vscode/webview/messages'; +import type { AgentDepthView, AgentSettingsPayload, ApprovalMode, SettingsView } from '../../vscode/webview/messages'; import type { ThunderMode } from '../../core/session/ThunderSession'; function activeDepthForMode(settings: SettingsView, mode: ThunderMode): AgentDepthView { @@ -152,7 +154,29 @@ export function App() { } /> - {state.tab === 'chat' ? ( + {state.onboarding.shouldShow ? ( +
+ postMessage({ type: 'saveProviderSettings', payload })} + onSaveApiKey={(key) => postMessage({ type: 'saveApiKey', payload: { key } })} + onTestConnection={(payload) => postMessage({ type: 'testProviderConnection', payload })} + onIndexWorkspace={() => postMessage({ type: 'indexWorkspace' })} + onComplete={() => postMessage({ type: 'completeOnboarding' })} + /> +
+ ) : state.tab === 'chat' && state.mode === 'review' ? ( + postMessage({ type: 'refreshReviewDiff' })} + onFeedback={(content) => { + postMessage({ type: 'setMode', payload: 'ask' }); + postMessage({ type: 'sendMessage', payload: { content } }); + }} + onExit={() => postMessage({ type: 'setMode', payload: 'plan' })} + /> + ) : state.tab === 'chat' ? (
@@ -190,12 +216,12 @@ export function App() { tokenUsage={state.tokenUsage} pinnedContext={state.pinnedContext} canRetry={canRetry} - onSend={(content, pinnedContext) => - postMessage({ type: 'sendMessage', payload: { content, pinnedContext } }) + onSend={(content, pinnedContext, attachments) => + postMessage({ type: 'sendMessage', payload: { content, pinnedContext, attachments } }) } onStop={() => postMessage({ type: 'stopGeneration' })} onModeChange={(mode) => postMessage({ type: 'setMode', payload: mode })} - onApprovalModeChange={(approvalMode) => + onApprovalModeChange={(approvalMode: ApprovalMode) => postMessage({ type: 'saveSafetySettings', payload: deriveSafetySettings(approvalMode), @@ -239,7 +265,6 @@ export function App() { settings={state.settings} workspaceOpen={state.workspaceOpen} workspacePath={state.workspacePath} - vscodeWorkspaceFolders={state.vscodeWorkspaceFolders} workspaceOverride={state.workspaceOverride} usingWorkspaceOverride={state.usingWorkspaceOverride} indexDbPath={state.indexDbPath} @@ -272,6 +297,17 @@ export function App() { onDeleteMemory={(id) => postMessage({ type: 'deleteMemory', payload: { id } })} onClearMemory={() => postMessage({ type: 'clearMemory' })} onRestoreCheckpoint={(id) => postMessage({ type: 'restoreCheckpoint', payload: { id } })} + settingsSaving={state.settingsSaving} + testingConnection={state.testingConnection} + onSaveProviderProfile={(payload) => + postMessage({ type: 'saveProviderProfile', payload }) + } + onSelectProviderProfile={(id) => + postMessage({ type: 'selectProviderProfile', payload: { id } }) + } + onDeleteProviderProfile={(id) => + postMessage({ type: 'deleteProviderProfile', payload: { id } }) + } /> )} diff --git a/src/webview-ui/src/components/ChatInput.tsx b/src/webview-ui/src/components/ChatInput.tsx index 770287d0..431af200 100644 --- a/src/webview-ui/src/components/ChatInput.tsx +++ b/src/webview-ui/src/components/ChatInput.tsx @@ -1,16 +1,28 @@ -import { useState, useCallback, type KeyboardEvent, useRef, useEffect } from 'react'; +import { useState, useCallback, type CSSProperties, type KeyboardEvent, useRef, useEffect } from 'react'; import type { ThunderMode } from '../../../core/session/ThunderSession'; import type { - ApprovalMode, AgentDepthView, + ApprovalMode, + ChatImageAttachment, ContextPathSuggestion, PinnedContextView, TokenUsageView, } from '../../../vscode/webview/messages'; import { IconButton } from './IconButton'; -import { IconChevronDown, IconCopy, IconMarkdown, IconRetry, IconSend, IconStop } from './Icons'; +import { + IconAgent, + IconAsk, + IconChevronDown, + IconCopy, + IconImage, + IconMarkdown, + IconPlan, + IconRetry, + IconSend, + IconStop, +} from './Icons'; import { TokenMeter } from './TokenMeter'; -import { APPROVAL_MODE_OPTIONS, deriveSafetySettings } from '../utils/approvalMode'; +import { APPROVAL_MODE_OPTIONS } from '../utils/approvalMode'; interface ChatInputProps { loading: boolean; @@ -20,10 +32,10 @@ interface ChatInputProps { tokenUsage: TokenUsageView; pinnedContext: PinnedContextView[]; canRetry: boolean; - onSend: (content: string, pinnedContext: PinnedContextView[]) => void; + onSend: (content: string, pinnedContext: PinnedContextView[], attachments: ChatImageAttachment[]) => void; onStop?: () => void; onModeChange: (mode: ThunderMode) => void; - onApprovalModeChange: (mode: ApprovalMode) => void; + onApprovalModeChange: (approvalMode: ApprovalMode) => void; onDepthChange: (depth: AgentDepthView) => void; onRetry?: () => void; onCopyResponse?: () => void; @@ -35,20 +47,62 @@ interface ChatInputProps { pathSearchRequestId: string | null; } -const MODES: { id: ThunderMode; label: string; description: string }[] = [ - { id: 'ask', label: 'Ask', description: 'Explore and answer questions (read-only)' }, - { id: 'plan', label: 'Plan', description: 'Analyze and propose steps' }, - { id: 'agent', label: 'Agent', description: 'Apply code changes' }, - { id: 'review', label: 'Review', description: 'Inspect code and risks' }, +type ComposerSelectId = 'mode' | 'approval' | 'depth'; +type ComposerOption = { + id: T; + label: string; + description: string; + color: string; + icon?: typeof IconAsk; +}; + +const MODES: Array>> = [ + { + id: 'ask', + label: 'Ask', + description: 'Explore and answer questions (read-only)', + color: '#22c55e', + icon: IconAsk, + }, + { + id: 'plan', + label: 'Plan', + description: 'Analyze and propose steps', + color: '#f59e0b', + icon: IconPlan, + }, + { + id: 'agent', + label: 'Agent', + description: 'Apply code changes', + color: '#ef4444', + icon: IconAgent, + }, ]; -const DEPTH_OPTIONS: Array<{ id: AgentDepthView; label: string; title: string }> = [ - { id: 'auto', label: 'Auto', title: 'Choose depth from the request' }, - { id: 'quick', label: 'Quick', title: 'Use a smaller exploration or execution budget' }, - { id: 'standard', label: 'Standard', title: 'Use the normal exploration or execution budget' }, - { id: 'deep', label: 'Deep', title: 'Use a larger budget for complex work' }, - { id: 'pilot', label: 'Pilot', title: 'Use an expanded budget for broad implementation or investigation' }, - { id: 'enterprise', label: 'Enterprise', title: 'Use the largest built-in budget for exhaustive work' }, +const APPROVAL_OPTIONS: Array> = APPROVAL_MODE_OPTIONS.map((option) => { + const colorByMode: Record = { + review_all: '#ef4444', + ask_edits: '#f59e0b', + ask_deletes: '#f97316', + ask_commands: '#fb923c', + auto: '#22c55e', + }; + return { + id: option.id, + label: option.label, + description: option.title, + color: colorByMode[option.id], + }; +}); + +const DEPTH_OPTIONS: Array> = [ + { id: 'auto', label: 'Auto', description: 'Choose depth from the request', color: '#38bdf8' }, + { id: 'quick', label: 'Quick', description: 'Use a smaller exploration or execution budget', color: '#22c55e' }, + { id: 'standard', label: 'Standard', description: 'Use the normal exploration or execution budget', color: '#60a5fa' }, + { id: 'deep', label: 'Deep', description: 'Use a larger budget for complex work', color: '#f59e0b' }, + { id: 'pilot', label: 'Pilot', description: 'Use an expanded budget for broad implementation or investigation', color: '#a78bfa' }, + { id: 'enterprise', label: 'Enterprise', description: 'Use the largest built-in budget for exhaustive work', color: '#ef4444' }, ]; export function ChatInput({ @@ -79,10 +133,13 @@ export function ChatInput({ const [mentionIndex, setMentionIndex] = useState(0); const [mentionStart, setMentionStart] = useState(null); const [searchRequestId, setSearchRequestId] = useState(null); + const [attachments, setAttachments] = useState([]); + const [openSelect, setOpenSelect] = useState(null); const textareaRef = useRef(null); - const activeMode = MODES.find((m) => m.id === mode) ?? MODES[0]; - const activeApproval = - APPROVAL_MODE_OPTIONS.find((option) => option.id === approvalMode) ?? APPROVAL_MODE_OPTIONS[0]; + const fileInputRef = useRef(null); + const visibleMode = mode === 'review' ? 'plan' : mode; + const activeMode = MODES.find((m) => m.id === visibleMode) ?? MODES[1]; + const activeApproval = APPROVAL_OPTIONS.find((option) => option.id === approvalMode) ?? APPROVAL_OPTIONS[0]; const selectedDepth = DEPTH_OPTIONS.find((option) => option.id === activeDepth) ?? DEPTH_OPTIONS[0]; useEffect(() => { @@ -136,11 +193,35 @@ export function ChatInput({ const handleSend = useCallback(() => { const trimmed = value.trim(); - if (!trimmed || loading) return; - onSend(trimmed, pinnedContext); + if ((!trimmed && attachments.length === 0) || loading) return; + onSend(trimmed || 'Please review the attached image.', pinnedContext, attachments); setValue(''); + setAttachments([]); closeMention(); - }, [value, loading, onSend, pinnedContext, closeMention]); + }, [value, attachments, loading, onSend, pinnedContext, closeMention]); + + const addImageFiles = useCallback((files: FileList | File[]) => { + const images = Array.from(files).filter((file) => file.type.startsWith('image/')).slice(0, 6); + for (const file of images) { + if (file.size > 5 * 1024 * 1024) continue; + const reader = new FileReader(); + reader.onload = () => { + const result = String(reader.result ?? ''); + const data = result.includes(',') ? result.slice(result.indexOf(',') + 1) : result; + setAttachments((current) => [ + ...current, + { + kind: 'image', + mimeType: file.type || 'image/png', + data, + name: file.name, + size: file.size, + }, + ].slice(0, 6)); + }; + reader.readAsDataURL(file); + } + }, []); const handleKeyDown = (e: KeyboardEvent) => { if (mentionOpen && pathSuggestions.length > 0) { @@ -173,8 +254,101 @@ export function ChatInput({ } }; + const renderDropdown = ({ + id, + label, + value, + selected, + options, + onChange, + }: { + id: ComposerSelectId; + label: string; + value: T; + selected: ComposerOption; + options: Array>; + onChange: (value: T) => void; + }) => { + const SelectedIcon = selected.icon; + const isOpen = openSelect === id; + return ( +
{ + if (!e.currentTarget.contains(e.relatedTarget as Node | null)) { + setOpenSelect((current) => (current === id ? null : current)); + } + }} + > + + {isOpen && ( +
+ {options.map((option) => { + const OptionIcon = option.icon; + const selectedOption = option.id === value; + return ( + + ); + })} +
+ )} +
+ ); + }; + return ( -
+
{ + if (!loading) e.preventDefault(); + }} + onDrop={(e) => { + if (loading) return; + e.preventDefault(); + addImageFiles(e.dataTransfer.files); + }} + >
{mentionOpen && (
@@ -217,64 +391,80 @@ export function ChatInput({ ) } onKeyDown={handleKeyDown} + onPaste={(e) => { + const files = Array.from(e.clipboardData.files).filter((file) => file.type.startsWith('image/')); + if (files.length > 0) { + addImageFiles(files); + } + }} placeholder="Ask anything… use @ to add files or folders" disabled={loading} rows={3} aria-label="Chat message input" /> + {attachments.length > 0 && ( +
+ {attachments.map((attachment, index) => ( + + ))} +
+ )}
-
- - -
-
- - -
-
- - -
+ {renderDropdown({ + id: 'mode', + label: 'Mode', + value: visibleMode, + selected: activeMode, + options: MODES, + onChange: (nextMode) => onModeChange(nextMode), + })} + {renderDropdown({ + id: 'approval', + label: 'Approval', + value: approvalMode, + selected: activeApproval, + options: APPROVAL_OPTIONS, + onChange: (nextApprovalMode) => onApprovalModeChange(nextApprovalMode), + })} + {renderDropdown({ + id: 'depth', + label: 'Depth', + value: activeDepth, + selected: selectedDepth, + options: DEPTH_OPTIONS, + onChange: (nextDepth) => onDepthChange(nextDepth), + })}
+ { + if (e.target.files) addImageFiles(e.target.files); + e.currentTarget.value = ''; + }} + /> + fileInputRef.current?.click()} + disabled={loading} + > + + {onRetry && ( @@ -304,7 +494,7 @@ export function ChatInput({ label="Send message" variant="accent" onClick={handleSend} - disabled={!value.trim()} + disabled={!value.trim() && attachments.length === 0} > diff --git a/src/webview-ui/src/components/IconButton.tsx b/src/webview-ui/src/components/IconButton.tsx index 1b8eab33..5215eed5 100644 --- a/src/webview-ui/src/components/IconButton.tsx +++ b/src/webview-ui/src/components/IconButton.tsx @@ -18,9 +18,9 @@ export function IconButton({ return ( +
+ +
+ {['Echo test', 'Provider', 'Index'].map((label, index) => ( + + ))} +
+ + {step === 0 && ( +
+

Echo provider test

+

Echo verifies the sidebar, chat loop, and settings plumbing without sending data to an external model.

+
+ +
+
+ )} + + {step === 1 && ( +
+

Provider connection

+ + + + {providerType === 'azure-openai' && ( + + )} + {providerType === 'bedrock' && ( + + )} + {preset?.requiresApiKey && ( + + )} + {!validation.ok &&

{validation.errors.join(' ')}

} +
+ + +
+
+ )} + + {step === 2 && ( +
+

Workspace index

+

{workspaceIndexed ? 'This workspace has indexed files.' : 'Build the local index so Ask, Plan, Agent, and Review mode have useful repository context.'}

+
+ + +
+
+ )} + + ); +} diff --git a/src/webview-ui/src/components/ReviewPanel.tsx b/src/webview-ui/src/components/ReviewPanel.tsx new file mode 100644 index 00000000..cf14647b --- /dev/null +++ b/src/webview-ui/src/components/ReviewPanel.tsx @@ -0,0 +1,62 @@ +import type { ReviewDiffView } from '../../../vscode/webview/messages'; + +interface ReviewPanelProps { + diff: ReviewDiffView | null; + onRefresh: () => void; + onFeedback: (content: string) => void; + onExit: () => void; +} + +export function ReviewPanel({ diff, onRefresh, onFeedback, onExit }: ReviewPanelProps) { + const files = diff?.files ?? []; + const summary = diff?.summary ?? { fileCount: 0, additions: 0, deletions: 0 }; + const feedbackPrompt = [ + 'Review the current working-tree diff.', + 'Focus on bugs, regressions, missing tests, and risky changes.', + 'Do not edit files; provide findings only.', + ].join('\n'); + + return ( +
+
+
+

Review diff

+

+ {diff?.branch ? `Branch ${diff.branch}` : 'Working tree'} · {summary.fileCount} files · +{summary.additions} / -{summary.deletions} +

+
+
+ + + +
+
+ {diff?.truncated && ( +

Large diff truncated for sidebar review. Ask Review mode for targeted files when needed.

+ )} + {files.length === 0 ? ( +
+

No working-tree diff

+

Make changes or stage files, then refresh Review mode.

+
+ ) : ( +
+ {files.map((file) => ( +
+ + {file.status} + {file.path} + +{file.additions} / -{file.deletions} + + {file.diff ? ( +
{file.diff}
+ ) : ( +

No textual diff available for this file.

+ )} +
+ ))} +
+ )} +
+ ); +} diff --git a/src/webview-ui/src/components/SettingsPanel.tsx b/src/webview-ui/src/components/SettingsPanel.tsx index 8a2e08c2..c5d31b95 100644 --- a/src/webview-ui/src/components/SettingsPanel.tsx +++ b/src/webview-ui/src/components/SettingsPanel.tsx @@ -1,12 +1,10 @@ -import { useState, useEffect, useCallback } from 'react'; +import { useState, useEffect, useCallback, useRef } from 'react'; import { AGENT_NAME } from '../../../shared/brand'; import { LOCAL_MODEL_PRESETS, findLocalModelPreset } from '../../../shared/modelPresets'; import type { - ApprovalMode, ContextToggles, McpToggles, ProviderSettingsPayload, - SafetySettingsPayload, SettingsView, IndexingStatusView, MemoryItemView, @@ -23,13 +21,12 @@ import { SettingStepper } from './SettingStepper'; import { MemoryPanel } from './MemoryPanel'; import { CheckpointPanel } from './CheckpointPanel'; import { getProviderPreset } from '../../../core/llm/providerPresets'; +import { validateProviderSettings } from '../../../core/config/ui/mappers'; import { - APPROVAL_MODE_OPTIONS, - approvalModeDescription, - deriveSafetySettings, -} from '../utils/approvalMode'; + deriveSafetyFromAutonomyPreset, +} from '../utils/autonomyPreset'; -type SettingsTab = 'workspace' | 'model' | 'agent' | 'context' | 'integrations' | 'safety' | 'debug'; +type SettingsTab = 'workspace' | 'model' | 'agent' | 'context' | 'integrations' | 'debug'; const TABS: Array<{ id: SettingsTab; label: string }> = [ { id: 'workspace', label: 'Workspace' }, @@ -37,14 +34,16 @@ const TABS: Array<{ id: SettingsTab; label: string }> = [ { id: 'agent', label: 'Agent' }, { id: 'context', label: 'Context' }, { id: 'integrations', label: 'Integrations' }, - { id: 'safety', label: 'Safety' }, { id: 'debug', label: 'Debug' }, ]; const PROVIDER_OPTIONS: Array<{ id: ProviderSettingsPayload['providerType']; label: string }> = [ { id: 'echo', label: 'Echo (test / no LLM)' }, { id: 'openai-compatible', label: 'OpenAI-compatible (Ollama, LM Studio)' }, + { id: 'openrouter', label: 'OpenRouter' }, { id: 'openai', label: 'OpenAI' }, + { id: 'azure-openai', label: 'Azure OpenAI' }, + { id: 'bedrock', label: 'AWS Bedrock' }, { id: 'anthropic', label: 'Anthropic (Claude)' }, { id: 'gemini', label: 'Google Gemini' }, { id: 'deepseek', label: 'DeepSeek' }, @@ -79,18 +78,6 @@ const ACT_DEPTH_OPTIONS: Array<{ id: SettingsView['actDepth']; label: string }> { id: 'enterprise', label: 'Enterprise execution' }, ]; -const AUTONOMY_PRESETS: Array<{ - id: SafetySettingsPayload['autonomyPreset']; - label: string; - description: string; -}> = [ - { id: 'safe', label: 'Safe', description: 'Strictest — all edits/commands need approval, no network.' }, - { id: 'guided', label: 'Guided', description: 'Balanced — asks before edits; read-only shell and web fetch allowed.' }, - { id: 'builder', label: 'Builder', description: 'Fast — auto-approves writes; mutating shell still reviewed.' }, - { id: 'pilot', label: 'Pilot', description: 'High autonomy — auto-approves writes, reviews shell.' }, - { id: 'enterprise', label: 'Enterprise', description: 'Locked down — no network, all operations reviewed.' }, -]; - const CONTEXT_TOGGLES: Array<{ key: keyof ContextToggles; label: string; @@ -148,13 +135,17 @@ const MCP_BUILTIN_TOGGLES: Array<{ label: 'Sequential thinking', description: 'Structured reasoning helper for multi-step problems.', }, + { + key: 'puppeteer', + label: 'Puppeteer browser', + description: 'Browser automation via @modelcontextprotocol/server-puppeteer for UI verification.', + }, ]; interface SettingsPanelProps { settings: SettingsView; workspaceOpen: boolean; workspacePath: string; - vscodeWorkspaceFolders: string[]; workspaceOverride: string; usingWorkspaceOverride: boolean; indexDbPath: string; @@ -179,13 +170,22 @@ interface SettingsPanelProps { onDeleteMemory: (id: number) => void; onClearMemory: () => void; onRestoreCheckpoint: (id: string) => void; + settingsSaving: boolean; + testingConnection: boolean; + onSaveProviderProfile: (payload: { + id?: string; + name?: string; + settings: ProviderSettingsPayload; + apiKey?: string; + }) => void; + onSelectProviderProfile: (id: string) => void; + onDeleteProviderProfile: (id: string) => void; } export function SettingsPanel({ settings, workspaceOpen, workspacePath, - vscodeWorkspaceFolders, workspaceOverride, usingWorkspaceOverride, indexDbPath, @@ -197,6 +197,7 @@ export function SettingsPanel({ memories, checkpoints, onSaveApiKey, + onSaveGitHubToken, onSaveAllSettings, onTestConnection, onPickWorkspaceFolder, @@ -209,18 +210,30 @@ export function SettingsPanel({ onDeleteMemory, onClearMemory, onRestoreCheckpoint, + settingsSaving, + testingConnection, + onSaveProviderProfile, + onSelectProviderProfile, + onDeleteProviderProfile, }: SettingsPanelProps) { const [activeTab, setActiveTab] = useState('workspace'); const [apiKey, setApiKey] = useState(''); const [githubToken, setGithubToken] = useState(''); const [saved, setSaved] = useState(false); const [dirty, setDirty] = useState(false); + const [profileName, setProfileName] = useState(''); + const [selectedProfileId, setSelectedProfileId] = useState( + settings.activeProviderProfileId + ); + const wasSavingRef = useRef(false); const [providerType, setProviderType] = useState( settings.providerType as ProviderSettingsPayload['providerType'] ); const [baseUrl, setBaseUrl] = useState(settings.baseUrl); const [model, setModel] = useState(settings.model); + const [apiVersion, setApiVersion] = useState(settings.apiVersion); + const [region, setRegion] = useState(settings.region); const [contextWindow, setContextWindow] = useState(settings.contextWindow); const [subagentsEnabled, setSubagentsEnabled] = useState(settings.subagentsEnabled); @@ -241,10 +254,6 @@ export function SettingsPanel({ const [actBaseUrl, setActBaseUrl] = useState(settings.actBaseUrl); const [checkpointStrategy, setCheckpointStrategy] = useState(settings.checkpointStrategy); - const [approvalMode, setApprovalMode] = useState(settings.approvalMode); - const [autonomyPreset, setAutonomyPreset] = useState( - settings.autonomyPreset - ); const [mcpEnabled, setMcpEnabled] = useState(settings.mcpEnabled); const [sessionLogging, setSessionLogging] = useState(settings.sessionLogging); const [debugMetrics, setDebugMetrics] = useState(settings.debugMetrics); @@ -254,9 +263,12 @@ export function SettingsPanel({ const [hybridMemorySearch, setHybridMemorySearch] = useState(settings.hybridMemorySearch); useEffect(() => { + if (dirty && !settingsSaving) return; setProviderType(settings.providerType as ProviderSettingsPayload['providerType']); setBaseUrl(settings.baseUrl); setModel(settings.model); + setApiVersion(settings.apiVersion); + setRegion(settings.region); setContextWindow(settings.contextWindow); setSubagentsEnabled(settings.subagentsEnabled); setAgentMaxSteps(settings.agentMaxSteps); @@ -275,8 +287,6 @@ export function SettingsPanel({ setActModel(settings.actModel); setActBaseUrl(settings.actBaseUrl); setCheckpointStrategy(settings.checkpointStrategy); - setApprovalMode(settings.approvalMode); - setAutonomyPreset(settings.autonomyPreset); setMcpEnabled(settings.mcpEnabled); setSessionLogging(settings.sessionLogging); setDebugMetrics(settings.debugMetrics); @@ -284,8 +294,14 @@ export function SettingsPanel({ setEmbeddingProvider(settings.embeddingProvider); setVectorBackend(settings.vectorBackend); setHybridMemorySearch(settings.hybridMemorySearch); - setDirty(false); - }, [settings]); + setSelectedProfileId(settings.activeProviderProfileId); + if (wasSavingRef.current && !settingsSaving) { + setDirty(false); + setSaved(true); + setTimeout(() => setSaved(false), 2500); + } + wasSavingRef.current = settingsSaving; + }, [settings, settingsSaving, dirty]); const markDirty = useCallback(() => setDirty(true), []); @@ -309,6 +325,8 @@ export function SettingsPanel({ providerType, baseUrl: baseUrl.trim(), model: model.trim(), + apiVersion: apiVersion.trim(), + region: region.trim(), contextWindow: normalizedContextWindow, }, agent: { @@ -330,7 +348,7 @@ export function SettingsPanel({ actBaseUrl: actBaseUrl.trim(), checkpointStrategy, }, - safety: deriveSafetySettings(approvalMode), + safety: deriveSafetyFromAutonomyPreset(settings.autonomyPreset), mcp: { enabled: mcpEnabled, builtinServers: mcpToggles }, indexing: { vectorsEnabled, @@ -362,12 +380,40 @@ export function SettingsPanel({ setTimeout(() => setSaved(false), 2500); }; + const handleSaveProviderProfile = () => { + if (!workspaceOpen) return; + onSaveProviderProfile({ + id: selectedProfileId ?? undefined, + name: profileName.trim() || undefined, + settings: currentProviderSettings(), + apiKey: apiKey.trim() || undefined, + }); + if (apiKey.trim()) setApiKey(''); + }; + + const loadProviderProfile = (id: string) => { + const profile = settings.providerProfiles.find((item) => item.id === id); + if (!profile) return; + setSelectedProfileId(id); + setProviderType(profile.providerType as ProviderSettingsPayload['providerType']); + setBaseUrl(profile.baseUrl); + setModel(profile.model); + setApiVersion(profile.apiVersion); + setRegion(profile.region); + setContextWindow(profile.contextWindow); + setProfileName(profile.name); + markDirty(); + }; + const currentProviderSettings = (): ProviderSettingsPayload => ({ providerType, baseUrl: baseUrl.trim(), model: model.trim(), + apiVersion: apiVersion.trim(), + region: region.trim(), contextWindow: clampContextWindow(contextWindow), }); + const providerValidation = validateProviderSettings(currentProviderSettings()); const activeLocalPreset = providerType === 'openai-compatible' ? findLocalModelPreset(model) : undefined; const hasPresetContextMismatch = Boolean( @@ -438,11 +484,11 @@ export function SettingsPanel({ + + {settings.providerProfiles.length > 0 ? ( + + ) : ( +

No saved providers yet. Configure below and click Save provider.

+ )} + + + +
+ + {selectedProfileId && ( + + )} +
+
+ - Pick a local Ollama model or type any OpenAI-compatible model name. + Pick a local Ollama model, cloud model ID, or Azure deployment name. + {providerType === 'azure-openai' && ( + + )} + + {providerType === 'bedrock' && ( + + )} + {contextWindowField} {hasPresetContextMismatch && activeLocalPreset?.contextWindow && (

@@ -548,8 +695,9 @@ export function SettingsPanel({ type="button" className="btn btn--ghost" onClick={() => onTestConnection(currentProviderSettings())} + disabled={!providerValidation.ok || testingConnection} > - Test connection + {testingConnection ? 'Testing…' : 'Test connection'} {settings.connectionStatus && ( )}

+ {!providerValidation.ok && ( +

+ {providerValidation.errors.join(' ')} +

+ )} @@ -951,7 +1104,10 @@ export function SettingsPanel({ className="settings-input" placeholder={settings.hasGithubToken ? 'Token saved - enter to replace' : 'Enter GitHub token...'} value={githubToken} - onChange={(e) => setGithubToken(e.target.value)} + onChange={(e) => { + setGithubToken(e.target.value); + markDirty(); + }} />

@@ -1043,8 +1199,7 @@ export function SettingsPanel({

- {AGENT_NAME} reads AGENTS.md, CLAUDE.md, .mitii/rules,{' '} - .clinerules, and Continue/Cursor rule folders into context. + {AGENT_NAME} reads MITII.md from the workspace root into context.

Active rule files: {settings.projectRules} @@ -1053,70 +1208,6 @@ export function SettingsPanel({ )} - {activeTab === 'safety' && ( - - - - - -

- {settings.requireApprovalWrites ? 'Edits: ask' : 'Edits: auto'} - {settings.requireApprovalShell ? 'Commands: ask' : 'Commands: auto'} -
- - )} - {activeTab === 'debug' && settings.localDebugAvailable && ( <> - {dirty ? 'Unsaved changes' : saved ? 'All changes saved' : 'No pending changes'} + {settingsSaving + ? 'Saving…' + : dirty + ? 'Unsaved changes' + : saved + ? 'All changes saved' + : 'No pending changes'}
)} + + {(settingsSaving || testingConnection) && ( +
+
+ )} ); } diff --git a/src/webview-ui/src/components/ThinkingRow.tsx b/src/webview-ui/src/components/ThinkingRow.tsx new file mode 100644 index 00000000..1d9f5112 --- /dev/null +++ b/src/webview-ui/src/components/ThinkingRow.tsx @@ -0,0 +1,31 @@ +import { useMemo } from 'react'; +import { useStreamReveal } from '../hooks/useStreamReveal'; + +interface ThinkingRowProps { + content: string; + streaming?: boolean; + maxChars?: number; + visible?: boolean; +} + +export function ThinkingRow({ content, streaming = false, maxChars = 8000, visible = true }: ThinkingRowProps) { + const trimmed = content.trim(); + const revealed = useStreamReveal(trimmed, streaming); + const display = useMemo(() => { + if (maxChars <= 0 || revealed.length <= maxChars) return revealed; + return `${revealed.slice(0, maxChars)}\n\n[Reasoning preview truncated: ${revealed.length - maxChars} chars hidden]`; + }, [maxChars, revealed]); + if (!visible || !trimmed) return null; + + const firstLine = trimmed.split(/\r?\n/).find(Boolean)?.slice(0, 96) ?? 'Reasoning'; + const summary = streaming + ? `Reasoning... ${trimmed.length.toLocaleString()} chars` + : `Reasoning (${trimmed.length.toLocaleString()} chars) - ${firstLine}`; + + return ( +
+ {summary} +
{display}
+
+ ); +} diff --git a/src/webview-ui/src/components/WorkspaceSettingsSection.tsx b/src/webview-ui/src/components/WorkspaceSettingsSection.tsx index d051d0a7..211f96b6 100644 --- a/src/webview-ui/src/components/WorkspaceSettingsSection.tsx +++ b/src/webview-ui/src/components/WorkspaceSettingsSection.tsx @@ -1,16 +1,14 @@ import { useState, useEffect } from 'react'; -import { AGENT_NAME } from '../../../shared/brand'; -import type { IndexingStatusView, WorkspaceNoticeView } from '../../../vscode/webview/messages'; -import { SettingNote } from './SettingNote'; +import type { IndexingStatusView, VectorIndexStatusView, WorkspaceNoticeView } from '../../../vscode/webview/messages'; interface WorkspaceSettingsSectionProps { workspaceOpen: boolean; workspacePath: string; - vscodeWorkspaceFolders: string[]; workspaceOverride: string; usingWorkspaceOverride: boolean; indexDbPath: string; indexing: IndexingStatusView; + vectorIndex: VectorIndexStatusView; workspaceNotice: WorkspaceNoticeView | null; onPickFolder: () => void; onSetOverride: (path: string) => void; @@ -21,11 +19,11 @@ interface WorkspaceSettingsSectionProps { export function WorkspaceSettingsSection({ workspaceOpen, workspacePath, - vscodeWorkspaceFolders, workspaceOverride, usingWorkspaceOverride, indexDbPath, indexing, + vectorIndex, workspaceNotice, onPickFolder, onSetOverride, @@ -35,94 +33,62 @@ export function WorkspaceSettingsSection({ const [overrideInput, setOverrideInput] = useState(workspaceOverride); const runTotal = indexing.runTotal ?? 0; const processed = Math.min(indexing.processed ?? 0, runTotal); - const activeWorkers = indexing.activeWorkers ?? 0; const progressPct = runTotal > 0 ? Math.round((processed / runTotal) * 100) : 0; - const progressLabel = indexing.running - ? `${processed}/${runTotal} files · ${indexing.queued} queued${activeWorkers > 0 ? ` · ${activeWorkers} active` : ''}` - : indexing.failed > 0 - ? `${indexing.indexed}${indexing.total > 0 ? `/${indexing.total}` : ''} indexed · ${indexing.failed} failed` - : `${indexing.indexed}${indexing.total > 0 ? `/${indexing.total}` : ''} indexed`; + const indexLabel = indexing.running + ? `${processed}/${runTotal} files` + : `${indexing.indexed}${indexing.total > 0 ? ` / ${indexing.total}` : ''} indexed`; useEffect(() => { setOverrideInput(workspaceOverride); }, [workspaceOverride]); return ( -
-

Workspace

- - - {AGENT_NAME} needs a project root to index files, run tools, and build context. - When you debug with F5, the Extension Host may open the monorepo folder — not your app. - Use Browse or paste the absolute path to the project you want the agent to work on - (e.g. your Kitchen KOT app), then Save & apply and Index. - - +
{workspaceNotice && ( -

+

{workspaceNotice.message}

)} -
-
- Effective path - - {workspaceOpen ? workspacePath : 'Not set'} - +
+
+ Indexed files + {indexLabel} + {indexing.failed > 0 && !indexing.running && ( + {indexing.failed} failed + )} +
+
+ Queued + {indexing.queued}
-
- Source - {usingWorkspaceOverride ? 'Saved override' : 'VS Code open folder'} +
+ Embedded chunks + {vectorIndex.embeddedChunks.toLocaleString()}
-
- Indexed files - {progressLabel} +
+ Source + + {usingWorkspaceOverride ? 'Override' : 'VS Code folder'} +
- {indexDbPath && ( -

- Index database: {indexDbPath} -

- )} - -
- -

VS Code open folders (this window)

- {vscodeWorkspaceFolders.length === 0 ? ( - - No folder is open in this window. That is normal when debugging {AGENT_NAME} itself. - Set a workspace path override below — it is saved even without an open folder. - Launch config tip: use Run Extension (parent monorepo) or open your target project folder. - - ) : ( -
    - {vscodeWorkspaceFolders.map((folder) => ( -
  • - {folder} -
  • - ))} -
- )} - -
diff --git a/src/webview-ui/src/state/store.ts b/src/webview-ui/src/state/store.ts index 6b081315..6cfeac38 100644 --- a/src/webview-ui/src/state/store.ts +++ b/src/webview-ui/src/state/store.ts @@ -11,13 +11,14 @@ import type { AgentLiveStatusView, SubagentStatusView, TokenUsageView, + ReviewDiffView, } from '../../../vscode/webview/messages'; import { initialWebviewState } from '../../../vscode/webview/messages'; export type WebviewAction = | { type: 'SET_STATE'; payload: WebviewState } | { type: 'APPEND_MESSAGE'; payload: ChatMessage } - | { type: 'UPDATE_LAST_ASSISTANT'; payload: { content: string; streaming: boolean } } + | { type: 'UPDATE_LAST_ASSISTANT'; payload: { content: string; reasoningContent?: string; streaming: boolean } } | { type: 'SET_ERROR'; payload: string | null } | { type: 'SET_LOADING'; payload: boolean } | { type: 'SET_MODE'; payload: ThunderMode } @@ -29,7 +30,8 @@ export type WebviewAction = | { type: 'SET_AGENT_ACTIVITY'; payload: AgentActivityEntry[] } | { type: 'SET_AGENT_LIVE_STATUS'; payload: AgentLiveStatusView | null } | { type: 'SET_SUBAGENTS'; payload: SubagentStatusView[] } - | { type: 'SET_TOKEN_USAGE'; payload: TokenUsageView }; + | { type: 'SET_TOKEN_USAGE'; payload: TokenUsageView } + | { type: 'SET_REVIEW_DIFF'; payload: ReviewDiffView | null }; export const initialState: WebviewState = initialWebviewState(); @@ -51,6 +53,7 @@ export function webviewReducer(state: WebviewState, action: WebviewAction): Webv messages[messages.length - 1] = { ...nextLast, content: prevLast.content, + reasoningContent: prevLast.reasoningContent ?? nextLast.reasoningContent, streaming: true, }; return { ...incoming, messages }; @@ -69,6 +72,7 @@ export function webviewReducer(state: WebviewState, action: WebviewAction): Webv messages[lastIdx] = { ...messages[lastIdx], content: action.payload.content, + reasoningContent: action.payload.reasoningContent ?? messages[lastIdx].reasoningContent, streaming: action.payload.streaming, }; } else { @@ -76,6 +80,7 @@ export function webviewReducer(state: WebviewState, action: WebviewAction): Webv id: `stream-${Date.now()}`, role: 'assistant', content: action.payload.content, + reasoningContent: action.payload.reasoningContent, timestamp: Date.now(), streaming: action.payload.streaming, }); @@ -124,6 +129,9 @@ export function webviewReducer(state: WebviewState, action: WebviewAction): Webv case 'SET_TOKEN_USAGE': return { ...state, tokenUsage: action.payload }; + case 'SET_REVIEW_DIFF': + return { ...state, reviewDiff: action.payload }; + default: return state; } diff --git a/src/webview-ui/src/state/useVsCodeMessaging.ts b/src/webview-ui/src/state/useVsCodeMessaging.ts index 75deb0e3..bc228766 100644 --- a/src/webview-ui/src/state/useVsCodeMessaging.ts +++ b/src/webview-ui/src/state/useVsCodeMessaging.ts @@ -73,6 +73,9 @@ export function useVsCodeMessaging() { case 'setTokenUsage': dispatch({ type: 'SET_TOKEN_USAGE', payload: message.payload }); break; + case 'setReviewDiff': + dispatch({ type: 'SET_REVIEW_DIFF', payload: message.payload }); + break; case 'setContextPaths': if (message.payload.requestId === pathSearchRequestIdRef.current) { setPathSuggestions(message.payload.paths); diff --git a/src/webview-ui/src/styles/global.css b/src/webview-ui/src/styles/global.css index 46185ac9..bdacab6a 100644 --- a/src/webview-ui/src/styles/global.css +++ b/src/webview-ui/src/styles/global.css @@ -154,6 +154,41 @@ body, background: transparent; } +.has-tooltip { + position: relative; +} + +.has-tooltip::after { + content: attr(data-tooltip); + position: absolute; + top: calc(100% + 6px); + left: 50%; + z-index: 60; + max-width: min(260px, calc(100vw - 24px)); + width: max-content; + padding: 5px 8px; + border: 1px solid var(--thunder-border); + border-radius: 5px; + background: var(--vscode-editorHoverWidget-background, var(--thunder-surface)); + color: var(--vscode-editorHoverWidget-foreground, var(--thunder-fg)); + box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28); + font-size: 11px; + font-weight: 500; + line-height: 1.35; + opacity: 0; + pointer-events: none; + text-align: center; + transform: translate(-50%, -2px); + transition: opacity 0.06s ease, transform 0.06s ease; + white-space: normal; +} + +.has-tooltip:hover::after, +.has-tooltip:focus-visible::after { + opacity: 1; + transform: translate(-50%, 0); +} + /* ── Token chip ── */ .token-popover { position: relative; @@ -380,8 +415,11 @@ body, .chat-body { flex: 1; overflow-y: auto; - padding: 12px var(--thunder-spacing); + padding: 14px var(--thunder-spacing) 18px; min-height: 0; + background: + linear-gradient(180deg, color-mix(in srgb, var(--thunder-surface-2) 70%, transparent), transparent 72px), + var(--thunder-bg); } .plan-panel { @@ -913,9 +951,9 @@ body, .chat-footer { flex-shrink: 0; - padding: 8px var(--thunder-spacing) 10px; + padding: 10px var(--thunder-spacing) 12px; border-top: 1px solid var(--thunder-border); - background: var(--thunder-surface-2); + background: color-mix(in srgb, var(--thunder-surface-2) 94%, var(--thunder-bg)); } .message-working { @@ -1154,23 +1192,31 @@ body, /* ── Composer (Cursor-style) ── */ .composer__box { border: 1px solid var(--thunder-border); - border-radius: 10px; - background: var(--thunder-input-bg); + border-radius: 8px; + background: color-mix(in srgb, var(--thunder-input-bg) 92%, var(--thunder-surface)); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18); overflow: visible; position: relative; } +.composer__box:focus-within { + border-color: color-mix(in srgb, var(--thunder-accent) 78%, var(--thunder-border)); + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--thunder-accent) 32%, transparent), + 0 10px 28px rgba(0, 0, 0, 0.22); +} + .composer__input { display: block; width: 100%; - padding: 10px 12px 6px; + padding: 12px 12px 8px; border: none; background: transparent; color: var(--thunder-input-fg); font-family: var(--thunder-font); font-size: var(--thunder-msg-size); resize: none; - min-height: 72px; + min-height: 76px; max-height: 200px; line-height: 1.55; } @@ -1183,89 +1229,233 @@ body, opacity: 0.6; } +.composer__attachments { + display: flex; + flex-wrap: wrap; + gap: 6px; + padding: 0 10px 6px; +} + +.composer__attachment { + display: inline-flex; + max-width: 180px; + padding: 3px 8px; + border: 1px solid var(--thunder-border); + border-radius: 5px; + background: rgba(255, 255, 255, 0.04); + color: var(--thunder-fg); + font: inherit; + font-size: 11px; + cursor: pointer; +} + +.composer__attachment-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.composer__file-input { + display: none; +} + .composer__footer { display: flex; - align-items: center; + align-items: flex-end; justify-content: space-between; - gap: 8px; - padding: 4px 6px 6px 10px; + gap: 10px; + padding: 7px 7px 7px 10px; + border-top: 1px solid color-mix(in srgb, var(--thunder-border) 58%, transparent); } .composer__left { display: flex; align-items: center; - gap: 8px; + flex-wrap: wrap; + gap: 7px; min-width: 0; flex: 1; } -.composer__modes { - display: flex; - gap: 2px; -} - -.composer__mode-select-wrap { +.composer__dropdown { position: relative; display: inline-flex; align-items: center; + min-width: 0; + --composer-control-color: var(--thunder-accent); } -.composer__mode-select { - appearance: none; - padding: 3px 22px 3px 8px; - border: 1px solid var(--thunder-border); - border-radius: 5px; - background: rgba(255, 255, 255, 0.04); +.composer__dropdown-button { + display: inline-flex; + align-items: center; + justify-content: space-between; + gap: 8px; + height: 28px; + min-width: 108px; + padding: 0 24px 0 8px; + border: 1px solid color-mix(in srgb, var(--composer-control-color) 58%, var(--thunder-border)); + border-radius: 6px; + background: color-mix(in srgb, var(--thunder-bg) 20%, transparent); color: var(--thunder-fg); + font: inherit; font-size: 11px; font-weight: 600; - font-family: var(--thunder-font); cursor: pointer; - max-width: 88px; } -.composer__approval-select { - max-width: 92px; - color: var(--thunder-muted); +.composer__dropdown-button:hover, +.composer__dropdown-button:focus-visible, +.composer__dropdown-button[aria-expanded='true'] { + outline: none; + background: color-mix(in srgb, var(--composer-control-color) 12%, var(--thunder-bg)); + box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--composer-control-color) 35%, transparent); } -.composer__depth-select { - max-width: 104px; - color: var(--thunder-muted); +.composer__dropdown--mode .composer__dropdown-button { + min-width: 96px; } -.composer__mode-select:focus { - outline: 1px solid var(--thunder-accent); +.composer__dropdown--approval .composer__dropdown-button { + min-width: 128px; +} + +.composer__dropdown--depth .composer__dropdown-button { + min-width: 112px; +} + +.composer__dropdown-value { + display: inline-flex; + align-items: center; + gap: 6px; + min-width: 0; +} + +.composer__dropdown-value span:last-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.composer__dropdown-icon, +.composer__dropdown-dot { + flex: 0 0 auto; + color: var(--composer-control-color); +} + +.composer__dropdown-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--composer-control-color); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--composer-control-color) 18%, transparent); } .composer__mode-chevron { position: absolute; right: 6px; pointer-events: none; - color: var(--thunder-muted); + color: color-mix(in srgb, var(--composer-control-color) 70%, var(--thunder-muted)); } -.composer__mode { - padding: 2px 7px; - border: none; - border-radius: 4px; +.composer__dropdown-menu { + position: absolute; + bottom: calc(100% + 7px); + left: 0; + z-index: 50; + display: grid; + gap: 2px; + width: max(220px, 100%); + max-width: min(280px, calc(100vw - 24px)); + padding: 5px; + border: 1px solid var(--thunder-border); + border-radius: 7px; + background: var(--vscode-quickInput-background, var(--thunder-surface)); + box-shadow: 0 12px 30px rgba(0, 0, 0, 0.38); +} + +.composer__dropdown-option { + display: grid; + grid-template-columns: 18px minmax(0, 1fr); + align-items: start; + gap: 8px; + width: 100%; + min-height: 38px; + padding: 7px 8px; + border: 0; + border-radius: 5px; background: transparent; - color: var(--thunder-muted); - font-size: 10px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.03em; + color: var(--thunder-fg); + font: inherit; + text-align: left; cursor: pointer; } -.composer__mode:hover { - color: var(--thunder-fg); - background: rgba(255, 255, 255, 0.05); +.composer__dropdown-option:hover, +.composer__dropdown-option:focus-visible, +.composer__dropdown-option--selected { + outline: none; + background: color-mix(in srgb, var(--composer-option-color) 14%, transparent); +} + +.composer__dropdown-option-icon, +.composer__dropdown-option-dot { + margin-top: 2px; + color: var(--composer-option-color); } -.composer__mode--active { - background: rgba(255, 255, 255, 0.1); +.composer__dropdown-option-dot { + width: 9px; + height: 9px; + margin-top: 5px; + border-radius: 50%; + background: var(--composer-option-color); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--composer-option-color) 18%, transparent); +} + +.composer__dropdown-option-text { + display: grid; + gap: 1px; + min-width: 0; +} + +.composer__dropdown-option-text span { color: var(--thunder-fg); + font-size: 11px; + font-weight: 700; + line-height: 1.25; +} + +.composer__dropdown-option-text small { + overflow: hidden; + color: var(--thunder-muted); + font-size: 10px; + font-weight: 500; + line-height: 1.25; + text-overflow: ellipsis; + white-space: nowrap; +} + +.composer .has-tooltip::after { + top: auto; + bottom: calc(100% + 8px); +} + +.composer__dropdown:has(.composer__dropdown-menu) > .composer__dropdown-button.has-tooltip::after { + display: none; +} + +.composer__dropdown-option.has-tooltip::after { + top: 50%; + bottom: auto; + left: calc(100% + 8px); + max-width: min(260px, calc(100vw - 24px)); + text-align: left; + transform: translate(2px, -50%); +} + +.composer__dropdown-option.has-tooltip:hover::after, +.composer__dropdown-option.has-tooltip:focus-visible::after { + transform: translate(0, -50%); } .composer__tokens { @@ -1279,23 +1469,30 @@ body, align-items: center; gap: 2px; flex-shrink: 0; + padding-bottom: 1px; } /* ── Messages ── */ .message-list { display: flex; flex-direction: column; - gap: 16px; + gap: 14px; + max-width: 980px; + margin: 0 auto; } .message { line-height: 1.55; + display: flex; } .message--user .message-content { - padding: 9px 11px; - border-radius: var(--thunder-radius); - background: rgba(38, 79, 120, 0.35); + margin-left: auto; + max-width: min(86%, 760px); + padding: 9px 12px; + border: 1px solid color-mix(in srgb, var(--thunder-accent) 28%, transparent); + border-radius: 8px; + background: color-mix(in srgb, var(--thunder-user-bg) 48%, var(--thunder-surface)); font-size: var(--thunder-msg-size); line-height: 1.5; white-space: pre-wrap; @@ -1303,6 +1500,7 @@ body, } .message--assistant .message-content { + max-width: min(100%, 900px); font-size: var(--thunder-msg-size); line-height: 1.55; word-break: break-word; @@ -1310,6 +1508,7 @@ body, .message--activity .message-content { max-width: 100%; + width: 100%; } .message--activity { @@ -1342,19 +1541,44 @@ body, } .empty-title { - font-size: 16px; + font-size: 18px; font-weight: 600; color: var(--thunder-fg); - margin: 0 0 6px; + margin: 0 0 7px; } .empty-subtitle { margin: 0; font-size: 13px; - max-width: 280px; + max-width: 320px; line-height: 1.5; } +@media (max-width: 420px) { + .composer__footer { + align-items: stretch; + flex-direction: column; + } + + .composer__left, + .composer__actions { + width: 100%; + } + + .composer__dropdown { + width: 100%; + } + + .composer__dropdown-button { + flex: 1; + min-width: 0; + } + + .composer__actions { + justify-content: flex-end; + } +} + /* ── Buttons (settings / approvals) ── */ .btn { min-height: 28px; @@ -1396,6 +1620,152 @@ body, background: rgba(255, 255, 255, 0.05); } +.onboarding { + display: grid; + gap: 14px; + max-width: 720px; + margin: 0 auto; +} + +.onboarding__header, +.review-panel__header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.onboarding__title, +.review-panel__title { + margin: 0; + font-size: 18px; + line-height: 1.25; +} + +.onboarding__subtitle, +.review-panel__subtitle { + margin: 4px 0 0; + color: var(--thunder-muted); + font-size: 12px; + line-height: 1.45; +} + +.onboarding__steps { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 6px; +} + +.onboarding__step { + min-height: 30px; + border: 1px solid var(--thunder-border); + border-radius: 5px; + background: transparent; + color: var(--thunder-muted); + font: inherit; + font-size: 11px; + font-weight: 700; + cursor: pointer; +} + +.onboarding__step--active { + border-color: var(--thunder-accent); + color: var(--thunder-fg); +} + +.onboarding__body, +.review-panel__empty { + display: grid; + gap: 12px; + padding: 14px; + border: 1px solid var(--thunder-border); + border-radius: 8px; + background: var(--thunder-surface); +} + +.onboarding__body h3, +.review-panel__empty h3 { + margin: 0; + font-size: 14px; +} + +.onboarding__body p, +.review-panel__empty p { + margin: 0; + color: var(--thunder-muted); + font-size: 12px; + line-height: 1.45; +} + +.onboarding__actions, +.review-panel__actions { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.review-panel { + display: grid; + align-content: start; + gap: 12px; +} + +.review-panel__files { + display: grid; + gap: 8px; +} + +.review-file { + border: 1px solid var(--thunder-border); + border-radius: 8px; + background: var(--thunder-surface); + overflow: hidden; +} + +.review-file__summary { + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + gap: 8px; + padding: 9px 10px; + cursor: pointer; +} + +.review-file__status { + min-width: 22px; + color: var(--thunder-accent); + font-size: 10px; + font-weight: 800; +} + +.review-file__path { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-family: var(--vscode-editor-font-family, ui-monospace, SFMono-Regular, Menlo, monospace); + font-size: 11px; +} + +.review-file__stats { + color: var(--thunder-muted); + font-size: 10px; + font-weight: 700; +} + +.review-file__diff { + max-height: 420px; + margin: 0; + padding: 10px; + overflow: auto; + border-top: 1px solid var(--thunder-border); + background: var(--thunder-surface-2); + color: var(--thunder-fg); + font-family: var(--vscode-editor-font-family, ui-monospace, SFMono-Regular, Menlo, monospace); + font-size: 11px; + line-height: 1.45; + white-space: pre; +} + .btn--small { min-height: 24px; padding: 3px 8px; @@ -2153,6 +2523,37 @@ body, font-weight: 600; } +.thinking-block[open] summary { + margin-bottom: 6px; +} + +.thinking-block[open] summary::after { + content: ''; + display: inline-block; + width: 6px; + height: 6px; + margin-left: 8px; + border-radius: 999px; + background: #60a5fa; + animation: thinkingPulse 1.2s ease-in-out infinite; +} + +.thinking-block pre { + margin: 0; + max-height: 320px; + overflow: auto; + white-space: pre-wrap; + word-break: break-word; + font-family: var(--vscode-editor-font-family, ui-monospace, SFMono-Regular, Menlo, monospace); + font-size: 11px; + line-height: 1.5; +} + +@keyframes thinkingPulse { + 0%, 100% { opacity: 0.35; transform: scale(0.85); } + 50% { opacity: 1; transform: scale(1); } +} + /* ── History ── */ .history-panel { display: flex; @@ -2395,6 +2796,7 @@ body, gap: 0; min-height: 0; flex: 1; + position: relative; } .settings-shell__header { @@ -2680,6 +3082,10 @@ body, line-height: 1.45; } +.settings-inline-note--error { + color: var(--thunder-error-fg); +} + .settings-inline-note code { font-size: 10px; } @@ -2900,6 +3306,76 @@ body, color: var(--thunder-muted); } +.workspace-settings { + display: flex; + flex-direction: column; + gap: 14px; +} + +.workspace-stats { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; +} + +.workspace-stat { + display: flex; + flex-direction: column; + gap: 2px; + padding: 10px 12px; + border: 1px solid var(--thunder-border); + border-radius: var(--thunder-radius); + background: var(--thunder-surface); +} + +.workspace-stat__label { + font-size: 11px; + color: var(--thunder-muted); +} + +.workspace-stat__value { + font-size: 14px; + font-weight: 600; +} + +.workspace-stat__meta { + font-size: 11px; + color: var(--thunder-muted); +} + +.settings-input--path { + font-family: var(--vscode-editor-font-family, monospace); + font-size: 12px; +} + +.settings-loading-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + background: color-mix(in srgb, var(--thunder-bg) 82%, transparent); + z-index: 5; + font-size: 13px; + color: var(--thunder-fg); +} + +.settings-loading-spinner { + width: 16px; + height: 16px; + border: 2px solid var(--thunder-border); + border-top-color: var(--thunder-accent, #007acc); + border-radius: 50%; + animation: settings-spin 0.8s linear infinite; +} + +@keyframes settings-spin { + to { + transform: rotate(360deg); + } +} + .btn--ghost { background: transparent; border: 1px solid var(--thunder-border); diff --git a/src/webview-ui/src/utils/approvalMode.ts b/src/webview-ui/src/utils/approvalMode.ts index ec4fad3e..1c31f56e 100644 --- a/src/webview-ui/src/utils/approvalMode.ts +++ b/src/webview-ui/src/utils/approvalMode.ts @@ -23,7 +23,7 @@ export const APPROVAL_MODE_OPTIONS: Array<{ id: ApprovalMode; label: string; tit }, { id: 'auto', - label: 'Auto', + label: 'Auto approve', title: 'Auto-approve allowed operations', }, ]; diff --git a/src/webview-ui/src/utils/autonomyPreset.ts b/src/webview-ui/src/utils/autonomyPreset.ts new file mode 100644 index 00000000..39e8e8f9 --- /dev/null +++ b/src/webview-ui/src/utils/autonomyPreset.ts @@ -0,0 +1,68 @@ +import type { ApprovalMode, SafetySettingsPayload } from '../../../vscode/webview/messages'; + +export type AutonomyPreset = SafetySettingsPayload['autonomyPreset']; + +export const AUTONOMY_PRESET_OPTIONS: Array<{ + id: AutonomyPreset; + label: string; + title: string; +}> = [ + { id: 'safe', label: 'Safe', title: 'Strictest — all edits and commands need approval, no network' }, + { id: 'guided', label: 'Guided', title: 'Balanced — asks before edits; read-only shell and web fetch allowed' }, + { id: 'builder', label: 'Builder', title: 'Fast — auto-approves writes; mutating shell still reviewed' }, + { id: 'pilot', label: 'Pilot', title: 'High autonomy — auto-approves writes, reviews shell' }, + { id: 'enterprise', label: 'Enterprise', title: 'Locked down — no network, all operations reviewed' }, +]; + +export function deriveSafetyFromAutonomyPreset(preset: AutonomyPreset): SafetySettingsPayload { + switch (preset) { + case 'safe': + return { + autonomyPreset: preset, + approvalMode: 'review_all', + requireApprovalForWrites: true, + requireApprovalForShell: true, + }; + case 'guided': + return { + autonomyPreset: preset, + approvalMode: 'ask_edits', + requireApprovalForWrites: true, + requireApprovalForShell: false, + }; + case 'builder': + return { + autonomyPreset: preset, + approvalMode: 'ask_commands', + requireApprovalForWrites: false, + requireApprovalForShell: true, + }; + case 'pilot': + return { + autonomyPreset: preset, + approvalMode: 'auto', + requireApprovalForWrites: false, + requireApprovalForShell: true, + }; + case 'enterprise': + return { + autonomyPreset: preset, + approvalMode: 'review_all', + requireApprovalForWrites: true, + requireApprovalForShell: true, + }; + } +} + +export function autonomyPresetFromApprovalMode( + approvalMode: ApprovalMode, + currentPreset: AutonomyPreset = 'guided' +): AutonomyPreset { + if (approvalMode === 'review_all') { + return currentPreset === 'enterprise' ? 'enterprise' : 'safe'; + } + if (approvalMode === 'ask_edits') return 'guided'; + if (approvalMode === 'ask_commands') return 'builder'; + if (approvalMode === 'auto') return 'pilot'; + return currentPreset; +} diff --git a/test/act/act-orchestration.test.ts b/test/act/act-orchestration.test.ts index 3d4775d2..b3ac8151 100644 --- a/test/act/act-orchestration.test.ts +++ b/test/act/act-orchestration.test.ts @@ -142,6 +142,19 @@ describe('Act orchestration boundary', () => { expect(route.summary).toContain('GitHub issue'); }); + it('does not use the GitHub issue route for reference-only issue detections', () => { + const message = 'Can you summarize https://github.com/acme/app/issues/7?'; + const analysis = analyzeTask(message, 'agent'); + const route = routeActIntent(message, analysis, { + mode: 'agent', + githubIssueMode: false, + orchestrationEnabled: true, + }); + + expect(route.summary).not.toContain('GitHub issue'); + expect(route.shouldVerify).toBe(false); + }); + it('adds ACT skill tool guidance to Agent system prompts when tools are enabled', () => { const prompt = buildSystemPrompt('agent', true); expect(prompt).toContain('ACT SKILLS:'); diff --git a/test/agent-loop.test.ts b/test/agent-loop.test.ts index f40525bd..62c218b8 100644 --- a/test/agent-loop.test.ts +++ b/test/agent-loop.test.ts @@ -1,5 +1,6 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { AgentLoop } from '../src/core/runtime/AgentLoop'; +import { chunkContent } from '../src/core/llm/streamChunks'; import type { ToolExecutor } from '../src/core/safety/ToolExecutor'; import type { LlmProvider } from '../src/core/llm/types'; import type { ThunderPlan } from '../src/core/plans/PlanActEngine'; @@ -60,7 +61,7 @@ describe('AgentLoop E2E', () => { undefined, { planTracker: plan, maxSteps: 3 } )) { - chunks.push(chunk); + chunks.push(chunkContent(chunk)); } expect(chunks.join('')).toContain('Done'); @@ -145,7 +146,7 @@ describe('AgentLoop E2E', () => { undefined, { maxSteps: 3, phaseLock: 'verify' } )) { - chunks.push(chunk); + chunks.push(chunkContent(chunk)); } expect(chunks.join('')).toContain('Recovered'); @@ -190,7 +191,7 @@ describe('AgentLoop E2E', () => { undefined, { maxSteps: 5 } )) { - chunks.push(chunk); + chunks.push(chunkContent(chunk)); } expect(executor.execute).toHaveBeenCalledTimes(2); @@ -220,7 +221,7 @@ describe('AgentLoop E2E', () => { state, [{ toolCallId: 'c1', toolName: 'write_file', output: 'written', success: true }], )) { - chunks.push(chunk); + chunks.push(chunkContent(chunk)); } expect(chunks.join('')).toContain('Resumed'); diff --git a/test/ask-plan-modes.test.ts b/test/ask-plan-modes.test.ts index d1d2f6af..30045b42 100644 --- a/test/ask-plan-modes.test.ts +++ b/test/ask-plan-modes.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; +import { chunkContent } from '../src/core/llm/streamChunks'; import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync, existsSync } from 'fs'; import { tmpdir } from 'os'; import { join } from 'path'; @@ -123,7 +124,7 @@ describe('Ask and Plan mode reliability', () => { undefined, { askMode: true, requiresAskGrounding: true, maxSteps: 1, maxAutoContinues: 0 } )) { - chunks.push(chunk); + chunks.push(chunkContent(chunk)); } expect(chunks.join('')).toContain('JWT'); @@ -179,7 +180,7 @@ describe('Ask and Plan mode reliability', () => { undefined, { planMode: true, requiresPlanGrounding: true, maxSteps: 3 } )) { - chunks.push(chunk); + chunks.push(chunkContent(chunk)); } expect(seen.some((text) => text.includes('Plan mode MUST be grounded'))).toBe(true); diff --git a/test/audit-pack.test.ts b/test/audit-pack.test.ts new file mode 100644 index 00000000..1fdd0e6e --- /dev/null +++ b/test/audit-pack.test.ts @@ -0,0 +1,65 @@ +import { describe, expect, it } from 'vitest'; +import { mkdtempSync, rmSync, writeFileSync } from 'fs'; +import { join } from 'path'; +import { tmpdir } from 'os'; +import { AuditPackBuilder, verifyAuditPack } from '../src/core/audit'; + +describe('AuditPackBuilder', () => { + it('builds a zip with expected entries and redacts secrets', () => { + const dir = mkdtempSync(join(tmpdir(), 'mitii-audit-test-')); + try { + const logPath = join(dir, 'session.jsonl'); + writeFileSync(logPath, JSON.stringify({ + ts: 1, + type: 'tool_end', + data: { apiKey: 'sk-abc1234567890', output: 'file contents' }, + }) + '\n'); + const result = new AuditPackBuilder().build({ + sessionId: 's1', + workspace: dir, + extensionVersion: '1.0.0', + logPath, + summaryMarkdown: '# Summary', + toolAudit: [], + stripFileContents: true, + }); + + const zipText = result.buffer.toString('latin1'); + expect(result.entries).toEqual([ + 'session.jsonl', + 'summary.md', + 'manifest.json', + 'tool-audit.json', + 'approvals.json', + 'redaction-report.json', + 'signature.json', + ]); + expect(result.buffer.slice(0, 2).toString()).toBe('PK'); + expect(zipText).toContain('session.jsonl'); + expect(zipText).toContain('[REDACTED]'); + expect(zipText).not.toContain('sk-abc1234567890'); + expect(result.redactionReport.secretKeyRedactions).toBeGreaterThan(0); + expect(verifyAuditPack(result.buffer).ok).toBe(true); + } finally { + rmSync(dir, { recursive: true, force: true }); + } + }); + + it('detects signed audit pack tampering', () => { + const result = new AuditPackBuilder().build({ + sessionId: 's1', + workspace: process.cwd(), + extensionVersion: '1.0.0', + summaryMarkdown: '# Summary', + signingKey: 'enterprise-secret', + }); + expect(verifyAuditPack(result.buffer, 'enterprise-secret').ok).toBe(true); + + const tampered = Buffer.from(result.buffer); + const idx = tampered.indexOf('Summary'); + tampered.write('Tamper!', idx, 'utf8'); + const verification = verifyAuditPack(tampered, 'enterprise-secret'); + expect(verification.ok).toBe(false); + expect(verification.errors.some((error) => error.includes('hash mismatch'))).toBe(true); + }); +}); diff --git a/test/benchmark/benchmark.harness.test.ts b/test/benchmark/benchmark.harness.test.ts new file mode 100644 index 00000000..81596463 --- /dev/null +++ b/test/benchmark/benchmark.harness.test.ts @@ -0,0 +1,86 @@ +import { describe, expect, it } from 'vitest'; +// @ts-expect-error benchmark verifier ships as plain ESM +import { verifyTask } from '../../tools/benchmark/verify.mjs'; +import { resolveBundledSkillsRoot } from '../../src/core/skills/resolveBundledSkillsRoot'; +import { listBundledSkillNames } from '../../src/core/skills/installBundledSkills'; +import { buildHeadlessConfig } from '../../src/core/headless/HeadlessConfig'; +import { headlessDiscoverFiles } from '../../src/core/headless/headlessDiscoverFiles'; +import { IgnoreService } from '../../src/core/indexing/IgnoreService'; +import { join } from 'path'; + +describe('benchmark verify rules', () => { + it('checks stdout_contains and file_exists', () => { + const fixture = join(process.cwd(), 'tools/benchmark/fixtures/node-express'); + expect(verifyTask('stdout_contains:Echo:', { + stdout: 'Echo: hello', + stderr: '', + exitCode: 0, + cwd: fixture, + packageRoot: process.cwd(), + mode: 'ask', + }).passed).toBe(true); + + expect(verifyTask('file_exists:src/index.js', { + stdout: '', + stderr: '', + exitCode: 0, + cwd: fixture, + packageRoot: process.cwd(), + mode: 'ask', + }).passed).toBe(true); + }); + + it('validates json_path and jsonl_event', () => { + expect(verifyTask('json_path:steps', { + stdout: JSON.stringify({ steps: [{ id: 'a' }] }), + stderr: '', + exitCode: 0, + cwd: process.cwd(), + packageRoot: process.cwd(), + mode: 'plan', + }).passed).toBe(true); + + expect(verifyTask('jsonl_event:end', { + stdout: ['{"type":"start"}', '{"type":"end"}'].join('\n'), + stderr: '', + exitCode: 0, + cwd: process.cwd(), + packageRoot: process.cwd(), + mode: 'agent', + }).passed).toBe(true); + }); +}); + +describe('core bundled skills', () => { + it('resolves skills from src/core/skills/bundled', () => { + const root = resolveBundledSkillsRoot(process.cwd()); + expect(root).toContain('src/core/skills/bundled'); + const names = listBundledSkillNames(process.cwd()); + expect(names).toContain('test-driven-development'); + expect(names).toContain('browser-testing-with-devtools'); + }); +}); + +describe('headless config', () => { + it('enables tools for real runtime and puppeteer toggle', () => { + const config = buildHeadlessConfig({ + cwd: process.cwd(), + runtime: 'real', + enablePuppeteer: true, + }); + expect(config.provider.supportsTools).toBe(true); + expect(config.mcp.builtinServers.puppeteer).toBe(true); + }); +}); + +describe('fixture discovery', () => { + it('discovers JS files in node-express fixture', () => { + const fixture = join(process.cwd(), 'tools/benchmark/fixtures/node-express'); + const ignore = new IgnoreService(); + ignore.load(fixture, { respectGitignore: true, respectThunderignore: true }); + const files = headlessDiscoverFiles(fixture, ignore, { hardSkipSizeBytes: 2_000_000 }); + const relPaths = files.map((f: { relPath: string }) => f.relPath); + expect(relPaths).toContain('src/index.js'); + expect(relPaths).toContain('src/routes/users.js'); + }); +}); diff --git a/test/benchmark/headless-agent-host.test.ts b/test/benchmark/headless-agent-host.test.ts new file mode 100644 index 00000000..7b6e5667 --- /dev/null +++ b/test/benchmark/headless-agent-host.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, it } from 'vitest'; +import { mkdtempSync } from 'fs'; +import { join } from 'path'; +import { tmpdir } from 'os'; +import { HeadlessAgentHost } from '../../src/core/headless/HeadlessAgentHost'; + +describe('HeadlessAgentHost', () => { + it('runs stub ask/plan/agent without native index', async () => { + const cwd = mkdtempSync(join(tmpdir(), 'mitii-headless-')); + const host = new HeadlessAgentHost({ + cwd, + runtime: 'stub', + providerType: 'echo', + approval: 'auto', + }); + + const answer = await host.ask('hello'); + expect(answer).toContain('Echo:'); + + const plan = await host.plan('ship feature'); + expect(plan).toMatchObject({ goal: 'ship feature' }); + + const events: string[] = []; + for await (const event of host.agent('review code')) { + events.push(event.type); + } + expect(events).toContain('end'); + host.dispose(); + }); + + it('initializes real runtime on fixture workspace', async () => { + const cwd = join(process.cwd(), 'tools/benchmark/fixtures/node-express'); + const host = new HeadlessAgentHost({ + cwd, + packageRoot: process.cwd(), + runtime: 'real', + providerType: 'echo', + approval: 'auto', + indexWorkspace: true, + }); + + try { + await host.initialize(); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + if (message.includes('NODE_MODULE_VERSION') || message.includes('better_sqlite3')) { + host.dispose(); + return; + } + throw error; + } + + expect(host.isRealRuntime).toBe(true); + + const answer = await host.ask('What port does the app use?'); + expect(answer.length).toBeGreaterThan(0); + host.dispose(); + }, 120_000); +}); diff --git a/test/config-ui-mappers.test.ts b/test/config-ui-mappers.test.ts index 5b0a3bc7..e35ed2ac 100644 --- a/test/config-ui-mappers.test.ts +++ b/test/config-ui-mappers.test.ts @@ -119,6 +119,7 @@ describe('config UI mappers', () => { filesystem: false, memory: false, sequentialThinking: false, + puppeteer: false, }, }, indexing: { @@ -138,6 +139,7 @@ describe('config UI mappers', () => { filesystem: true, memory: false, sequentialThinking: true, + puppeteer: false, }) ).toMatchObject({ provider: { diff --git a/test/eval/eval.harness.test.ts b/test/eval/eval.harness.test.ts new file mode 100644 index 00000000..6ba9aa39 --- /dev/null +++ b/test/eval/eval.harness.test.ts @@ -0,0 +1,75 @@ +import { describe, expect, it } from 'vitest'; +import { readFileSync } from 'fs'; +import { execSync } from 'child_process'; +import { join } from 'path'; + +const root = process.cwd(); + +describe('eval task generator', () => { + it('generates at least 500 tasks for standard profile', () => { + execSync('node tools/benchmark/scripts/generate-tasks.mjs --profile standard --output tools/benchmark/tasks/eval/generated-test', { + cwd: root, + stdio: 'pipe', + }); + const manifest = JSON.parse( + readFileSync(join(root, 'tools/benchmark/tasks/eval/generated-test/manifest.json'), 'utf8') + ); + expect(manifest.actualCount).toBeGreaterThanOrEqual(500); + expect(manifest.shards.length).toBeGreaterThan(0); + }); + + it('generates up to 1000 tasks for full profile', () => { + execSync('node tools/benchmark/scripts/generate-tasks.mjs --profile full --output tools/benchmark/tasks/eval/generated-test-full', { + cwd: root, + stdio: 'pipe', + }); + const manifest = JSON.parse( + readFileSync(join(root, 'tools/benchmark/tasks/eval/generated-test-full/manifest.json'), 'utf8') + ); + expect(manifest.actualCount).toBeGreaterThanOrEqual(1000); + }); + + it('produces unique task ids', () => { + const index = JSON.parse( + readFileSync(join(root, 'tools/benchmark/tasks/eval/generated-test/index.json'), 'utf8') + ); + const ids = new Set(); + for (const shard of index.includes) { + const tasks = JSON.parse(readFileSync(join(root, 'tools/benchmark/tasks/eval/generated-test', shard), 'utf8')); + for (const task of tasks) { + expect(ids.has(task.id)).toBe(false); + ids.add(task.id); + } + } + }); +}); + +describe('eval packaging', () => { + it('excludes eval and benchmark from VSIX', () => { + const ignore = readFileSync(join(root, '.vscodeignore'), 'utf8'); + expect(ignore).toContain('tools/benchmark/**'); + }); +}); + +describe('eval preflight', () => { + it('loads better-sqlite3 or reports ABI guidance', async () => { + // @ts-expect-error eval preflight ships as plain ESM + const { checkSqliteLoad } = await import('../../tools/benchmark/scripts/preflight.mjs'); + const result = checkSqliteLoad(); + if (!result.ok) { + expect(result.message).toMatch(/NODE_MODULE_VERSION|better-sqlite3/i); + return; + } + expect(result.ok).toBe(true); + }); +}); + +describe('eval runner dry-run', () => { + it('loads generated tasks', () => { + const out = execSync( + 'node tools/benchmark/scripts/run-eval.mjs --dry-run --limit 5 --tasks tools/benchmark/tasks/eval/generated-test/index.json --no-ensure-ready', + { cwd: root, encoding: 'utf8' } + ); + expect(out).toContain('Dry run: 5 tasks'); + }); +}); diff --git a/test/features.test.ts b/test/features.test.ts index 6dcd64a4..6a53e392 100644 --- a/test/features.test.ts +++ b/test/features.test.ts @@ -15,6 +15,9 @@ describe('providerPresets', () => { const types = PROVIDER_PRESETS.map((p) => p.type); expect(types).toEqual(expect.arrayContaining([ 'openai', + 'openrouter', + 'azure-openai', + 'bedrock', 'anthropic', 'gemini', 'deepseek', @@ -25,6 +28,9 @@ describe('providerPresets', () => { it('resolves preset by type', () => { expect(getProviderPreset('anthropic')?.model).toContain('claude'); + expect(getProviderPreset('openrouter')?.baseUrl).toContain('openrouter'); + expect(getProviderPreset('azure-openai')?.model).toContain('deployment'); + expect(getProviderPreset('bedrock')?.model).toContain('anthropic.claude'); expect(getProviderPreset('gemini')?.baseUrl).toContain('generativelanguage'); }); @@ -74,6 +80,38 @@ describe('createProvider', () => { }); expect(provider.id).toBe('openai-compatible'); }); + + it('creates native OpenRouter provider with provider-specific id', () => { + const provider = createProvider({ + ...defaultThunderConfig().provider, + type: 'openrouter', + baseUrl: 'https://openrouter.ai/api/v1', + model: 'anthropic/claude-sonnet-4', + }, 'test-key'); + expect(provider.id).toBe('openrouter'); + }); + + it('creates Azure OpenAI provider with provider-specific id', () => { + const provider = createProvider({ + ...defaultThunderConfig().provider, + type: 'azure-openai', + baseUrl: 'https://example.openai.azure.com', + model: 'my-deployment', + apiVersion: '2024-10-21', + }, 'test-key'); + expect(provider.id).toBe('azure-openai'); + }); + + it('creates AWS Bedrock provider with tool support disabled', () => { + const provider = createProvider({ + ...defaultThunderConfig().provider, + type: 'bedrock', + region: 'us-east-1', + model: 'anthropic.claude-3-5-sonnet-20240620-v1:0', + }); + expect(provider.id).toBe('bedrock'); + expect(provider.capabilities.supportsTools).toBe(false); + }); }); describe('sanitizeOpenAiCompatibleMessages', () => { @@ -155,6 +193,42 @@ describe('OpenAiCompatibleProvider', () => { expect(body.model).not.toBe('qwen3.6:27b'); }); + it('passes custom headers and reasoning options for native providers', async () => { + const provider = new OpenAiCompatibleProvider({ + baseUrl: 'https://openrouter.ai/api/v1', + model: 'anthropic/claude-sonnet-4', + apiKey: 'test-key', + providerId: 'openrouter', + defaultHeaders: { 'HTTP-Referer': 'https://mitii.dev', 'X-Title': 'Mitii Agent' }, + includeReasoning: true, + capabilities: { supportsTools: true }, + }); + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + json: async () => ({ choices: [{ message: { content: 'ok', reasoning: 'thinking' }, finish_reason: 'stop' }] }), + }); + vi.stubGlobal('fetch', fetchMock); + + const deltas = []; + try { + for await (const delta of provider.complete({ + messages: [{ role: 'user', content: 'hi' }], + stream: false, + })) { + deltas.push(delta); + } + } finally { + vi.unstubAllGlobals(); + } + + const init = fetchMock.mock.calls[0][1]; + const body = JSON.parse(init.body); + expect(init.headers['HTTP-Referer']).toBe('https://mitii.dev'); + expect(init.headers.Authorization).toBe('Bearer test-key'); + expect(body.include_reasoning).toBe(true); + expect(deltas.some((delta) => delta.reasoning === 'thinking')).toBe(true); + }); + it('omits tool definitions when the configured model does not support tools', async () => { const provider = new OpenAiCompatibleProvider({ baseUrl: 'https://example.com/v1', diff --git a/test/fixtures/session-recovery/active-plan.json b/test/fixtures/session-recovery/active-plan.json new file mode 100644 index 00000000..7f40b6d7 --- /dev/null +++ b/test/fixtures/session-recovery/active-plan.json @@ -0,0 +1,31 @@ +{ + "goal": "Add Ollama local agent support", + "assumptions": [ + "The workspace should keep the saved implementation plan across sidebar and workspace reloads." + ], + "steps": [ + { + "id": "step-1", + "title": "Create Ollama configuration", + "status": "done", + "phase": "diagnostics", + "objective": "Document local Ollama provider settings", + "tools": ["write_file"], + "successCriteria": ["Example config exists"], + "files": ["config/ollama-config.example.yml"], + "risk": "low" + }, + { + "id": "step-2", + "title": "Implement Ollama provider", + "status": "running", + "phase": "execute", + "objective": "Add an OpenAI-compatible local provider path", + "tools": ["apply_patch"], + "successCriteria": ["Provider streams responses from localhost Ollama"], + "files": ["lib/ollama-provider.mjs"], + "risk": "medium" + } + ], + "requiredApprovals": [] +} diff --git a/test/messages.test.ts b/test/messages.test.ts index 2f66a28b..68988532 100644 --- a/test/messages.test.ts +++ b/test/messages.test.ts @@ -9,6 +9,7 @@ describe('Webview message protocol', () => { expect(state.messages).toHaveLength(0); expect(state.approvals).toHaveLength(0); expect(state.indexing.running).toBe(false); + expect(state.settings.hasGithubToken).toBe(false); }); it('has default context toggles with diagnostics off by default', () => { diff --git a/test/microtasks.test.ts b/test/microtasks.test.ts new file mode 100644 index 00000000..b56be62a --- /dev/null +++ b/test/microtasks.test.ts @@ -0,0 +1,84 @@ +import { describe, expect, it } from 'vitest'; +import { budgetDiff } from '../src/core/scm/GitDiffCollector'; +import { buildCommitMessagePrompt, redactSensitiveDiff } from '../src/core/scm/commitMessagePrompt'; +import { detectMicroTask, MicroTaskExecutor } from '../src/core/microtasks'; +import type { GitService } from '../src/core/context/GitService'; +import type { LlmProvider } from '../src/core/llm/types'; + +describe('microtasks', () => { + it('detects supported micro-task intents', () => { + expect(detectMicroTask('write commit message please')).toBe('commit_message'); + expect(detectMicroTask('Need commit message for the changes in stage @mitii-ai-agent')).toBe('commit_message'); + expect(detectMicroTask('suggest a subject for staged changes')).toBe('commit_message'); + expect(detectMicroTask('what changed since v1.2.0')).toBe('changelog_entry'); + expect(detectMicroTask("draft what's new")).toBe('release_notes_draft'); + expect(detectMicroTask('explain the auth flow')).toBeNull(); + }); + + it('redacts sensitive diff lines in prompts', () => { + const prompt = buildCommitMessagePrompt({ + stagedDiff: '+ API_KEY=sk-secret-value', + unstagedDiff: '', + changedFiles: ['M src/index.ts'], + recentCommits: [], + branch: 'main', + }); + expect(prompt).toContain('[redacted sensitive line]'); + expect(prompt).not.toContain('sk-secret-value'); + }); + + it('budgets large diffs by file and total caps', () => { + const diff = [ + 'diff --git a/a.ts b/a.ts', + 'index 111..222', + '--- a/a.ts', + '+++ b/a.ts', + '@@ -1 +1 @@', + `+${'x'.repeat(5000)}`, + 'diff --git a/b.ts b/b.ts', + 'index 333..444', + '--- a/b.ts', + '+++ b/b.ts', + '@@ -1 +1 @@', + '+ok', + ].join('\n'); + const out = budgetDiff(diff, { totalMaxChars: 1000, perFileMaxChars: 200 }); + expect(out.length).toBeLessThanOrEqual(1100); + expect(out).toContain('diff truncated'); + expect(out).toContain('diff --git a/b.ts b/b.ts'); + }); + + it('runs commit-message micro-task with toolChoice none', async () => { + const calls: unknown[] = []; + const provider: LlmProvider = { + id: 'fake', + capabilities: { contextWindow: 8192, supportsEmbeddings: false, supportsStreaming: true, supportsTools: true }, + async *complete(request) { + calls.push(request); + yield { content: 'feat: add audit pack export' }; + yield { done: true }; + }, + }; + const git = { + isGitRepo: true, + getStagedDiff: async () => 'diff --git a/src/a.ts b/src/a.ts\n+export const a = 1;', + getUnstagedDiff: async () => '', + getChangedFilesDetailed: async () => ['M src/a.ts'], + getRecentCommits: async () => ['abc123 feat: old thing'], + getCurrentBranch: async () => 'main', + } as unknown as GitService; + + const result = await new MicroTaskExecutor({ workspace: process.cwd(), git, provider }).execute( + 'commit_message', + 'write commit message' + ); + + expect(result.content).toBe('feat: add audit pack export'); + expect(calls).toHaveLength(1); + expect(calls[0]).toMatchObject({ toolChoice: 'none', maxTokens: 240 }); + }); + + it('redacts standalone sensitive diff helper output', () => { + expect(redactSensitiveDiff('+password=abc123')).toBe('+[redacted sensitive line]'); + }); +}); diff --git a/test/release.test.ts b/test/release.test.ts new file mode 100644 index 00000000..a8944737 --- /dev/null +++ b/test/release.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest'; +import { generateChangelogEntry, insertChangelogEntry } from '../src/core/release/ChangelogGenerator'; +import { generateReleaseNotes } from '../src/core/release/ReleaseNotesGenerator'; +import { parseConventionalSubject } from '../src/core/release/GitHistoryCollector'; + +describe('release automation', () => { + const commits = [ + { hash: 'aaa111', subject: 'feat(ui): stream reasoning', type: 'feat', scope: 'ui', description: 'stream reasoning', breaking: false }, + { hash: 'bbb222', subject: 'fix: redact token', type: 'fix', description: 'redact token', breaking: false }, + { hash: 'ccc333', subject: 'feat!: change api', type: 'feat', description: 'change api', breaking: true }, + ]; + + it('groups conventional commits into changelog sections', () => { + const out = generateChangelogEntry({ commits, version: '1.2.3', date: new Date('2026-07-02T00:00:00Z') }); + expect(out).toContain('## [1.2.3] - 2026-07-02'); + expect(out).toContain('### Breaking'); + expect(out).toContain('### Added'); + expect(out).toContain('**ui:** stream reasoning'); + expect(out).toContain('### Fixed'); + }); + + it('detects breaking changes from subject and body', () => { + expect(parseConventionalSubject('feat!: replace config').breaking).toBe(true); + expect(parseConventionalSubject('feat: replace config', 'BREAKING CHANGE: config moved').breaking).toBe(true); + }); + + it('inserts entries after Unreleased', () => { + const out = insertChangelogEntry('# Changelog\n\n## [Unreleased]\n', '## [1.0.0] - 2026-07-02\n'); + expect(out).toMatch(/## \[Unreleased\]\n\n## \[1\.0\.0\]/); + }); + + it('generates empty release-note fallback', () => { + expect(generateReleaseNotes({ commits: [], version: '1.0.0', date: new Date() })).toContain('No user-facing changes'); + }); +}); + diff --git a/test/session-recovery.test.ts b/test/session-recovery.test.ts new file mode 100644 index 00000000..61e4a4db --- /dev/null +++ b/test/session-recovery.test.ts @@ -0,0 +1,99 @@ +import { describe, expect, it, vi } from 'vitest'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { fileURLToPath } from 'url'; + +describe('session recovery', () => { + const fixturePlanPath = () => join(fileURLToPath(new URL('.', import.meta.url)), 'fixtures/session-recovery/active-plan.json'); + + it('creates ThunderSession instances for restored chat thread ids', async () => { + const { ThunderSession } = await import('../src/core/session/ThunderSession'); + + const session = new ThunderSession('/repo', 'agent', { + id: 'ollama-thread-1', + title: 'Ollama plan', + createdAt: 100, + updatedAt: 200, + }); + + expect(session.id).toBe('ollama-thread-1'); + expect(session.workspace).toBe('/repo'); + expect(session.mode).toBe('agent'); + expect(session.title).toBe('Ollama plan'); + expect(session.createdAt).toBe(100); + expect(session.updatedAt).toBe(200); + }); + + it('rehydrates the active plan when a history thread is restored', async () => { + const { ThunderController } = await import('../src/core/app/ThunderController'); + const plan = JSON.parse(readFileSync(fixturePlanPath(), 'utf8')); + const ensured: string[] = []; + const notified: unknown[] = []; + const controller = Object.create(ThunderController.prototype) as any; + + controller.session = undefined; + controller.currentPlan = null; + controller.agentActivity = [{ id: 'old', kind: 'info', message: 'old activity', timestamp: Date.now() }]; + controller.lastSubagentSnapshot = new Map([['old', 'running']]); + controller.resolveWorkspacePath = () => ''; + controller.notifyUi = (partial: unknown) => notified.push(partial); + controller.sessionService = { + ensureSession: vi.fn((session: { id: string }) => ensured.push(session.id)), + }; + controller.planPersistence = { + getActive: vi.fn((sessionId: string) => sessionId === 'ollama-thread-1' + ? { id: 'plan-1', plan, status: 'running' } + : null), + }; + + const restored = controller.restoreChatSession('ollama-thread-1', { mode: 'agent' }); + + expect(restored).toEqual(plan); + expect(controller.getSession()?.id).toBe('ollama-thread-1'); + expect(controller.getSession()?.mode).toBe('agent'); + expect(ensured).toEqual(['ollama-thread-1']); + expect(controller.currentPlan).toEqual(plan); + expect(controller.agentActivity).toEqual([]); + expect(controller.lastSubagentSnapshot?.size).toBe(0); + expect(notified).toContainEqual(expect.objectContaining({ + currentSessionId: 'ollama-thread-1', + plan, + agentActivity: [], + agentLiveStatus: null, + })); + }); + + it('keeps active plans addressable by the original restored session id', async () => { + const { PlanPersistence } = await import('../src/core/plans/PlanPersistence'); + const plan = JSON.parse(readFileSync(fixturePlanPath(), 'utf8')); + const rows = new Map(); + const db = { + tryRaw: () => ({ + prepare: (sql: string) => ({ + get: (sessionId: string) => { + if (!sql.includes('SELECT id, plan_json, status FROM task_plans')) return undefined; + return [...rows.values()] + .filter((row) => row.session_id === sessionId && ['active', 'running'].includes(row.status)) + .sort((a, b) => b.updated_at - a.updated_at)[0]; + }, + run: (...args: unknown[]) => { + if (sql.includes('INSERT INTO task_plans')) { + const [id, sessionId, , status, planJson, , updatedAt] = args as [string, string, string, string, string, number, number]; + rows.set(id, { id, session_id: sessionId, plan_json: planJson, status, updated_at: updatedAt }); + } + }, + }), + }), + }; + const persistence = new PlanPersistence(db as never); + + persistence.save('ollama-thread-1', plan, 'running'); + + expect(persistence.getActive('new-session-after-reload')).toBeNull(); + expect(persistence.getActive('ollama-thread-1')).toEqual({ + id: expect.any(String), + plan, + status: 'running', + }); + }); +}); diff --git a/test/setup.ts b/test/setup.ts index fdaa066a..f56bb108 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -5,5 +5,35 @@ vi.mock('vscode', () => ({ getConfiguration: () => ({ get: (_key: string, defaultValue: unknown) => defaultValue, }), + workspaceFolders: undefined, + asRelativePath: (uri: { fsPath?: string }) => uri.fsPath?.split('/').pop() ?? '', + createFileSystemWatcher: () => ({ + onDidChange: () => ({ dispose: () => undefined }), + onDidCreate: () => ({ dispose: () => undefined }), + onDidDelete: () => ({ dispose: () => undefined }), + dispose: () => undefined, + }), + }, + window: { + activeTextEditor: undefined, + tabGroups: { all: [] }, + showInformationMessage: async () => undefined, + showWarningMessage: async () => undefined, + showErrorMessage: async () => undefined, + showOpenDialog: async () => undefined, + }, + Uri: { + file: (path: string) => ({ scheme: 'file', fsPath: path, path }), + }, + RelativePattern: class { + constructor(public base: unknown, public pattern: string) {} + }, + languages: { + getDiagnostics: () => [], + DiagnosticSeverity: { Error: 0, Warning: 1, Information: 2, Hint: 3 }, + }, + DiagnosticSeverity: { Error: 0, Warning: 1, Information: 2, Hint: 3 }, + commands: { + executeCommand: async () => undefined, }, })); diff --git a/test/top10-features.test.ts b/test/top10-features.test.ts new file mode 100644 index 00000000..91272148 --- /dev/null +++ b/test/top10-features.test.ts @@ -0,0 +1,151 @@ +import { describe, expect, it, vi } from 'vitest'; +import { validateProviderSettings } from '../src/core/config/ui/mappers'; +import { detectEditorRebuildCommand } from '../src/vscode/nativeModuleHealth'; +import { parseReviewDiffFiles } from '../src/core/scm/ReviewDiffCollector'; +import { OpenAiCompatibleProvider } from '../src/core/llm/OpenAiCompatibleProvider'; +import { HeadlessAgentRunner } from '../src/core/headless'; +import { createProvider } from '../src/core/llm/createProvider'; +import { detectModelCapabilities } from '../src/core/llm/modelCapabilities'; +import { WebhookEmitter } from '../src/core/telemetry/WebhookEmitter'; + +describe('provider setup validation', () => { + it('requires provider-specific fields', () => { + expect(validateProviderSettings({ + providerType: 'azure-openai', + baseUrl: 'not-a-url', + model: '', + apiVersion: '', + region: 'us-east-1', + contextWindow: 512, + }).errors).toEqual(expect.arrayContaining([ + 'API base URL must be a valid URL.', + 'Azure deployment name is required.', + 'Azure API version is required.', + 'Context window must be at least 1024 tokens.', + ])); + }); + + it('accepts a complete local OpenAI-compatible preset', () => { + expect(validateProviderSettings({ + providerType: 'openai-compatible', + baseUrl: 'http://localhost:11434/v1', + model: 'qwen3-coder:30b', + contextWindow: 8192, + }).ok).toBe(true); + }); +}); + +describe('native module health helpers', () => { + it('uses a Cursor-specific rebuild command when Cursor env is present', () => { + expect(detectEditorRebuildCommand({ CURSOR_TRACE_ID: '1' } as NodeJS.ProcessEnv)).toBe( + 'THUNDER_EDITOR=cursor npm run rebuild:native' + ); + }); +}); + +describe('review diff parsing', () => { + it('groups file diffs and counts changed lines', () => { + const files = parseReviewDiffFiles([ + 'diff --git a/src/a.ts b/src/a.ts', + 'index 111..222 100644', + '--- a/src/a.ts', + '+++ b/src/a.ts', + '@@ -1 +1,2 @@', + '-old', + '+new', + '+next', + '', + ].join('\n'), ['M\tsrc/a.ts']); + + expect(files).toHaveLength(1); + expect(files[0]).toMatchObject({ path: 'src/a.ts', status: 'M', additions: 2, deletions: 1 }); + }); +}); + +describe('multimodal provider payloads', () => { + it('formats image attachments for OpenAI-compatible providers', async () => { + const provider = new OpenAiCompatibleProvider({ + baseUrl: 'https://example.test/v1', + model: 'vision-model', + }); + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + json: async () => ({ choices: [{ message: { content: 'ok' } }] }), + }); + vi.stubGlobal('fetch', fetchMock); + + try { + for await (const _delta of provider.complete({ + stream: false, + messages: [{ + role: 'user', + content: 'what is this?', + attachments: [{ kind: 'image', mimeType: 'image/png', data: 'abc123', name: 'screen.png' }], + }], + })) { + // consume + } + } finally { + vi.unstubAllGlobals(); + } + + const body = JSON.parse(fetchMock.mock.calls[0][1].body); + expect(body.messages[0].content[0]).toEqual({ type: 'text', text: 'what is this?' }); + expect(body.messages[0].content[1].image_url.url).toBe('data:image/png;base64,abc123'); + }); +}); + +describe('headless runner', () => { + it('returns deterministic echo answers and JSON plans without VS Code APIs', async () => { + const runner = new HeadlessAgentRunner({ cwd: process.cwd(), providerType: 'echo' }); + await expect(runner.ask('hello')).resolves.toContain('Echo: hello'); + + const plan = runner.plan('ship a feature'); + expect(plan.steps.map((step) => step.id)).toEqual(['discover', 'design', 'execute', 'verify']); + }); +}); + +describe('model capability detection', () => { + it('detects vision and reasoning support while respecting overrides', () => { + const detected = detectModelCapabilities('openai', 'gpt-4.1', 128_000); + expect(detected.supportsVision).toBe(true); + expect(detected.supportsReasoning).toBe(false); + + const reasoner = createProvider({ + type: 'openai-compatible', + baseUrl: 'http://localhost:11434/v1', + model: 'qwen3-coder:30b', + supportsVision: false, + supportsReasoning: true, + }); + expect(reasoner.capabilities.supportsReasoning).toBe(true); + expect(reasoner.capabilities.supportsVision).toBe(false); + }); +}); + +describe('telemetry webhook emitter', () => { + it('posts sanitized events with an HMAC signature header', async () => { + const fetchMock = vi.fn().mockResolvedValue({ ok: true }); + vi.stubGlobal('fetch', fetchMock); + const emitter = new WebhookEmitter(); + emitter.configure({ url: 'https://siem.example.test/events', secret: 'secret' }); + + try { + emitter.emit({ + ts: 1, + time: '2026-07-02 00:00:00.000', + sessionId: 's1', + type: 'tool_end', + message: 'Tool finished', + data: { tool: 'read_file' }, + }); + await emitter.flush(); + } finally { + vi.unstubAllGlobals(); + } + + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(fetchMock.mock.calls[0][0]).toBe('https://siem.example.test/events'); + expect(fetchMock.mock.calls[0][1].headers['X-Mitii-Signature']).toMatch(/^sha256=/); + }); +}); diff --git a/test/unit.test.ts b/test/unit.test.ts index 2396ee77..2e28699e 100644 --- a/test/unit.test.ts +++ b/test/unit.test.ts @@ -551,7 +551,7 @@ describe('Builtin MCP servers', () => { const { buildBuiltinMcpServers } = await import('../src/core/mcp/builtinServers'); const servers = buildBuiltinMcpServers('/tmp/my-project'); - expect(Object.keys(servers).sort()).toEqual(['filesystem', 'memory', 'sequential-thinking']); + expect(Object.keys(servers).sort()).toEqual(['filesystem', 'memory', 'puppeteer', 'sequential-thinking']); expect(servers.filesystem.command).toBe(process.platform === 'win32' ? 'cmd' : 'npx'); expect(servers.filesystem.args).toContain('@modelcontextprotocol/server-filesystem'); expect(servers.filesystem.args.at(-1)).toBe(resolve('/tmp/my-project')); @@ -562,7 +562,7 @@ describe('Builtin MCP servers', () => { it('omits filesystem when workspace is empty', async () => { const { buildBuiltinMcpServers } = await import('../src/core/mcp/builtinServers'); const servers = buildBuiltinMcpServers(''); - expect(Object.keys(servers).sort()).toEqual(['memory', 'sequential-thinking']); + expect(Object.keys(servers).sort()).toEqual(['memory', 'puppeteer', 'sequential-thinking']); }); it('lets user settings override built-in servers', async () => { @@ -605,6 +605,7 @@ describe('Builtin MCP servers', () => { filesystem: true, memory: false, sequentialThinking: true, + puppeteer: false, }); expect(servers.memory.disabled).toBe(true); expect(servers.filesystem.disabled).toBe(false); @@ -615,46 +616,30 @@ describe('Builtin MCP servers', () => { filesystem: true, memory: true, sequentialThinking: true, + puppeteer: false, }); }); }); describe('ProjectRulesService', () => { - it('loads common root-level agent rule files', () => { + it('loads MITII.md from workspace root', () => { const tempDir = mkdtempSync(join(tmpdir(), 'thunder-rules-test-')); try { - writeFileSync(join(tempDir, 'AGENTS.md'), 'agent instructions'); - writeFileSync(join(tempDir, 'CLAUDE.md'), 'claude instructions'); - writeFileSync(join(tempDir, '.cursorrules'), 'cursor instructions'); - writeFileSync(join(tempDir, '.clinerules'), 'cline instructions'); + writeFileSync(join(tempDir, 'MITII.md'), 'mitii instructions'); + writeFileSync(join(tempDir, 'AGENTS.md'), 'ignored agent instructions'); const rules = new ProjectRulesService(tempDir).load(); - expect(rules.map((rule) => rule.relPath)).toEqual([ - 'AGENTS.md', - 'CLAUDE.md', - '.cursorrules', - '.clinerules', - ]); + expect(rules.map((rule) => rule.relPath)).toEqual(['MITII.md']); } finally { rmSync(tempDir, { recursive: true, force: true }); } }); - it('loads markdown files from Mitii rule, agent, check, and prompt folders', () => { + it('returns empty when MITII.md is missing', () => { const tempDir = mkdtempSync(join(tmpdir(), 'thunder-rules-test-')); try { - for (const relDir of ['.mitii/rules', '.mitii/agents', '.mitii/checks', '.mitii/prompts']) { - mkdirSync(join(tempDir, relDir), { recursive: true }); - writeFileSync(join(tempDir, relDir, 'methodology.md'), `${relDir} instructions`); - } - - const rules = new ProjectRulesService(tempDir).load(); - expect(rules.map((rule) => rule.relPath)).toEqual([ - '.mitii/rules/methodology.md', - '.mitii/agents/methodology.md', - '.mitii/checks/methodology.md', - '.mitii/prompts/methodology.md', - ]); + writeFileSync(join(tempDir, 'AGENTS.md'), 'ignored'); + expect(new ProjectRulesService(tempDir).load()).toEqual([]); } finally { rmSync(tempDir, { recursive: true, force: true }); } @@ -767,6 +752,23 @@ describe('ThunderMode normalization', () => { }); }); +describe('ChatOrchestrator response handling', () => { + it('turns empty model output into an explicit assistant message', async () => { + const { EMPTY_ASSISTANT_RESPONSE_MESSAGE, normalizeAssistantResponse } = + await import('../src/core/orchestration/ChatOrchestrator'); + + expect(normalizeAssistantResponse('')).toEqual({ + content: EMPTY_ASSISTANT_RESPONSE_MESSAGE, + wasEmpty: true, + }); + expect(normalizeAssistantResponse(' ')).toEqual({ + content: EMPTY_ASSISTANT_RESPONSE_MESSAGE, + wasEmpty: true, + }); + expect(normalizeAssistantResponse('ok')).toEqual({ content: 'ok', wasEmpty: false }); + }); +}); + describe('Plan parser', () => { it('flattens rich phase plans into executable steps', async () => { const { parsePlanFromText } = await import('../src/core/plans/PlanActEngine'); @@ -995,6 +997,27 @@ describe('fuzzyFileMatch', () => { }); describe('ApprovalQueue', () => { + it('maps clarifying questions with options for persisted UI state', async () => { + const { ApprovalQueue } = await import('../src/core/safety/ApprovalQueue'); + const { toApprovalView } = await import('../src/core/app/ThunderController'); + const queue = new ApprovalQueue(); + const req = queue.createRequest('s1', 'ask_question', { + question: 'Which project should I inspect?', + options: ['agent', 'docs'], + }, { + decision: 'require_approval', + reason: 'Clarifying question requires user response', + }); + + expect(toApprovalView(req)).toMatchObject({ + id: req.id, + toolName: 'ask_question', + kind: 'question', + question: 'Which project should I inspect?', + options: ['agent', 'docs'], + }); + }); + it('stores full input for large write_file payloads', async () => { const { ApprovalQueue } = await import('../src/core/safety/ApprovalQueue'); const queue = new ApprovalQueue(); @@ -2244,6 +2267,10 @@ describe('Ask v2 routing, scope, and impact', () => { intent: 'general_knowledge', groundingRequired: false, }); + expect(routeAskIntent('Need commit message for the changes in stage @mitii-ai-agent')).toMatchObject({ + intent: 'explain_code', + groundingRequired: true, + }); }); it('discovers monorepo projects and persists a catalog file', async () => { diff --git a/test/windows-paths.test.ts b/test/windows-paths.test.ts new file mode 100644 index 00000000..333acf5c --- /dev/null +++ b/test/windows-paths.test.ts @@ -0,0 +1,39 @@ +import { describe, expect, it } from 'vitest'; +import { normalizeRelPath, resolveWorkspaceRelPath } from '../src/core/util/paths'; +import { npxMcpServer } from '../src/core/mcp/npxCommand'; + +describe('Windows path hardening', () => { + it('resolves drive-letter absolute paths to workspace-relative POSIX paths', () => { + expect(resolveWorkspaceRelPath('C:\\Users\\dev\\repo', 'C:\\Users\\dev\\repo\\src\\foo.ts')).toBe('src/foo.ts'); + }); + + it('normalizes mixed separators', () => { + expect(normalizeRelPath('src\\bar\\baz.ts')).toBe('src/bar/baz.ts'); + }); + + it('handles UNC workspace paths', () => { + expect(resolveWorkspaceRelPath('\\\\server\\share\\repo', '\\\\server\\share\\repo\\src\\foo.ts')).toBe('src/foo.ts'); + }); + + it('rejects Windows absolute paths outside the workspace', () => { + expect(resolveWorkspaceRelPath('C:\\Users\\dev\\repo', 'D:\\other\\file.ts')).toBeNull(); + }); + + it('rejects dot-dot relative escapes', () => { + expect(resolveWorkspaceRelPath('C:\\Users\\dev\\repo', '..\\secret.ts')).toBeNull(); + }); + + it('uses cmd /c npx on Windows when process platform is mocked', () => { + const original = Object.getOwnPropertyDescriptor(process, 'platform'); + Object.defineProperty(process, 'platform', { value: 'win32' }); + try { + expect(npxMcpServer('@modelcontextprotocol/server-filesystem', '.')).toEqual({ + command: 'cmd', + args: ['/c', 'npx', '-y', '@modelcontextprotocol/server-filesystem', '.'], + }); + } finally { + if (original) Object.defineProperty(process, 'platform', original); + } + }); +}); + diff --git a/tools/benchmark/README.md b/tools/benchmark/README.md new file mode 100644 index 00000000..a939ab64 --- /dev/null +++ b/tools/benchmark/README.md @@ -0,0 +1,301 @@ +# Mitii Benchmark And Eval + +Private pnpm workspace package (`@mitii/benchmark`) for Mitii's enterprise benchmark, fixtures, and large-scale eval harness. It is excluded from the VSIX by `.vscodeignore`; the extension still ships from the repo root. + +## Layout + +```text +tools/benchmark/ + package.json + run.mjs # Enterprise benchmark runner + verify.mjs # Shared verification rules + fixtures/ # Pinned sample repos (optional node_modules per fixture) + tasks/ + enterprise/ # Smoke, ask, plan, agent, regression tasks + eval/ + generated/ # Standard/full eval shards (gitignored, generated locally) + generated-smoke/ # CI smoke shards (gitignored) + scripts/ + generate-tasks.mjs + run-eval.mjs + aggregate-results.mjs + preflight.mjs + ollama-matrix.sh + results/ # Aggregated eval reports (gitignored) + inspect-ai/ # Optional Python Inspect AI adapter +``` + +## Quick Start + +From the **repo root** (`mitii-ai-agent/`): + +```bash +pnpm install +pnpm run compile:cli +pnpm run benchmark:smoke # 3 enterprise tasks, echo/stub +pnpm run eval:smoke # 3 eval tasks, echo/stub (CI-safe) +``` + +Root scripts delegate to `@mitii/benchmark` via `pnpm --filter @mitii/benchmark`. You can also run commands from this directory: + +```bash +cd tools/benchmark +pnpm run benchmark:smoke +pnpm run eval:smoke +``` + +Set `MITII_PACKAGE_ROOT` to the repo root if you invoke scripts from another cwd. + +--- + +## Enterprise Benchmark + +Runs the fixed ~26-task suite across Ask, Plan, and Agent modes on pinned fixtures. + +```bash +# From repo root +pnpm run benchmark:smoke +pnpm run benchmark:all +pnpm run benchmark:integration + +# Direct runner +node tools/benchmark/run.mjs --tier all --runtime real \ + --provider openai-compatible --model gpt-4o-mini +``` + +### Task tiers (`tasks/enterprise/`) + +| Tier | File | Focus | +|------|------|-------| +| `smoke` | `smoke.json` | CLI wiring | +| `integration` | `integration.json` | Cross-mode integration | +| `ask` | `ask.json` | Retrieval and Q&A on fixtures | +| `plan` | `plan.json` | Structured planning | +| `agent` | `agent.json` | Tool loop and guidance | +| `regression` | `regression.json` | Fixed bugs from CHANGELOG | +| `all` | `index.json` | Everything | + +Reports default to `.mitii/benchmark/report.json` and `.mitii/benchmark/report.md`. + +--- + +## Large Eval (500–1000 tasks) + +Measures agent potential at scale **outside VS Code**. Uses the same `verify.mjs` rules and `dist/cli.js` headless runner as the enterprise benchmark. + +### 1. Preflight (required for real runtime) + +Real eval uses **system Node**, not Electron. `better-sqlite3` must be rebuilt for Node (not VS Code's Electron): + +```bash +pnpm run rebuild:node +pnpm run compile:cli +pnpm run eval:preflight +``` + +`eval:preflight` opens an in-memory SQLite database to verify the native module matches your Node ABI. If you recently ran `pnpm run rebuild:native` for F5 debugging, run `pnpm run rebuild:node` again before eval. + +**Do not copy shell comments** from docs into your terminal. Run only the command itself: + +```bash +pnpm run eval:preflight +``` + +not `pnpm run eval:preflight # rebuild better-sqlite3`. + +### 2. Generate tasks + +```bash +pnpm run eval:generate # standard profile → 500 tasks +pnpm run eval:generate:full # full profile → 1000 tasks + +# Custom count or output directory +node tools/benchmark/scripts/generate-tasks.mjs --count 750 \ + --output tools/benchmark/tasks/eval/generated +``` + +| Profile | Tasks | Use | +|---------|------:|-----| +| `smoke` | 3 | CI and wiring (`generated-smoke/`, does not overwrite `generated/`) | +| `standard` | 500 | Regular potential check | +| `full` | 1000 | Full assessment | +| `coding` | 300 | No fixtures | +| `fixtures` | 400 | Repo-heavy | + +Generated shards: `tools/benchmark/tasks/eval/generated/`. + +`eval:standard` auto-regenerates standard tasks if the index is missing or stale (< 100 tasks). + +### 3. Run eval + +```bash +# Echo/stub (free, no model) +pnpm run eval:smoke + +# Real model — Ollama example +pnpm run eval:standard -- \ + --provider openai-compatible \ + --base-url http://localhost:11434/v1 \ + --model qwen3-coder:30b \ + --limit 50 + +# Real model — OpenAI-compatible API +pnpm run eval:standard -- \ + --provider openai-compatible \ + --base-url https://api.openai.com/v1 \ + --model gpt-4o-mini \ + --limit 100 + +# Direct runner with all options +node tools/benchmark/scripts/run-eval.mjs \ + --tier eval \ + --runtime real \ + --provider openai-compatible \ + --base-url http://localhost:11434/v1 \ + --model qwen3-coder:30b \ + --concurrency 4 \ + --limit 50 +``` + +### 4. Reports + +| Output | Default path | +|--------|----------------| +| Single run JSON | `.mitii/eval/report.json` | +| Single run Markdown | `.mitii/eval/report.md` | +| Aggregated shards | `tools/benchmark/results/aggregated-report.json` | + +```bash +pnpm run eval:aggregate -- --input tools/benchmark/results +``` + +### 5. Parallel sharded runs + +```bash +mkdir -p tools/benchmark/results + +for i in 1 2 3 4; do + node tools/benchmark/scripts/run-eval.mjs \ + --shard $i/4 \ + --concurrency 4 \ + --runtime real \ + --provider openai-compatible \ + --base-url http://localhost:11434/v1 \ + --model qwen3-coder:30b \ + --output tools/benchmark/results/shard-$i.json & +done +wait + +pnpm run eval:aggregate -- --input tools/benchmark/results +``` + +### 6. Ollama model matrix (free, local) + +```bash +ollama serve # terminal 1 + +pnpm run eval:matrix # terminal 2 — runs multiple models × shards +``` + +Override with env vars: `PROFILE`, `SHARDS`, `CONCURRENCY`, `OLLAMA_BASE_URL`, `RESULTS_DIR`. + +### Eval CLI flags + +| Flag | Description | +|------|-------------| +| `--tasks ` | Task index JSON (default: `tasks/eval/generated/index.json`) | +| `--tier eval` | Filter tier (default: `eval`) | +| `--runtime real\|stub` | Full agent vs fast wiring | +| `--provider echo\|openai-compatible\|...` | LLM provider | +| `--model`, `--base-url` | Model endpoint | +| `--concurrency N` | Parallel workers (default: 4) | +| `--limit N` | Cap tasks (useful for dry runs) | +| `--shard i/N` | Run shard *i* of *N* | +| `--timeout-ms N` | Per-task timeout (default: 120000) | +| `--ensure-ready` | Auto-generate standard tasks if missing | +| `--no-ensure-ready` | Skip auto-generation | +| `--dry-run` | Print task count and exit | +| `--enable-puppeteer` | Enable Puppeteer MCP for browser tasks | + +--- + +## Fixtures + +| Fixture | Stack | +|---------|-------| +| `node-express` | Express API and routes | +| `react-vite` | React and TypeScript UI | +| `nest-api` | NestJS modules/controllers | +| `next-app` | Next.js App Router | + +Browser / Puppeteer tasks: + +```bash +mitii agent "Verify the home page title" \ + --runtime real \ + --enable-puppeteer \ + --approval auto \ + --cwd tools/benchmark/fixtures/react-vite +``` + +Fixture `node_modules` are gitignored. Install per fixture when running real browser or build tasks: + +```bash +cd tools/benchmark/fixtures/react-vite && pnpm install +``` + +### Keeping git clean after eval + +Real eval runs **mutate fixture source files** (agents edit routes, components, READMEs, etc.). Session logs and build output are already gitignored. To restore the pinned fixture baseline after a run: + +```bash +pnpm run eval:reset-fixtures +``` + +This reverts tracked changes under `tools/benchmark/fixtures/` and removes agent-created untracked files (e.g. `docs/`, scaffolded entry files). It also restores `generated-test` manifests if vitest touched them. + +**Already gitignored** (safe to leave on disk): `.mitii/`, `node_modules/`, `dist/`, `.next/`, `tools/benchmark/tasks/eval/generated/`, `tools/benchmark/results/`. + +--- + +## Inspect AI (optional) + +```bash +pip install -r tools/benchmark/inspect-ai/requirements.txt +export MITII_PACKAGE_ROOT=$(pwd) # repo root +inspect eval tools/benchmark/inspect-ai/eval_tasks.py::mitii_eval_smoke +``` + +For production eval with a live model, use `mitii_eval_standard` and set provider env vars in the solver. + +--- + +## Verification Rules + +| Rule | Meaning | +|------|---------| +| `exit_0` | CLI exit code 0 | +| `stdout_contains:` | Output includes text | +| `stdout_not_empty` | Non-empty stdout | +| `json_path:` | JSON stdout has key | +| `jsonl_event:` | Agent stream event | +| `file_exists:` | File in fixture | +| `file_contains::` | File content match | +| `skills_installed:` | `.mitii/skills` count | +| `command_exit_0:` | Shell command passes | +| `session_log_has:` | JSONL session event | + +--- + +## What this measures + +| Category | Tests Mitii's… | +|----------|----------------| +| `fixture-ask` | Code retrieval and Q&A on JS/TS stacks | +| `fixture-plan` | Structured planning on real repos | +| `fixture-agent` | Tool loop, skills, safe inspection | +| `coding-js` | Algorithm and JS knowledge | +| `reasoning` | Engineering judgment | +| `tool-calling` | Tool schema / MCP awareness | +| `gaia` | Multi-step and factual reasoning | +| `base-*` | Original enterprise benchmark tasks | diff --git a/tools/benchmark/config/profiles.json b/tools/benchmark/config/profiles.json new file mode 100644 index 00000000..d6e94cc8 --- /dev/null +++ b/tools/benchmark/config/profiles.json @@ -0,0 +1,34 @@ +{ + "profiles": { + "smoke": { + "description": "Fast wiring check — 3 base smoke tasks (echo/stub compatible)", + "targetCount": 3, + "includeBaseBenchmark": true, + "baseTier": "smoke" + }, + "standard": { + "description": "Balanced eval — 500 tasks across all categories", + "targetCount": 500, + "includeBaseBenchmark": true, + "baseTier": "all" + }, + "full": { + "description": "Full potential assessment — 1000 tasks", + "targetCount": 1000, + "includeBaseBenchmark": true, + "baseTier": "all" + }, + "coding": { + "description": "JS coding + reasoning only (no fixtures)", + "targetCount": 300, + "includeBaseBenchmark": false, + "categories": ["coding-js", "reasoning", "tool-calling"] + }, + "fixtures": { + "description": "Fixture-heavy agent eval", + "targetCount": 400, + "includeBaseBenchmark": true, + "categories": ["fixture-ask", "fixture-plan", "fixture-agent", "retrieval"] + } + } +} diff --git a/tools/benchmark/datasets/fixture-catalog.json b/tools/benchmark/datasets/fixture-catalog.json new file mode 100644 index 00000000..0b9c8a1c --- /dev/null +++ b/tools/benchmark/datasets/fixture-catalog.json @@ -0,0 +1,28 @@ +{ + "fixtures": { + "node-express": { + "category": "node", + "stack": "Express", + "entryFiles": ["src/index.js", "src/routes/users.js", "package.json"], + "symbols": ["express", "router", "users", "GET /users"] + }, + "react-vite": { + "category": "react", + "stack": "React + Vite", + "entryFiles": ["src/App.tsx", "src/components/Button.tsx", "package.json"], + "symbols": ["Button", "variant", "React", "props"] + }, + "nest-api": { + "category": "nestjs", + "stack": "NestJS", + "entryFiles": ["src/main.ts", "src/app.module.ts", "src/app.controller.ts", "src/app.service.ts"], + "symbols": ["AppModule", "AppController", "Injectable", "NestFactory"] + }, + "next-app": { + "category": "nextjs", + "stack": "Next.js App Router", + "entryFiles": ["app/page.tsx", "app/layout.tsx", "package.json"], + "symbols": ["layout", "page", "metadata", "Next.js"] + } + } +} diff --git a/tools/benchmark/fixtures/nest-api/package.json b/tools/benchmark/fixtures/nest-api/package.json new file mode 100644 index 00000000..278f3325 --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/package.json @@ -0,0 +1,22 @@ +{ + "name": "benchmark-nest-api", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "node dist/main.js", + "build": "tsc -p tsconfig.json", + "test": "node -e \"console.log('jest placeholder')\"", + "lint": "node -e \"console.log('lint ok')\"" + }, + "dependencies": { + "@nestjs/common": "^10.4.22", + "@nestjs/core": "^10.4.22", + "class-transformer": "^0.5.1", + "class-validator": "^0.15.1", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "typescript": "^5.5.2" + } +} \ No newline at end of file diff --git a/tools/benchmark/fixtures/nest-api/src/app.controller.spec.ts b/tools/benchmark/fixtures/nest-api/src/app.controller.spec.ts new file mode 100644 index 00000000..741be414 --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/src/app.controller.spec.ts @@ -0,0 +1,38 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; +import { CreateUserDto } from './create-user.dto'; + +describe('AppController', () => { + let appController: AppController; + let appService: AppService; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + controllers: [AppController], + providers: [AppService], + }).compile(); + + appController = app.get(AppController); + appService = app.get(AppService); + }); + + describe('root', () => { + it('should return "Hello Nest Benchmark!"', () => { + expect(appController.getHello()).toBe('Hello Nest Benchmark!'); + }); + }); + + describe('createUser', () => { + it('should create a user with valid data', () => { + const createUserDto: CreateUserDto = { + name: 'John Doe', + email: 'john@example.com' + }; + + expect(appController.createUser(createUserDto)).toBe( + 'Creating user with name: John Doe and email: john@example.com' + ); + }); + }); +}); \ No newline at end of file diff --git a/tools/benchmark/fixtures/nest-api/src/app.controller.ts b/tools/benchmark/fixtures/nest-api/src/app.controller.ts new file mode 100644 index 00000000..1ac06b63 --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/src/app.controller.ts @@ -0,0 +1,18 @@ +import { Controller, Get, Post, Body } from '@nestjs/common'; +import { AppService } from './app.service'; +import { CreateUserDto } from './create-user.dto'; + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} + + @Get() + getHello(): string { + return this.appService.getHello(); + } + + @Post('users') + createUser(@Body() createUserDto: CreateUserDto) { + return this.appService.createUser(createUserDto); + } +} \ No newline at end of file diff --git a/tools/benchmark/fixtures/nest-api/src/app.module.ts b/tools/benchmark/fixtures/nest-api/src/app.module.ts new file mode 100644 index 00000000..86628031 --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/src/app.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +@Module({ + imports: [], + controllers: [AppController], + providers: [AppService], +}) +export class AppModule {} diff --git a/tools/benchmark/fixtures/nest-api/src/app.service.spec.ts b/tools/benchmark/fixtures/nest-api/src/app.service.spec.ts new file mode 100644 index 00000000..e133765a --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/src/app.service.spec.ts @@ -0,0 +1,31 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { AppService } from './app.service'; + +describe('AppService', () => { + let appService: AppService; + + beforeEach(async () => { + const app: TestingModule = await Test.createTestingModule({ + providers: [AppService], + }).compile(); + + appService = app.get(AppService); + }); + + describe('getHello', () => { + it('should return "Hello Nest Benchmark!"', () => { + expect(appService.getHello()).toBe('Hello Nest Benchmark!'); + }); + }); + + describe('createUser', () => { + it('should create a user with valid data', () => { + const result = appService.createUser({ + name: 'John Doe', + email: 'john@example.com' + }); + + expect(result).toContain('Creating user with name: John Doe and email: john@example.com'); + }); + }); +}); \ No newline at end of file diff --git a/tools/benchmark/fixtures/nest-api/src/app.service.ts b/tools/benchmark/fixtures/nest-api/src/app.service.ts new file mode 100644 index 00000000..c0499866 --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/src/app.service.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@nestjs/common'; +import { CreateUserDto } from './create-user.dto'; + +@Injectable() +export class AppService { + getHello(): string { + return 'Hello Nest Benchmark!'; + } + + createUser(createUserDto: CreateUserDto) { + return `Creating user with name: ${createUserDto.name} and email: ${createUserDto.email}`; + } +} diff --git a/tools/benchmark/fixtures/nest-api/src/create-user.dto.ts b/tools/benchmark/fixtures/nest-api/src/create-user.dto.ts new file mode 100644 index 00000000..6f9367e6 --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/src/create-user.dto.ts @@ -0,0 +1,11 @@ +import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; + +export class CreateUserDto { + @IsString() + @IsNotEmpty() + name!: string; + + @IsEmail() + @IsNotEmpty() + email!: string; +} \ No newline at end of file diff --git a/tools/benchmark/fixtures/nest-api/src/main.ts b/tools/benchmark/fixtures/nest-api/src/main.ts new file mode 100644 index 00000000..3d44140d --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/src/main.ts @@ -0,0 +1,11 @@ +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; +import { ValidationPipe } from '@nestjs/common'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + app.useGlobalPipes(new ValidationPipe()); + await app.listen(3001); +} + +void bootstrap(); \ No newline at end of file diff --git a/tools/benchmark/fixtures/nest-api/tsconfig.json b/tools/benchmark/fixtures/nest-api/tsconfig.json new file mode 100644 index 00000000..bced18cd --- /dev/null +++ b/tools/benchmark/fixtures/nest-api/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "outDir": "dist", + "rootDir": "src", + "strict": true, + "esModuleInterop": true + }, + "include": ["src/**/*"] +} diff --git a/tools/benchmark/fixtures/next-app/README.md b/tools/benchmark/fixtures/next-app/README.md new file mode 100644 index 00000000..15b027da --- /dev/null +++ b/tools/benchmark/fixtures/next-app/README.md @@ -0,0 +1,58 @@ +# Next.js Benchmark App + +This is a benchmark application built with Next.js App Router. + +## Loading Component Verification + +The application includes a loading indicator component that displays during page transitions and data fetching. + +### How to Verify Loading Component in Development + +1. **Start the development server**: + ```bash + npm run dev + ``` + +2. **Navigate to the home route**: + - Open your browser and go to `http://localhost:3000` + - The loading spinner should appear during initial page load + +3. **Test page transitions**: + - Click on any links within the application + - Observe the loading spinner during route changes + - The component will be automatically used by Next.js during route changes and data fetching + +4. **Verify the visual appearance**: + - The loading indicator should be centered both vertically and horizontally + - A spinning animation should be visible with "Loading..." text + - The component uses Tailwind CSS classes for styling: + - `animate-spin` for the spinning animation + - `rounded-full` for circular shape + - `h-12` and `w-12` for size + - `border-t-2` and `border-b-2` for border styling + - `border-blue-500` for color + +### Implementation Details + +The loading component is located at `app/loading.tsx` and follows Next.js App Router conventions. It provides a centered loading indicator with visual feedback during page transitions and data fetching operations. + +### Testing Requirements + +To run the lint verification: +```bash +npm run lint +``` + +To start the development server: +```bash +npm run dev +``` + +### Verification Steps + +1. Run `npm install` to install dependencies +2. Run `npm run dev` to start the development server +3. Visit `http://localhost:3000` in your browser +4. You should see the loading spinner with "Loading..." text centered on the page +5. The spinner should be animating smoothly +6. Run `npm run lint` to verify code quality \ No newline at end of file diff --git a/tools/benchmark/fixtures/next-app/app/layout.tsx b/tools/benchmark/fixtures/next-app/app/layout.tsx new file mode 100644 index 00000000..77517100 --- /dev/null +++ b/tools/benchmark/fixtures/next-app/app/layout.tsx @@ -0,0 +1,12 @@ +export const metadata = { + title: 'Benchmark Next App', + description: 'Mitii benchmark fixture', +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/tools/benchmark/fixtures/next-app/app/loading.tsx b/tools/benchmark/fixtures/next-app/app/loading.tsx new file mode 100644 index 00000000..ccaf1c99 --- /dev/null +++ b/tools/benchmark/fixtures/next-app/app/loading.tsx @@ -0,0 +1,10 @@ +export default function Loading() { + return ( +
+
+
+

Loading...

+
+
+ ); +} \ No newline at end of file diff --git a/tools/benchmark/fixtures/next-app/app/page.tsx b/tools/benchmark/fixtures/next-app/app/page.tsx new file mode 100644 index 00000000..4046cced --- /dev/null +++ b/tools/benchmark/fixtures/next-app/app/page.tsx @@ -0,0 +1,8 @@ +export default function HomePage() { + return ( +
+

Next.js Benchmark Home

+

Fixture for Ask, Plan, and Agent benchmarks.

+
+ ); +} diff --git a/tools/benchmark/fixtures/next-app/next-env.d.ts b/tools/benchmark/fixtures/next-app/next-env.d.ts new file mode 100644 index 00000000..40c3d680 --- /dev/null +++ b/tools/benchmark/fixtures/next-app/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/tools/benchmark/fixtures/next-app/package.json b/tools/benchmark/fixtures/next-app/package.json new file mode 100644 index 00000000..49d3a374 --- /dev/null +++ b/tools/benchmark/fixtures/next-app/package.json @@ -0,0 +1,16 @@ +{ + "name": "benchmark-next-app", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "test": "node -e \"console.log('next test placeholder')\"", + "lint": "node -e \"console.log('lint ok')\"" + }, + "dependencies": { + "next": "^14.2.5", + "react": "^18.3.1", + "react-dom": "^18.3.1" + } +} diff --git a/tools/benchmark/fixtures/next-app/tsconfig.json b/tools/benchmark/fixtures/next-app/tsconfig.json new file mode 100644 index 00000000..ccb2ed95 --- /dev/null +++ b/tools/benchmark/fixtures/next-app/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "noEmit": true, + "incremental": true, + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/tools/benchmark/fixtures/node-express/package.json b/tools/benchmark/fixtures/node-express/package.json new file mode 100644 index 00000000..a27b7f86 --- /dev/null +++ b/tools/benchmark/fixtures/node-express/package.json @@ -0,0 +1,14 @@ +{ + "name": "benchmark-node-express", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "start": "node src/index.js", + "test": "node --test test/users.test.js", + "lint": "node -e \"console.log('lint ok')\"" + }, + "dependencies": { + "express": "^4.19.2" + } +} diff --git a/tools/benchmark/fixtures/node-express/src/index.js b/tools/benchmark/fixtures/node-express/src/index.js new file mode 100644 index 00000000..56f62462 --- /dev/null +++ b/tools/benchmark/fixtures/node-express/src/index.js @@ -0,0 +1,17 @@ +import express from 'express'; +import usersRouter from './routes/users.js'; + +const app = express(); +app.use(express.json()); +app.use('/users', usersRouter); + +app.get('/health', (_req, res) => { + res.json({ ok: true }); +}); + +const port = process.env.PORT || 3000; +app.listen(port, () => { + console.log(`listening on ${port}`); +}); + +export default app; diff --git a/tools/benchmark/fixtures/node-express/src/routes/users.js b/tools/benchmark/fixtures/node-express/src/routes/users.js new file mode 100644 index 00000000..e07e01fe --- /dev/null +++ b/tools/benchmark/fixtures/node-express/src/routes/users.js @@ -0,0 +1,14 @@ +import { Router } from 'express'; + +const router = Router(); + +router.get('/', (_req, res) => { + // BUG: wrong message for benchmark agent fix task + res.json({ status: 'ok', users: [] }); +}); + +router.get('/:id', (req, res) => { + res.json({ id: req.params.id, name: 'Sample User' }); +}); + +export default router; \ No newline at end of file diff --git a/tools/benchmark/fixtures/node-express/test/users.test.js b/tools/benchmark/fixtures/node-express/test/users.test.js new file mode 100644 index 00000000..5fa21766 --- /dev/null +++ b/tools/benchmark/fixtures/node-express/test/users.test.js @@ -0,0 +1,7 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; + +test('users route module exports router', async () => { + const mod = await import('../src/routes/users.js'); + assert.ok(mod.default); +}); diff --git a/tools/benchmark/fixtures/node-express/test_reproduction.js b/tools/benchmark/fixtures/node-express/test_reproduction.js new file mode 100644 index 00000000..5370b017 --- /dev/null +++ b/tools/benchmark/fixtures/node-express/test_reproduction.js @@ -0,0 +1,31 @@ +import { Router } from 'express'; +import { createServer } from 'http'; +import { AddressInfo } from 'net'; +import supertest from 'supertest'; + +// Create a minimal test server to verify current behavior +const router = Router(); + +router.get('/', (_req, res) => { + // This is what the task says the bug is - but let's see what we actually have + res.json({ users: [] }); +}); + +// For testing purposes, we'll create a simple server +const express = (await import('express')).default; +const app = express(); +app.use('/users', router); + +async function testEndpoint() { + const request = supertest(app); + try { + const response = await request.get('/users/'); + console.log('Response status:', response.status); + console.log('Response body:', response.body); + return response.body; + } catch (error) { + console.error('Error:', error); + } +} + +testEndpoint(); \ No newline at end of file diff --git a/tools/benchmark/fixtures/react-vite/package.json b/tools/benchmark/fixtures/react-vite/package.json new file mode 100644 index 00000000..6b1b6c19 --- /dev/null +++ b/tools/benchmark/fixtures/react-vite/package.json @@ -0,0 +1,20 @@ +{ + "name": "benchmark-react-vite", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "test": "node -e \"console.log('vitest placeholder')\"", + "lint": "node -e \"console.log('lint ok')\"" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "typescript": "^5.5.2", + "vite": "^5.3.1" + } +} diff --git a/tools/benchmark/fixtures/react-vite/src/App.tsx b/tools/benchmark/fixtures/react-vite/src/App.tsx new file mode 100644 index 00000000..97174b09 --- /dev/null +++ b/tools/benchmark/fixtures/react-vite/src/App.tsx @@ -0,0 +1,11 @@ +import Button from './components/Button'; + +export default function App() { + return ( +
+

Benchmark React App

+
+ ); +} diff --git a/tools/benchmark/fixtures/react-vite/src/components/Button.tsx b/tools/benchmark/fixtures/react-vite/src/components/Button.tsx new file mode 100644 index 00000000..12b72215 --- /dev/null +++ b/tools/benchmark/fixtures/react-vite/src/components/Button.tsx @@ -0,0 +1,8 @@ +export interface ButtonProps { + label: string; + variant?: 'primary' | 'secondary'; +} + +export default function Button({ label, variant = 'primary' }: ButtonProps) { + return ; +} diff --git a/tools/benchmark/inspect-ai/eval_tasks.py b/tools/benchmark/inspect-ai/eval_tasks.py new file mode 100644 index 00000000..9e99642a --- /dev/null +++ b/tools/benchmark/inspect-ai/eval_tasks.py @@ -0,0 +1,4 @@ +"""Inspect AI task entrypoints.""" +from mitii_solver import mitii_eval_smoke, mitii_eval_standard + +__all__ = ["mitii_eval_smoke", "mitii_eval_standard"] diff --git a/tools/benchmark/inspect-ai/mitii_solver.py b/tools/benchmark/inspect-ai/mitii_solver.py new file mode 100644 index 00000000..1123a343 --- /dev/null +++ b/tools/benchmark/inspect-ai/mitii_solver.py @@ -0,0 +1,179 @@ +""" +Inspect AI solver adapter for Mitii CLI. + +Install: + pip install inspect-ai + cd mitii-ai-agent && pnpm run compile:cli + +Run (example): + inspect eval tools/benchmark/inspect-ai/eval_tasks.py --model openai/gpt-4o-mini + +Set MITII_PACKAGE_ROOT to the mitii-ai-agent directory if not cwd. +""" +from __future__ import annotations + +import json +import os +import subprocess +from pathlib import Path + +from inspect_ai import Task, task +from inspect_ai.dataset import Sample +from inspect_ai.scorer import Score, Scorer, Target, scorer, accuracy, mean +from inspect_ai.solver import Generate, Solver, TaskState, solver + +PACKAGE_ROOT = Path(os.environ.get("MITII_PACKAGE_ROOT", Path(__file__).resolve().parents[3])) +BENCHMARK_ROOT = Path(os.environ.get("MITII_BENCHMARK_ROOT", PACKAGE_ROOT / "tools" / "benchmark")) +CLI = PACKAGE_ROOT / "dist" / "cli.js" +FIXTURE_ROOT = BENCHMARK_ROOT / "fixtures" +GENERATED_INDEX = BENCHMARK_ROOT / "tasks" / "eval" / "generated" / "index.json" + + +def _load_eval_samples(limit: int | None = 50) -> list[Sample]: + if not GENERATED_INDEX.exists(): + subprocess.run( + ["node", str(BENCHMARK_ROOT / "scripts/generate-tasks.mjs"), "--profile", "smoke"], + check=True, + cwd=PACKAGE_ROOT, + ) + index = json.loads(GENERATED_INDEX.read_text()) + base = GENERATED_INDEX.parent + tasks: list[dict] = [] + for rel in index.get("includes", []): + tasks.extend(json.loads((base / rel).read_text())) + if limit: + tasks = tasks[:limit] + return [ + Sample( + id=t["id"], + input=t["prompt"], + target="pass", + metadata={ + "mode": t.get("mode", "ask"), + "fixture": t.get("fixture"), + "verify": t.get("verify", []), + "category": t.get("category"), + }, + ) + for t in tasks + ] + + +@solver +def mitii_cli_solver( + provider: str = "echo", + runtime: str = "stub", + approval: str = "auto", + model: str | None = None, + base_url: str | None = None, +) -> Solver: + async def solve(state: TaskState, generate: Generate) -> TaskState: + meta = state.sample_metadata or {} + mode = meta.get("mode", "ask") + fixture = meta.get("fixture") + cwd = str(FIXTURE_ROOT / fixture) if fixture else str(PACKAGE_ROOT) + + cmd = [ + "node", + str(CLI), + mode, + state.input_text, + "--cwd", + cwd, + "--provider", + provider, + "--runtime", + runtime, + "--approval", + approval, + ] + if model: + cmd.extend(["--model", model]) + if base_url: + cmd.extend(["--base-url", base_url]) + if mode != "ask": + cmd.append("--json") + + proc = subprocess.run( + cmd, + cwd=PACKAGE_ROOT, + capture_output=True, + text=True, + timeout=int(os.environ.get("MITII_EVAL_TIMEOUT_MS", "120000")) // 1000, + ) + state.output.completion = proc.stdout + state.metadata["mitii_exit_code"] = proc.returncode + state.metadata["mitii_stderr"] = proc.stderr[:2000] + state.metadata["mitii_passed"] = _score_output( + proc.stdout, proc.returncode, meta.get("verify", []), cwd + ) + return state + + return solve + + +def _score_output(stdout: str, exit_code: int, verify: list, cwd: str) -> bool: + if exit_code != 0: + return False + for rule in verify: + if isinstance(rule, str): + if rule == "exit_0" and exit_code != 0: + return False + if rule == "stdout_not_empty" and not stdout.strip(): + return False + if rule.startswith("stdout_contains:"): + if rule.split(":", 1)[1] not in stdout: + return False + if rule.startswith("json_path:"): + key = rule.split(":", 1)[1] + try: + if not json.loads(stdout).get(key): + return False + except json.JSONDecodeError: + return False + if rule.startswith("jsonl_event:"): + ev = rule.split(":", 1)[1] + if not any( + _safe_json(line).get("type") == ev + for line in stdout.splitlines() + ): + return False + if rule.startswith("file_exists:"): + rel = rule.split(":", 1)[1] + if not (Path(cwd) / rel).exists(): + return False + return True + + +def _safe_json(line: str) -> dict: + try: + return json.loads(line) + except json.JSONDecodeError: + return {} + + +@scorer(metrics=[accuracy(), mean()]) +def mitii_verify_scorer() -> Scorer: + async def score(state: TaskState, target: Target) -> Score: + passed = bool(state.metadata.get("mitii_passed")) + return Score(value=1.0 if passed else 0.0, answer="pass" if passed else "fail") + + return score + + +@task +def mitii_eval_smoke(): + return Task( + dataset=_load_eval_samples(limit=10), + solver=mitii_cli_solver(), + scorer=mitii_verify_scorer(), + ) + + +@task +def mitii_eval_standard(): + return Task( + dataset=_load_eval_samples(limit=500), + solver=mitii_cli_solver(provider="openai-compatible", runtime="real"), + scorer=mitii_verify_scorer(), + ) diff --git a/tools/benchmark/inspect-ai/requirements.txt b/tools/benchmark/inspect-ai/requirements.txt new file mode 100644 index 00000000..ee2ab8c7 --- /dev/null +++ b/tools/benchmark/inspect-ai/requirements.txt @@ -0,0 +1 @@ +inspect-ai>=0.3.0 diff --git a/tools/benchmark/package.json b/tools/benchmark/package.json new file mode 100644 index 00000000..f99a7b36 --- /dev/null +++ b/tools/benchmark/package.json @@ -0,0 +1,20 @@ +{ + "name": "@mitii/benchmark", + "private": true, + "type": "module", + "description": "Mitii benchmark and eval harnesses", + "scripts": { + "benchmark": "node run.mjs", + "benchmark:smoke": "node run.mjs --tier smoke", + "benchmark:all": "node run.mjs --tier all --runtime real", + "benchmark:integration": "node run.mjs --tier integration --runtime real", + "eval:generate": "node scripts/generate-tasks.mjs --profile standard", + "eval:generate:full": "node scripts/generate-tasks.mjs --profile full", + "eval:preflight": "node scripts/preflight.mjs", + "eval:smoke": "node scripts/generate-tasks.mjs --profile smoke --output tasks/eval/generated-smoke && node scripts/run-eval.mjs --provider echo --runtime stub --tier all --no-ensure-ready --tasks tasks/eval/generated-smoke/index.json", + "eval:standard": "node scripts/run-eval.mjs --tier eval --runtime real --ensure-ready", + "eval:aggregate": "node scripts/aggregate-results.mjs", + "eval:matrix": "bash scripts/ollama-matrix.sh", + "reset-fixtures": "node scripts/reset-fixtures.mjs" + } +} diff --git a/tools/benchmark/run.mjs b/tools/benchmark/run.mjs new file mode 100644 index 00000000..7aeeb1ce --- /dev/null +++ b/tools/benchmark/run.mjs @@ -0,0 +1,142 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { spawnSync } from 'child_process'; +import { dirname, join, resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { verifyTask, summarizeVerifications } from './verify.mjs'; + +const benchmarkDir = dirname(fileURLToPath(import.meta.url)); +const packageRoot = resolve(benchmarkDir, '../..'); +const args = process.argv.slice(2); +const cwd = resolve(valueOf(args, '--cwd') ?? packageRoot); +const tasksPath = resolve(valueOf(args, '--tasks') ?? join(benchmarkDir, 'tasks/enterprise/index.json')); +const outputPath = resolve(valueOf(args, '--output') ?? join(cwd, '.mitii/benchmark/report.json')); +const provider = valueOf(args, '--provider') ?? 'echo'; +const tier = valueOf(args, '--tier') ?? 'smoke'; +const runtime = valueOf(args, '--runtime') ?? (tier === 'smoke' && provider === 'echo' ? 'stub' : 'real'); +const approval = valueOf(args, '--approval') ?? 'auto'; +const enablePuppeteer = args.includes('--enable-puppeteer'); + +if (!existsSync(join(packageRoot, 'dist/cli.js'))) { + const compile = spawnSync(packageManager(), ['run', 'compile:cli'], { + cwd: packageRoot, + stdio: 'inherit', + shell: process.platform === 'win32', + }); + if (compile.status) process.exit(compile.status ?? 1); +} + +const cliPath = join(packageRoot, 'dist/cli.js'); +const taskIndex = JSON.parse(readFileSync(tasksPath, 'utf8')); +const selectedTasks = loadTasks(taskIndex, tier); +const fixtureRoot = join(benchmarkDir, 'fixtures'); + +const results = selectedTasks.map((task) => runTask(task, { cliPath, packageRoot, fixtureRoot })); +const passed = results.filter((result) => result.passed).length; +const report = { + cwd, + packageRoot, + provider, + runtime, + tier, + startedAt: new Date().toISOString(), + summary: { + total: results.length, + passed, + failed: results.length - passed, + score: results.length ? Math.round((passed / results.length) * 100) : 0, + }, + verificationSummary: summarizeVerifications(results), + results, +}; + +mkdirSync(dirname(outputPath), { recursive: true }); +writeFileSync(outputPath, `${JSON.stringify(report, null, 2)}\n`, 'utf8'); +writeFileSync(outputPath.replace(/\.json$/, '.md'), toMarkdown(report), 'utf8'); +console.log(`${passed}/${results.length} benchmark tasks passed (${report.summary.score}%)`); +if (passed !== results.length) process.exitCode = 1; + +function loadTasks(index, selectedTier) { + const baseDir = dirname(tasksPath); + const files = Array.isArray(index.includes) ? index.includes : [index.tasksFile ?? 'tasks.json']; + const all = files.flatMap((file) => { + const path = resolve(baseDir, file); + return JSON.parse(readFileSync(path, 'utf8')); + }); + return all.filter((task) => !task.tier || task.tier === selectedTier || selectedTier === 'all'); +} + +function runTask(task, ctx) { + const fixtureCwd = task.fixture ? join(ctx.fixtureRoot, task.fixture) : cwd; + const extraArgs = [ + '--cwd', fixtureCwd, + '--provider', provider, + '--runtime', runtime, + '--approval', approval, + ]; + if (enablePuppeteer || task.enablePuppeteer) extraArgs.push('--enable-puppeteer'); + if (task.model) extraArgs.push('--model', task.model); + const taskRuntime = task.runtime ?? runtime; + const runtimeIndex = extraArgs.indexOf('--runtime'); + if (runtimeIndex >= 0) extraArgs[runtimeIndex + 1] = taskRuntime; + + const cliArgs = [ctx.cliPath, task.mode, task.prompt, ...extraArgs]; + if (task.mode !== 'ask') cliArgs.push('--json'); + + const started = Date.now(); + const result = spawnSync('node', cliArgs, { cwd: packageRoot, encoding: 'utf8', env: process.env }); + const durationMs = Date.now() - started; + const stdout = result.stdout ?? ''; + const stderr = result.stderr ?? ''; + const verifications = (task.verify ?? []).map((rule) => verifyTask(rule, { + stdout, + stderr, + exitCode: result.status ?? 1, + cwd: fixtureCwd, + packageRoot: ctx.packageRoot, + mode: task.mode, + })); + const passed = result.status === 0 && verifications.every((v) => v.passed); + + return { + id: task.id, + category: task.category ?? 'general', + mode: task.mode, + fixture: task.fixture ?? null, + passed, + durationMs, + exitCode: result.status, + verifications, + stdout: stdout.slice(0, 4000), + stderr: stderr.slice(0, 2000), + }; +} + +function valueOf(argv, name) { + const idx = argv.indexOf(name); + return idx >= 0 ? argv[idx + 1] : undefined; +} + +function packageManager() { + return process.env.MITII_PACKAGE_MANAGER ?? 'pnpm'; +} + +function toMarkdown(report) { + return [ + '# Mitii Enterprise Benchmark Report', + '', + `Provider: ${report.provider}`, + `Runtime: ${report.runtime}`, + `Tier: ${report.tier}`, + `Score: ${report.summary.passed}/${report.summary.total} (${report.summary.score}%)`, + '', + '## Verification summary', + ...Object.entries(report.verificationSummary).map(([k, v]) => `- ${k}: ${v.passed}/${v.total}`), + '', + '| Task | Category | Mode | Fixture | Result | Duration |', + '|---|---|---|---|---:|---:|', + ...report.results.map((result) => + `| ${result.id} | ${result.category} | ${result.mode} | ${result.fixture ?? '-'} | ${result.passed ? 'pass' : 'fail'} | ${result.durationMs} ms |` + ), + '', + ].join('\n'); +} diff --git a/tools/benchmark/scripts/aggregate-results.mjs b/tools/benchmark/scripts/aggregate-results.mjs new file mode 100644 index 00000000..9bdc605d --- /dev/null +++ b/tools/benchmark/scripts/aggregate-results.mjs @@ -0,0 +1,116 @@ +#!/usr/bin/env node +/** + * Merge shard eval reports into a single potential-assessment summary. + */ +import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'fs'; +import { dirname, join, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +const args = process.argv.slice(2); +const benchmarkDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const inputDir = resolve(valueOf(args, '--input') ?? join(benchmarkDir, 'results')); +const outputPath = resolve(valueOf(args, '--output') ?? join(inputDir, 'aggregated-report.json')); + +if (!existsSync(inputDir)) { + console.error(`Input directory not found: ${inputDir}`); + process.exit(1); +} + +const reports = readdirSync(inputDir) + .filter((f) => f.endsWith('.json') && f !== 'aggregated-report.json') + .map((f) => JSON.parse(readFileSync(join(inputDir, f), 'utf8'))); + +if (!reports.length) { + console.error('No report JSON files found'); + process.exit(1); +} + +const allResults = reports.flatMap((r) => r.results ?? []); +const passed = allResults.filter((r) => r.passed).length; +const categoryBreakdown = {}; + +for (const r of allResults) { + const cat = r.category ?? 'unknown'; + if (!categoryBreakdown[cat]) categoryBreakdown[cat] = { passed: 0, total: 0 }; + categoryBreakdown[cat].total += 1; + if (r.passed) categoryBreakdown[cat].passed += 1; +} +for (const cat of Object.keys(categoryBreakdown)) { + const { passed: p, total } = categoryBreakdown[cat]; + categoryBreakdown[cat].score = total ? Math.round((p / total) * 100) : 0; +} + +const aggregated = { + aggregatedAt: new Date().toISOString(), + shardCount: reports.length, + provider: reports[0]?.provider, + runtime: reports[0]?.runtime, + summary: { + total: allResults.length, + passed, + failed: allResults.length - passed, + score: allResults.length ? Math.round((passed / allResults.length) * 100) : 0, + avgDurationMs: allResults.length + ? Math.round(allResults.reduce((s, r) => s + (r.durationMs ?? 0), 0) / allResults.length) + : 0, + }, + categoryBreakdown, + potentialAssessment: assessPotential(categoryBreakdown, allResults.length), + shardSummaries: reports.map((r) => r.summary), +}; + +mkdirSync(dirname(outputPath), { recursive: true }); +writeFileSync(outputPath, `${JSON.stringify(aggregated, null, 2)}\n`, 'utf8'); +writeFileSync(outputPath.replace(/\.json$/, '.md'), toMarkdown(aggregated), 'utf8'); +console.log(`Aggregated ${reports.length} shards → ${passed}/${allResults.length} (${aggregated.summary.score}%)`); +console.log('Potential:', aggregated.potentialAssessment.tier); + +function assessPotential(categories, total) { + const scores = Object.values(categories).map((c) => c.score); + const overall = total ? Math.round((scores.reduce((a, b) => a + b, 0) / scores.length)) : 0; + const agentCats = Object.entries(categories).filter(([k]) => k.includes('agent')); + const agentScore = agentCats.length + ? Math.round(agentCats.reduce((s, [, v]) => s + v.score, 0) / agentCats.length) + : 0; + + let tier = 'developing'; + if (overall >= 85 && agentScore >= 70) tier = 'enterprise-ready'; + else if (overall >= 70) tier = 'production-capable'; + else if (overall >= 50) tier = 'promising'; + + return { + tier, + overallScore: overall, + agentScore, + recommendation: tier === 'enterprise-ready' + ? 'Strong across categories; run full 1000-task matrix with target model.' + : tier === 'production-capable' + ? 'Good baseline; focus agent-mode and fixture-agent categories.' + : tier === 'promising' + ? 'Partial capability; compare models via Ollama matrix and inspect failing categories.' + : 'Early stage; verify runtime=real, model quality, and tool wiring.', + }; +} + +function toMarkdown(report) { + return [ + '# Mitii Agent Potential Assessment', + '', + `**Tier:** ${report.potentialAssessment.tier}`, + `**Overall score:** ${report.summary.score}% (${report.summary.passed}/${report.summary.total})`, + `**Agent score:** ${report.potentialAssessment.agentScore}%`, + '', + report.potentialAssessment.recommendation, + '', + '## Category scores', + ...Object.entries(report.categoryBreakdown).map( + ([cat, v]) => `- ${cat}: ${v.score}% (${v.passed}/${v.total})` + ), + '', + ].join('\n'); +} + +function valueOf(argv, name) { + const idx = argv.indexOf(name); + return idx >= 0 ? argv[idx + 1] : undefined; +} diff --git a/tools/benchmark/scripts/generate-tasks.mjs b/tools/benchmark/scripts/generate-tasks.mjs new file mode 100644 index 00000000..3383fa27 --- /dev/null +++ b/tools/benchmark/scripts/generate-tasks.mjs @@ -0,0 +1,491 @@ +#!/usr/bin/env node +/** + * Generates 500–1000 external eval tasks for Mitii (not shipped in VSIX). + * + * Usage: + * node tools/benchmark/scripts/generate-tasks.mjs --profile standard + * node tools/benchmark/scripts/generate-tasks.mjs --count 750 --output tools/benchmark/tasks/eval/generated + */ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { dirname, join, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +const benchmarkDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const args = process.argv.slice(2); + +const profile = valueOf(args, '--profile') ?? 'standard'; +const countArg = valueOf(args, '--count'); +const outputDir = resolve(valueOf(args, '--output') ?? join(benchmarkDir, 'tasks/eval/generated')); +const shardSize = Number(valueOf(args, '--shard-size') ?? '100'); + +const profiles = JSON.parse(readFileSync(join(benchmarkDir, 'config/profiles.json'), 'utf8')); +const profileConfig = profiles.profiles[profile] ?? profiles.profiles.standard; +const targetCount = countArg ? Number(countArg) : profileConfig.targetCount; + +const fixtureCatalog = JSON.parse(readFileSync(join(benchmarkDir, 'datasets/fixture-catalog.json'), 'utf8')); +const fixtures = fixtureCatalog.fixtures; + +const tasks = []; +const seenIds = new Set(); + +function addTask(task) { + if (seenIds.has(task.id)) return false; + seenIds.add(task.id); + tasks.push({ ...task, tier: 'eval' }); + return true; +} + +// --- Category generators --- + +function generateFixtureAsk() { + const askTemplates = [ + (f, file) => `Explain the purpose of ${file} in this ${fixtures[f].stack} project.`, + (f, file) => `What does ${file} export or define? Summarize without inventing details.`, + (f, file) => `How does ${file} connect to other modules in this codebase?`, + (f, file) => `List the key functions, classes, or routes defined in ${file}.`, + (f, file) => `What dependencies or imports does ${file} use?`, + (f, file) => `Describe error handling patterns visible in or around ${file}.`, + (f, file) => `What would you inspect first in ${file} when debugging a runtime issue?`, + (f, file) => `Summarize the public API surface exposed via ${file}.`, + (f, file) => `Which tests (if any) cover behavior related to ${file}?`, + (f, file) => `What refactoring opportunities exist in ${file}? Be specific to the file.`, + (f, file) => `How is ${file} referenced elsewhere in the repository?`, + (f, file) => `What configuration in package.json affects ${file}?`, + (f, _file) => `Give an architecture overview of this ${fixtures[f].stack} codebase.`, + (f, _file) => `What are the main entry points and request/data flows?`, + (f, _file) => `Which files would you read to onboard a new engineer to this repo?`, + ]; + + for (const [fixture, meta] of Object.entries(fixtures)) { + for (const file of meta.entryFiles) { + for (let i = 0; i < askTemplates.length; i++) { + const slug = file.replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, ''); + addTask({ + id: `eval-ask-${fixture}-${slug}-t${i}`, + tier: 'eval', + category: `fixture-ask-${meta.category}`, + mode: 'ask', + fixture, + prompt: askTemplates[i](fixture, file), + verify: ['exit_0', 'stdout_not_empty', `file_exists:${file}`], + }); + } + } + for (const symbol of meta.symbols) { + addTask({ + id: `eval-ask-${fixture}-symbol-${symbol.replace(/[^a-z0-9]+/gi, '-').toLowerCase()}`, + tier: 'eval', + category: `fixture-ask-${meta.category}`, + mode: 'ask', + fixture, + prompt: `Where is "${symbol}" defined or used in this codebase? Explain its role.`, + verify: ['exit_0', 'stdout_not_empty'], + }); + } + } +} + +function generateFixturePlan() { + const planScenarios = [ + 'Add comprehensive unit tests for the main module', + 'Introduce structured logging across the application', + 'Add input validation for all public endpoints or components', + 'Plan a migration from JavaScript to TypeScript incrementally', + 'Add health check and readiness endpoints', + 'Improve error messages for API consumers', + 'Add API documentation generation (OpenAPI or similar)', + 'Plan performance profiling for hot paths', + 'Add environment-based configuration with validation', + 'Plan CI pipeline steps: lint, test, build', + 'Add rate limiting for public routes', + 'Plan accessibility improvements for UI components', + 'Add integration tests with a test database or mock server', + 'Plan dependency audit and security hardening', + 'Add observability: metrics and tracing hooks', + 'Plan refactoring to reduce coupling between modules', + 'Add caching layer for frequently accessed data', + 'Plan feature flags for gradual rollout', + 'Add database migration strategy (if applicable)', + 'Plan dark mode support for the UI', + ]; + + for (const [fixture, meta] of Object.entries(fixtures)) { + for (let i = 0; i < planScenarios.length; i++) { + addTask({ + id: `eval-plan-${fixture}-s${i}`, + tier: 'eval', + category: `fixture-plan-${meta.category}`, + mode: 'plan', + fixture, + prompt: `${planScenarios[i]} in this ${meta.stack} project. Break into ordered steps with verification.`, + verify: ['exit_0', 'json_path:steps'], + }); + } + } +} + +function generateFixtureAgent() { + const agentTasks = [ + { prompt: 'Read src structure and list the top 3 improvement areas without editing files.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Inspect the main entry file and summarize middleware or bootstrap setup.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Find TODO or FIXME comments if any; report locations.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Review package.json scripts and suggest one missing script for developer workflow.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Identify the highest-risk file for production bugs and explain why.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'List all exported symbols from the main service or route module.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Explain which Mitii skills apply to this codebase and when to use them.', verify: ['exit_0', 'jsonl_event:end', 'skills_installed:5'] }, + { prompt: 'Draft a verification checklist before making any code changes.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Compare this project structure to common best practices for its stack.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Find duplicate logic across files and suggest consolidation targets.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Outline safe read-only inspection steps before editing any file.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Summarize environment variables or config this app would need in production.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'Identify missing error handling and rank by severity.', verify: ['exit_0', 'jsonl_event:end'] }, + { prompt: 'List files that should never be auto-edited by an agent and why.', verify: ['exit_0', 'jsonl_event:end'] }, + ]; + + const nodeExpressFix = { + id: 'eval-agent-node-express-fix-users', + tier: 'eval', + category: 'fixture-agent-node', + mode: 'agent', + fixture: 'node-express', + prompt: 'Fix the bug in src/routes/users.js where GET /users returns the wrong status message. Apply the fix.', + verify: ['exit_0', 'jsonl_event:end', 'file_contains:src/routes/users.js:success'], + }; + addTask(nodeExpressFix); + + for (const [fixture, meta] of Object.entries(fixtures)) { + for (let i = 0; i < agentTasks.length; i++) { + addTask({ + id: `eval-agent-${fixture}-a${i}`, + tier: 'eval', + category: `fixture-agent-${meta.category}`, + mode: 'agent', + fixture, + prompt: agentTasks[i].prompt, + verify: agentTasks[i].verify, + }); + } + } +} + +function generateRetrieval() { + const queries = [ + 'Find the file that defines the main HTTP server bootstrap.', + 'Locate the primary UI component rendered on the home view.', + 'Where is the root NestJS module declared?', + 'Find the Next.js root layout component.', + 'Which file handles the /users route?', + 'Where are React component props typed?', + 'Find the NestJS controller class.', + 'Locate package.json and summarize its name field.', + 'Find test files in this repository.', + 'Which source file has the most imports?', + 'Locate the Express app mount point for routers.', + 'Find TypeScript configuration if present.', + 'Where is the main page metadata defined?', + 'Find service layer business logic.', + 'Locate entry point for the build tool configuration.', + ]; + + for (const [fixture, meta] of Object.entries(fixtures)) { + for (let i = 0; i < queries.length; i++) { + addTask({ + id: `eval-retrieval-${fixture}-q${i}`, + tier: 'eval', + category: `retrieval-${meta.category}`, + mode: 'ask', + fixture, + prompt: queries[i], + verify: ['exit_0', 'stdout_not_empty'], + }); + } + } +} + +function generateCodingJs() { + const problems = [ + { id: 'two-sum', prompt: 'Implement twoSum(nums, target) returning indices. Explain approach briefly.', expect: 'map' }, + { id: 'reverse-string', prompt: 'Write a function reverseString(s) for a string array in-place. Explain complexity.', expect: 'O(n)' }, + { id: 'valid-parens', prompt: 'Write isValid(s) for bracket matching. What edge cases matter?', expect: 'stack' }, + { id: 'merge-sorted', prompt: 'Merge two sorted arrays into one sorted array. Describe algorithm.', expect: 'merge' }, + { id: 'fibonacci', prompt: 'Implement fib(n) iteratively. What is time and space complexity?', expect: 'O(n)' }, + { id: 'binary-search', prompt: 'Implement binary search on a sorted array. When does it fail?', expect: 'mid' }, + { id: 'palindrome', prompt: 'Check if a string is a palindrome ignoring case and non-alphanumeric.', expect: 'palindrome' }, + { id: 'max-subarray', prompt: "Explain Kadane's algorithm for maximum subarray sum.", expect: 'subarray' }, + { id: 'anagram', prompt: 'Determine if two strings are anagrams. Compare sorting vs counting.', expect: 'anagram' }, + { id: 'fizzbuzz', prompt: 'Describe FizzBuzz implementation for 1..n. Mention extensibility.', expect: 'FizzBuzz' }, + { id: 'debounce', prompt: 'Implement a debounce(fn, wait) utility in JavaScript.', expect: 'debounce' }, + { id: 'throttle', prompt: 'Implement throttle(fn, limit) and contrast with debounce.', expect: 'throttle' }, + { id: 'deep-clone', prompt: 'Outline a deepClone for plain objects (no cycles). Mention limitations.', expect: 'clone' }, + { id: 'promise-all', prompt: 'Implement promiseAll(iterable) like Promise.all.', expect: 'Promise' }, + { id: 'flatten', prompt: 'Flatten a nested array to arbitrary depth.', expect: 'flat' }, + { id: 'curry', prompt: 'Implement curry for a function with fixed arity.', expect: 'curry' }, + { id: 'memoize', prompt: 'Add memoization to an expensive pure function.', expect: 'cache' }, + { id: 'lru-cache', prompt: 'Design an LRU cache API (get/put). Describe data structures.', expect: 'LRU' }, + { id: 'event-emitter', prompt: 'Sketch EventEmitter with on, off, emit.', expect: 'emit' }, + { id: 'json-parse-safe', prompt: 'Write safeJsonParse that never throws.', expect: 'JSON' }, + ]; + + const variants = ['', ' Use TypeScript types in the explanation.', ' Include unit test cases.', ' Mention Big-O.', ' Show edge case handling.']; + + for (const problem of problems) { + for (let v = 0; v < variants.length; v++) { + addTask({ + id: `eval-coding-${problem.id}-v${v}`, + tier: 'eval', + category: 'coding-js', + mode: 'ask', + prompt: `${problem.prompt}${variants[v]}`, + verify: ['exit_0', 'stdout_not_empty', `stdout_contains:${problem.expect}`], + }); + } + } + + // Expand with numeric variants for volume + const algoKinds = ['second largest', 'missing number', 'duplicate', 'pair with sum k', 'longest increasing subsequence length']; + for (let n = 1; n <= 110; n++) { + addTask({ + id: `eval-coding-algo-${n}`, + tier: 'eval', + category: 'coding-js', + mode: 'ask', + prompt: `Solve: Given an array of integers, problem #${n} — find the ${algoKinds[n % algoKinds.length]}. Explain approach and complexity.`, + verify: ['exit_0', 'stdout_not_empty'], + }); + } +} + +function generateReasoning() { + const topics = [ + 'If a CI pipeline fails only on Windows, what hypotheses do you test first?', + 'Compare monorepo vs polyrepo for a 10-engineer team shipping JS libraries.', + 'When should an agent ask for approval before editing package.json?', + 'How do you verify an LLM-generated patch without running full e2e?', + 'What signals indicate index staleness in a coding agent?', + 'Explain tradeoffs: stub runtime vs real runtime in benchmark harnesses.', + 'How would you shard 1000 eval tasks across 8 workers fairly?', + 'When is retrieval-augmented ask mode preferable to agent mode?', + 'Describe a safe rollback strategy after a bad agent edit.', + 'How do session JSONL logs help post-hoc eval scoring?', + ]; + + for (let i = 0; i < topics.length; i++) { + for (let v = 0; v < 5; v++) { + addTask({ + id: `eval-reasoning-${i}-v${v}`, + tier: 'eval', + category: 'reasoning', + mode: 'ask', + prompt: `${topics[i]} (variant ${v + 1}: be concise and structured).`, + verify: ['exit_0', 'stdout_not_empty'], + }); + } + } + + for (let n = 1; n <= 40; n++) { + addTask({ + id: `eval-reasoning-math-${n}`, + tier: 'eval', + category: 'reasoning', + mode: 'ask', + prompt: `Without using tools: explain step-by-step how to verify the answer to problem ${n} where you sum integers from 1 to ${n + 10}.`, + verify: ['exit_0', 'stdout_not_empty'], + }); + } +} + +function generateToolCalling() { + const tools = [ + { name: 'read_file', args: '{ "path": "src/index.js" }', expect: 'read_file' }, + { name: 'write_file', args: '{ "path": "src/foo.js", "content": "..." }', expect: 'write' }, + { name: 'run_terminal', args: '{ "command": "npm test" }', expect: 'npm test' }, + { name: 'search_codebase', args: '{ "query": "router.get" }', expect: 'search' }, + { name: 'list_directory', args: '{ "path": "src" }', expect: 'directory' }, + { name: 'git_status', args: '{}', expect: 'git' }, + { name: 'create_plan', args: '{ "steps": [] }', expect: 'plan' }, + { name: 'browser_navigate', args: '{ "url": "http://localhost:3000" }', expect: 'browser' }, + ]; + + const phrasings = [ + (t) => `When should a coding agent call the ${t.name} tool? Give an example with args ${t.args}.`, + (t) => `Describe correct JSON arguments for ${t.name}: ${t.args}`, + (t) => `What preconditions must be true before invoking ${t.name}?`, + (t) => `What failure modes occur when ${t.name} is misused?`, + ]; + + for (const tool of tools) { + for (let p = 0; p < phrasings.length; p++) { + for (let v = 0; v < 5; v++) { + addTask({ + id: `eval-tool-${tool.name}-p${p}-v${v}`, + tier: 'eval', + category: 'tool-calling', + mode: 'ask', + prompt: phrasings[p](tool), + verify: ['exit_0', 'stdout_not_empty'], + }); + } + } + } +} + +function generateGaiaStyle() { + const gaiaTasks = [ + { prompt: 'What is the capital of France? Answer with one word.', expect: 'Paris' }, + { prompt: 'How many days are in a leap year? Answer with a number only.', expect: '366' }, + { prompt: 'What year did the first Node.js release occur? Answer with the year.', expect: '2009' }, + { prompt: 'What does HTTP stand for? Give the expansion.', expect: 'Hypertext' }, + { prompt: 'What is 17 * 23? Show the result.', expect: '391' }, + { prompt: 'Name the default package manager for Node.js.', expect: 'npm' }, + { prompt: 'What file extension does TypeScript use?', expect: 'ts' }, + { prompt: 'What command lists git commits?', expect: 'git log' }, + { prompt: 'What port does Ollama default API use?', expect: '11434' }, + { prompt: 'What is JSON short for?', expect: 'JavaScript' }, + ]; + + const multiStep = [ + 'Find package.json in a Node project and explain how to run tests — describe steps without executing.', + 'Outline how to verify a React component renders using browser devtools.', + 'Describe how to add a health endpoint to an Express app and verify with curl.', + 'Plan reading CHANGELOG, package.json, and src/ to assess release readiness.', + 'Explain how to use session logs in .mitii/logs for debugging agent runs.', + ]; + + for (let i = 0; i < gaiaTasks.length; i++) { + for (let v = 0; v < 4; v++) { + addTask({ + id: `eval-gaia-fact-${i}-v${v}`, + tier: 'eval', + category: 'gaia', + mode: 'ask', + prompt: gaiaTasks[i].prompt, + verify: ['exit_0', 'stdout_not_empty', `stdout_contains:${gaiaTasks[i].expect}`], + }); + } + } + + for (let i = 0; i < multiStep.length; i++) { + for (let v = 0; v < 8; v++) { + addTask({ + id: `eval-gaia-multistep-${i}-v${v}`, + tier: 'eval', + category: 'gaia', + mode: 'plan', + prompt: `${multiStep[i]} (variant ${v + 1})`, + verify: ['exit_0', 'json_path:steps'], + }); + } + } + + for (let n = 1; n <= 50; n++) { + addTask({ + id: `eval-gaia-research-${n}`, + tier: 'eval', + category: 'gaia', + mode: 'ask', + prompt: `Research-style question #${n}: Compare two strategies for eval harness design (subprocess CLI vs in-process host).`, + verify: ['exit_0', 'stdout_not_empty'], + }); + } +} + +function includeBaseBenchmark() { + if (!profileConfig.includeBaseBenchmark) return; + const indexPath = join(benchmarkDir, 'tasks/enterprise/index.json'); + if (!existsSync(indexPath)) return; + const index = JSON.parse(readFileSync(indexPath, 'utf8')); + const baseDir = dirname(indexPath); + const files = Array.isArray(index.includes) ? index.includes : []; + for (const file of files) { + const baseTasks = JSON.parse(readFileSync(resolve(baseDir, file), 'utf8')); + for (const task of baseTasks) { + addTask({ + ...task, + id: `base-${task.id}`, + category: task.category ?? 'benchmark', + sourceTier: task.tier, + }); + } + } +} + +// --- Run generators --- +if (profile === 'smoke') { + includeBaseBenchmark(); + const smokeOnly = tasks.filter((t) => t.sourceTier === 'smoke' || t.id.startsWith('base-')); + tasks.length = 0; + seenIds.clear(); + for (const t of smokeOnly.slice(0, targetCount)) addTask(t); +} else { + if (profileConfig.categories) { + includeBaseBenchmark(); + // Category-filtered profiles: generators run below; filter at end + } else { + includeBaseBenchmark(); + } + generateFixtureAsk(); + generateFixturePlan(); + generateFixtureAgent(); + generateRetrieval(); + generateCodingJs(); + generateReasoning(); + generateToolCalling(); + generateGaiaStyle(); +} + +// Trim or pad to target count (deterministic: sort by id, slice) +tasks.sort((a, b) => a.id.localeCompare(b.id)); +const selected = tasks.slice(0, targetCount); + +if (selected.length < Math.min(targetCount, 500)) { + console.error(`Generator produced only ${selected.length} tasks (target ${targetCount}). Add more templates.`); + process.exit(1); +} + +// Write sharded output +mkdirSync(outputDir, { recursive: true }); +const shards = []; +for (let i = 0; i < selected.length; i += shardSize) { + const shard = selected.slice(i, i + shardSize); + const shardName = `shard-${String(Math.floor(i / shardSize)).padStart(3, '0')}.json`; + const shardPath = join(outputDir, shardName); + writeFileSync(shardPath, `${JSON.stringify(shard, null, 2)}\n`, 'utf8'); + shards.push(shardName); +} + +const manifest = { + generatedAt: new Date().toISOString(), + profile, + targetCount, + actualCount: selected.length, + shardSize, + shards, + categories: summarizeCategories(selected), + outputDir, + note: 'External eval tasks — not packaged in VSIX extension', +}; + +writeFileSync(join(outputDir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8'); +writeFileSync( + join(outputDir, 'index.json'), + `${JSON.stringify({ includes: shards.map((s) => s) }, null, 2)}\n`, + 'utf8' +); + +console.log(`Generated ${selected.length} eval tasks in ${shards.length} shards → ${outputDir}`); +console.log('Categories:', JSON.stringify(manifest.categories)); + +function summarizeCategories(taskList) { + const counts = {}; + for (const t of taskList) { + const cat = t.category ?? 'unknown'; + counts[cat] = (counts[cat] ?? 0) + 1; + } + return counts; +} + +function valueOf(argv, name) { + const idx = argv.indexOf(name); + return idx >= 0 ? argv[idx + 1] : undefined; +} diff --git a/tools/benchmark/scripts/ollama-matrix.sh b/tools/benchmark/scripts/ollama-matrix.sh new file mode 100755 index 00000000..9fd395a8 --- /dev/null +++ b/tools/benchmark/scripts/ollama-matrix.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Run eval across free Ollama models and aggregate potential scores. +set -euo pipefail + +BENCHMARK_DIR="$(cd "$(dirname "$0")/.." && pwd)" +ROOT="$(cd "$BENCHMARK_DIR/../.." && pwd)" +cd "$ROOT" + +RESULTS_DIR="${RESULTS_DIR:-$BENCHMARK_DIR/results/ollama-matrix}" +PROFILE="${PROFILE:-standard}" +CONCURRENCY="${CONCURRENCY:-2}" +SHARDS="${SHARDS:-4}" + +MODELS=( + "qwen3-coder:30b" + "llama3.1:8b" + "deepseek-coder:6.7b" + "codellama:7b" +) + +BASE_URL="${OLLAMA_BASE_URL:-http://localhost:11434/v1}" + +echo "Generating tasks (profile=$PROFILE)..." +node "$BENCHMARK_DIR/scripts/generate-tasks.mjs" --profile "$PROFILE" + +mkdir -p "$RESULTS_DIR" + +for model in "${MODELS[@]}"; do + echo "=== Model: $model ===" + MODEL_DIR="$RESULTS_DIR/$(echo "$model" | tr ':/' '--')" + mkdir -p "$MODEL_DIR" + + for shard in $(seq 1 "$SHARDS"); do + echo " Shard $shard/$SHARDS" + node "$BENCHMARK_DIR/scripts/run-eval.mjs" \ + --runtime real \ + --provider openai-compatible \ + --base-url "$BASE_URL" \ + --model "$model" \ + --approval auto \ + --concurrency "$CONCURRENCY" \ + --shard "$shard/$SHARDS" \ + --output "$MODEL_DIR/shard-${shard}.json" \ + || true + done + + node "$BENCHMARK_DIR/scripts/aggregate-results.mjs" \ + --input "$MODEL_DIR" \ + --output "$MODEL_DIR/aggregated-report.json" +done + +echo "Matrix complete. Results in $RESULTS_DIR" diff --git a/tools/benchmark/scripts/preflight.mjs b/tools/benchmark/scripts/preflight.mjs new file mode 100644 index 00000000..890b4ba2 --- /dev/null +++ b/tools/benchmark/scripts/preflight.mjs @@ -0,0 +1,80 @@ +#!/usr/bin/env node +/** + * Preflight checks for real-runtime eval (CLI uses Node ABI, not Electron). + */ +import { spawnSync } from 'child_process'; +import { createRequire } from 'module'; +import { dirname, join, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +const benchmarkDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const packageRoot = resolve(benchmarkDir, '../..'); +const require = createRequire(import.meta.url); + +export function checkSqliteLoad() { + try { + const Database = require('better-sqlite3'); + const db = new Database(':memory:'); + db.close(); + return { ok: true }; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return { ok: false, message }; + } +} + +export function rebuildSqliteForNode(packageDir = packageRoot) { + console.log('Rebuilding better-sqlite3 for current Node (eval CLI requires Node ABI, not Electron)...'); + const result = spawnSync('node', [join(packageRoot, 'scripts/rebuild-node.mjs')], { + cwd: packageDir, + stdio: 'inherit', + shell: process.platform === 'win32', + }); + return result.status === 0; +} + +export function runEvalPreflight(options = {}) { + const { autoRebuild = true, packageDir = packageRoot } = options; + let check = checkSqliteLoad(); + if (check.ok) return { ok: true }; + + const isAbiMismatch = /NODE_MODULE_VERSION/i.test(check.message ?? ''); + + if (autoRebuild && isAbiMismatch) { + const rebuilt = rebuildSqliteForNode(packageDir); + if (rebuilt) { + check = checkSqliteLoad(); + if (check.ok) { + console.log('better-sqlite3 ready for Node CLI eval.'); + return { ok: true }; + } + } + } + + return { + ok: false, + message: [ + 'Eval preflight failed: better-sqlite3 cannot load for the current Node runtime.', + check.message ?? '', + '', + 'The VS Code extension uses Electron (pnpm run rebuild:native).', + 'Headless CLI eval uses system Node (pnpm run rebuild:node).', + '', + 'Fix:', + ' pnpm run rebuild:node', + ' pnpm run compile:cli', + '', + 'If you need both extension F5 and CLI eval:', + ' pnpm run rebuild:all', + ].join('\n'), + }; +} + +if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) { + const result = runEvalPreflight({ autoRebuild: !process.argv.includes('--no-rebuild') }); + if (!result.ok) { + console.error(result.message); + process.exit(1); + } + console.log('Eval preflight OK'); +} diff --git a/tools/benchmark/scripts/reset-fixtures.mjs b/tools/benchmark/scripts/reset-fixtures.mjs new file mode 100644 index 00000000..e1102a6c --- /dev/null +++ b/tools/benchmark/scripts/reset-fixtures.mjs @@ -0,0 +1,29 @@ +#!/usr/bin/env node +/** + * Restore pinned benchmark fixtures after eval/benchmark runs. + * Reverts tracked source changes and removes agent-created untracked files. + */ +import { spawnSync } from 'child_process'; +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../..'); + +function run(command, args) { + const result = spawnSync(command, args, { cwd: packageRoot, stdio: 'inherit' }); + if (result.status !== 0) { + process.exit(result.status ?? 1); + } +} + +console.log('Restoring pinned fixture sources from git...'); +run('git', ['checkout', '--', 'tools/benchmark/fixtures/']); + +console.log('Removing agent-created untracked files under fixtures...'); +run('git', ['clean', '-fd', 'tools/benchmark/fixtures/']); + +console.log('Restoring eval test task manifests (if modified by vitest)...'); +run('git', ['checkout', '--', 'tools/benchmark/tasks/eval/generated-test/manifest.json']); +run('git', ['checkout', '--', 'tools/benchmark/tasks/eval/generated-test-full/manifest.json']); + +console.log('Fixture reset complete.'); diff --git a/tools/benchmark/scripts/run-eval.mjs b/tools/benchmark/scripts/run-eval.mjs new file mode 100644 index 00000000..8cdc4ba7 --- /dev/null +++ b/tools/benchmark/scripts/run-eval.mjs @@ -0,0 +1,310 @@ +#!/usr/bin/env node +/** + * External eval runner — parallel, sharded execution of 500–1000 tasks. + * Reuses tools/benchmark/verify.mjs; generated tasks live under tools/benchmark/tasks/eval. + */ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { spawn, spawnSync } from 'child_process'; +import { dirname, join, resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { verifyTask, summarizeVerifications } from '../verify.mjs'; +import { runEvalPreflight } from './preflight.mjs'; + +const benchmarkDir = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const packageRoot = resolve(benchmarkDir, '../..'); +const args = normalizeArgs(process.argv.slice(2)); + +const tasksPath = resolve(valueOf(args, '--tasks') ?? join(benchmarkDir, 'tasks/eval/generated/index.json')); +const outputPath = resolve(valueOf(args, '--output') ?? join(packageRoot, '.mitii/eval/report.json')); +const provider = valueOf(args, '--provider') ?? 'echo'; +const tier = valueOf(args, '--tier') ?? 'eval'; +const runtime = valueOf(args, '--runtime') ?? (provider === 'echo' ? 'stub' : 'real'); +const approval = valueOf(args, '--approval') ?? 'auto'; +const concurrency = Math.max(1, Number(valueOf(args, '--concurrency') ?? '4')); +const limit = valueOf(args, '--limit') ? Number(valueOf(args, '--limit')) : undefined; +const shardSpec = valueOf(args, '--shard'); // e.g. "1/4" = shard 1 of 4 +const timeoutMs = Number(valueOf(args, '--timeout-ms') ?? '120000'); +const enablePuppeteer = args.includes('--enable-puppeteer'); +const dryRun = args.includes('--dry-run'); +const ensureReady = args.includes('--ensure-ready') || (!args.includes('--no-ensure-ready') && runtime === 'real'); + +if (!existsSync(join(packageRoot, 'dist/cli.js'))) { + await compileCli(); +} + +if (ensureReady) { + ensureEvalTasks(tasksPath); +} + +if (runtime === 'real' && !dryRun) { + const preflight = runEvalPreflight({ autoRebuild: !args.includes('--no-rebuild') }); + if (!preflight.ok) { + console.error(preflight.message); + process.exit(1); + } +} + +const cliPath = join(packageRoot, 'dist/cli.js'); +const fixtureRoot = join(benchmarkDir, 'fixtures'); +const cwd = resolve(valueOf(args, '--cwd') ?? packageRoot); + +let selectedTasks = loadTasks(tasksPath, tier); +if (shardSpec) { + const [idx, total] = shardSpec.split('/').map(Number); + if (!idx || !total || idx < 1 || idx > total) { + console.error('Invalid --shard; use e.g. --shard 1/4'); + process.exit(1); + } + selectedTasks = selectedTasks.filter((_, i) => i % total === idx - 1); +} +if (limit !== undefined) selectedTasks = selectedTasks.slice(0, limit); + +if (dryRun) { + console.log(`Dry run: ${selectedTasks.length} tasks (concurrency ${concurrency}, runtime ${runtime})`); + process.exit(0); +} + +const startedAt = new Date().toISOString(); +const results = await runPool(selectedTasks, concurrency); +const passed = results.filter((r) => r.passed).length; + +const report = { + cwd, + packageRoot, + provider, + runtime, + tier, + shard: shardSpec ?? null, + concurrency, + startedAt, + finishedAt: new Date().toISOString(), + summary: { + total: results.length, + passed, + failed: results.length - passed, + score: results.length ? Math.round((passed / results.length) * 100) : 0, + avgDurationMs: results.length + ? Math.round(results.reduce((s, r) => s + r.durationMs, 0) / results.length) + : 0, + }, + categoryBreakdown: summarizeByCategory(results), + verificationSummary: summarizeVerifications(results), + results, +}; + +mkdirSync(dirname(outputPath), { recursive: true }); +writeFileSync(outputPath, `${JSON.stringify(report, null, 2)}\n`, 'utf8'); +writeFileSync(outputPath.replace(/\.json$/, '.md'), toMarkdown(report), 'utf8'); +console.log(`${passed}/${results.length} eval tasks passed (${report.summary.score}%)`); +printFailureHint(results, passed); +if (passed !== results.length) process.exitCode = 1; + +function loadTasks(indexPath, selectedTier) { + const index = JSON.parse(readFileSync(indexPath, 'utf8')); + const baseDir = dirname(indexPath); + const files = Array.isArray(index.includes) ? index.includes : [index.tasksFile ?? 'tasks.json']; + const all = files.flatMap((file) => { + const path = resolve(baseDir, file); + return JSON.parse(readFileSync(path, 'utf8')); + }); + return all.filter((task) => !task.tier || task.tier === selectedTier || selectedTier === 'all' || task.tier === 'eval'); +} + +async function runPool(tasks, poolSize) { + const results = new Array(tasks.length); + let next = 0; + + async function worker() { + while (next < tasks.length) { + const i = next++; + results[i] = await runTaskAsync(tasks[i]); + } + } + + await Promise.all(Array.from({ length: Math.min(poolSize, tasks.length) }, () => worker())); + return results; +} + +function runTaskAsync(task) { + return new Promise((resolvePromise) => { + const fixtureCwd = task.fixture ? join(fixtureRoot, task.fixture) : cwd; + const extraArgs = [ + '--cwd', fixtureCwd, + '--provider', provider, + '--runtime', task.runtime ?? runtime, + '--approval', approval, + ]; + if (enablePuppeteer || task.enablePuppeteer) extraArgs.push('--enable-puppeteer'); + if (task.model) extraArgs.push('--model', task.model); + if (valueOf(args, '--model')) extraArgs.push('--model', valueOf(args, '--model')); + if (valueOf(args, '--base-url')) extraArgs.push('--base-url', valueOf(args, '--base-url')); + + const cliArgs = [cliPath, task.mode, task.prompt, ...extraArgs]; + if (task.mode !== 'ask') cliArgs.push('--json'); + + const started = Date.now(); + const child = spawn('node', cliArgs, { cwd: packageRoot, env: process.env }); + let stdout = ''; + let stderr = ''; + let timedOut = false; + + const timer = setTimeout(() => { + timedOut = true; + child.kill('SIGTERM'); + }, timeoutMs); + + child.stdout?.on('data', (chunk) => { stdout += chunk; }); + child.stderr?.on('data', (chunk) => { stderr += chunk; }); + + child.on('close', (code) => { + clearTimeout(timer); + const durationMs = Date.now() - started; + const exitCode = timedOut ? 124 : (code ?? 1); + const verifications = (task.verify ?? []).map((rule) => verifyTask(rule, { + stdout, + stderr, + exitCode, + cwd: fixtureCwd, + packageRoot, + mode: task.mode, + })); + const passed = exitCode === 0 && verifications.every((v) => v.passed); + + resolvePromise({ + id: task.id, + category: task.category ?? 'general', + mode: task.mode, + fixture: task.fixture ?? null, + passed, + durationMs, + exitCode, + timedOut, + verifications, + stdout: stdout.slice(0, 4000), + stderr: stderr.slice(0, 2000), + }); + }); + }); +} + +function summarizeByCategory(results) { + const map = {}; + for (const r of results) { + const cat = r.category ?? 'unknown'; + if (!map[cat]) map[cat] = { passed: 0, total: 0 }; + map[cat].total += 1; + if (r.passed) map[cat].passed += 1; + } + for (const cat of Object.keys(map)) { + const { passed, total } = map[cat]; + map[cat].score = total ? Math.round((passed / total) * 100) : 0; + } + return map; +} + +function normalizeArgs(argv) { + return argv.filter((arg) => arg !== '--'); +} + +function valueOf(argv, name) { + const idx = argv.indexOf(name); + return idx >= 0 ? argv[idx + 1] : undefined; +} + +function printFailureHint(results, passed) { + if (passed > 0 || !results.length) return; + + const stderrSamples = results + .map((result) => result.stderr?.trim()) + .filter(Boolean); + if (!stderrSamples.length) return; + + const common = stderrSamples[0]; + const allSame = stderrSamples.every((sample) => sample === common); + if (!allSame) return; + + if (/NODE_MODULE_VERSION/i.test(common)) { + console.error(''); + console.error('All tasks failed before the agent could run.'); + console.error('better-sqlite3 is built for Electron, not your system Node.'); + console.error('Fix: pnpm run rebuild:node && pnpm run eval:preflight'); + console.error(''); + return; + } + + if (stderrSamples.length === results.length) { + console.error(''); + console.error('All tasks failed with the same error:'); + console.error(common.split('\n').slice(0, 6).join('\n')); + console.error(''); + } +} + +function toMarkdown(report) { + return [ + '# Mitii External Eval Report', + '', + `Provider: ${report.provider}`, + `Runtime: ${report.runtime}`, + `Score: ${report.summary.passed}/${report.summary.total} (${report.summary.score}%)`, + `Avg duration: ${report.summary.avgDurationMs} ms`, + '', + '## Category breakdown', + ...Object.entries(report.categoryBreakdown).map( + ([cat, v]) => `- ${cat}: ${v.passed}/${v.total} (${v.score}%)` + ), + '', + '| Task | Category | Mode | Result | Duration |', + '|---|---|---|---:|---:|', + ...report.results.map((r) => + `| ${r.id} | ${r.category} | ${r.mode} | ${r.passed ? 'pass' : 'fail'} | ${r.durationMs} ms |` + ), + '', + ].join('\n'); +} + +function compileCli() { + return new Promise((resolveCompile, reject) => { + const child = spawn(packageManager(), ['run', 'compile:cli'], { + cwd: packageRoot, + stdio: 'inherit', + shell: process.platform === 'win32', + }); + child.on('close', (code) => (code ? reject(new Error('compile:cli failed')) : resolveCompile())); + }); +} + +function ensureEvalTasks(indexPath) { + const manifestPath = join(dirname(indexPath), 'manifest.json'); + const minTasks = 100; + let needsGenerate = !existsSync(indexPath); + + if (!needsGenerate && existsSync(manifestPath)) { + try { + const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); + if (manifest.profile === 'smoke' || (manifest.actualCount ?? 0) < minTasks) { + needsGenerate = true; + console.log( + `Regenerating eval tasks (found ${manifest.actualCount ?? 0} ${manifest.profile ?? 'unknown'} tasks; need ≥${minTasks}).` + ); + } + } catch { + needsGenerate = true; + } + } + + if (!needsGenerate) return; + + const gen = spawnSync('node', [join(benchmarkDir, 'scripts/generate-tasks.mjs'), '--profile', 'standard'], { + cwd: packageRoot, + stdio: 'inherit', + }); + if (gen.status !== 0) { + console.error('Failed to generate standard eval tasks. Run: pnpm run eval:generate'); + process.exit(gen.status ?? 1); + } +} + +function packageManager() { + return process.env.MITII_PACKAGE_MANAGER ?? 'pnpm'; +} diff --git a/tools/benchmark/tasks/enterprise/agent.json b/tools/benchmark/tasks/enterprise/agent.json new file mode 100644 index 00000000..8b25385b --- /dev/null +++ b/tools/benchmark/tasks/enterprise/agent.json @@ -0,0 +1,48 @@ +[ + { + "id": "agent-node-fix-typo", + "tier": "agent", + "category": "node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Fix the bug in src/routes/users.js where the list endpoint returns the wrong status message. Apply the fix and explain verification.", + "verify": ["exit_0", "jsonl_event:end", "file_contains:src/routes/users.js:success"] + }, + { + "id": "agent-react-button-variant", + "tier": "agent", + "category": "react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Add a secondary variant to Button.tsx and use it in App.tsx. Provide a verification checklist.", + "verify": ["exit_0", "jsonl_event:end", "file_exists:src/App.tsx"] + }, + { + "id": "agent-nest-add-dto", + "tier": "agent", + "category": "nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Introduce a CreateUserDto and wire validation in AppController.", + "verify": ["exit_0", "jsonl_event:end", "file_exists:src/app.controller.ts"] + }, + { + "id": "agent-next-loading-ui", + "tier": "agent", + "category": "nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Add a loading.tsx for the home route and document how to verify it in dev.", + "verify": ["exit_0", "jsonl_event:end", "file_exists:app/page.tsx"] + }, + { + "id": "agent-browser-skill-available", + "tier": "agent", + "category": "browser", + "mode": "agent", + "fixture": "react-vite", + "enablePuppeteer": false, + "prompt": "List available Mitii skills for browser testing and when to use puppeteer MCP.", + "verify": ["exit_0", "jsonl_event:end", "skills_installed:10"] + } +] diff --git a/tools/benchmark/tasks/enterprise/ask.json b/tools/benchmark/tasks/enterprise/ask.json new file mode 100644 index 00000000..f18dea2d --- /dev/null +++ b/tools/benchmark/tasks/enterprise/ask.json @@ -0,0 +1,47 @@ +[ + { + "id": "ask-node-entry", + "tier": "ask", + "category": "node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain how requests flow through this Express app. Where is the users router mounted?", + "verify": ["exit_0", "stdout_not_empty", "file_exists:src/index.js"] + }, + { + "id": "ask-react-component", + "tier": "ask", + "category": "react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does the Button component render and what props does it accept?", + "verify": ["exit_0", "stdout_not_empty", "file_exists:src/components/Button.tsx"] + }, + { + "id": "ask-nest-module", + "tier": "ask", + "category": "nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe the NestJS module structure and where AppController is registered.", + "verify": ["exit_0", "stdout_not_empty", "file_exists:src/app.module.ts"] + }, + { + "id": "ask-next-page", + "tier": "ask", + "category": "nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What is rendered on the home page and how is the root layout structured?", + "verify": ["exit_0", "stdout_not_empty", "file_exists:app/page.tsx"] + }, + { + "id": "ask-retrieval-users-route", + "tier": "ask", + "category": "node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find the route handler for GET /users and summarize what it returns.", + "verify": ["exit_0", "stdout_not_empty", "file_contains:src/routes/users.js:router.get"] + } +] diff --git a/tools/benchmark/tasks/enterprise/index.json b/tools/benchmark/tasks/enterprise/index.json new file mode 100644 index 00000000..ad3da778 --- /dev/null +++ b/tools/benchmark/tasks/enterprise/index.json @@ -0,0 +1,10 @@ +{ + "includes": [ + "smoke.json", + "integration.json", + "ask.json", + "plan.json", + "agent.json", + "regression.json" + ] +} diff --git a/tools/benchmark/tasks/enterprise/integration.json b/tools/benchmark/tasks/enterprise/integration.json new file mode 100644 index 00000000..bf23045e --- /dev/null +++ b/tools/benchmark/tasks/enterprise/integration.json @@ -0,0 +1,12 @@ +[ + { + "id": "integration-real-ask-node", + "tier": "integration", + "category": "ask", + "mode": "ask", + "fixture": "node-express", + "runtime": "real", + "prompt": "Where is the Express app created and what port does it listen on?", + "verify": ["exit_0", "stdout_not_empty", "skills_installed:10"] + } +] diff --git a/tools/benchmark/tasks/enterprise/plan.json b/tools/benchmark/tasks/enterprise/plan.json new file mode 100644 index 00000000..0fb0f8fa --- /dev/null +++ b/tools/benchmark/tasks/enterprise/plan.json @@ -0,0 +1,38 @@ +[ + { + "id": "plan-react-test-coverage", + "tier": "plan", + "category": "react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan adding unit tests for the Button component and updating package.json scripts.", + "verify": ["exit_0", "json_path:steps", "file_exists:package.json"] + }, + { + "id": "plan-nest-health-endpoint", + "tier": "plan", + "category": "nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan adding a /health endpoint with controller, service, and e2e test.", + "verify": ["exit_0", "json_path:steps", "file_exists:src/main.ts"] + }, + { + "id": "plan-next-seo-metadata", + "tier": "plan", + "category": "nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan improving SEO metadata in app/layout.tsx and documenting verification steps.", + "verify": ["exit_0", "json_path:steps", "file_exists:app/layout.tsx"] + }, + { + "id": "plan-node-error-middleware", + "tier": "plan", + "category": "node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan adding centralized error middleware and updating the users route tests.", + "verify": ["exit_0", "json_path:steps", "file_contains:src/index.js:express"] + } +] diff --git a/tools/benchmark/tasks/enterprise/regression.json b/tools/benchmark/tasks/enterprise/regression.json new file mode 100644 index 00000000..a93d1a70 --- /dev/null +++ b/tools/benchmark/tasks/enterprise/regression.json @@ -0,0 +1,74 @@ +[ + { + "id": "regression-verify-command-discovery", + "tier": "regression", + "category": "verify", + "mode": "ask", + "fixture": "node-express", + "prompt": "What npm scripts exist in this project for test and lint verification?", + "verify": ["exit_0", "stdout_not_empty", "file_contains:package.json:test"] + }, + { + "id": "regression-skill-routing-plan", + "tier": "regression", + "category": "skills", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan a test-driven development pass to add tests for the Button component.", + "verify": ["exit_0", "json_path:steps", "skills_installed:10"] + }, + { + "id": "regression-empty-response-handling", + "tier": "regression", + "category": "orchestrator", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize AppModule providers without making anything up.", + "verify": ["exit_0", "stdout_not_empty"] + }, + { + "id": "regression-phase-lock-guidance", + "tier": "regression", + "category": "agent-loop", + "mode": "agent", + "fixture": "node-express", + "prompt": "Review src/index.js and propose safe read-only inspection steps before any edits.", + "verify": ["exit_0", "jsonl_event:end"] + }, + { + "id": "regression-act-mcp-exclusion-note", + "tier": "regression", + "category": "mcp", + "mode": "agent", + "fixture": "next-app", + "prompt": "Explain which tools should be used for file edits in Agent mode vs MCP filesystem tools.", + "verify": ["exit_0", "jsonl_event:end"] + }, + { + "id": "regression-windows-path-safe", + "tier": "regression", + "category": "paths", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List source files under src/ using workspace-relative paths.", + "verify": ["exit_0", "stdout_not_empty", "dir_has_files:src"] + }, + { + "id": "regression-microtask-commit-msg-hint", + "tier": "regression", + "category": "microtasks", + "mode": "ask", + "fixture": "node-express", + "prompt": "Need commit message for staged changes in src/routes/users.js", + "verify": ["exit_0", "stdout_not_empty"] + }, + { + "id": "regression-sequential-thinking-cap", + "tier": "regression", + "category": "mcp", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan debugging steps for a failing health check endpoint using structured reasoning.", + "verify": ["exit_0", "json_path:steps"] + } +] diff --git a/tools/benchmark/tasks/enterprise/smoke.json b/tools/benchmark/tasks/enterprise/smoke.json new file mode 100644 index 00000000..b8c31e36 --- /dev/null +++ b/tools/benchmark/tasks/enterprise/smoke.json @@ -0,0 +1,26 @@ +[ + { + "id": "smoke-ask-echo", + "tier": "smoke", + "category": "infrastructure", + "mode": "ask", + "prompt": "Summarize the project structure and identify the main entry point.", + "verify": ["exit_0", "stdout_contains:Echo:"] + }, + { + "id": "smoke-plan-echo", + "tier": "smoke", + "category": "infrastructure", + "mode": "plan", + "prompt": "Plan a release hygiene pass covering changelog, README, and tests.", + "verify": ["exit_0", "json_path:steps"] + }, + { + "id": "smoke-agent-echo", + "tier": "smoke", + "category": "infrastructure", + "mode": "agent", + "prompt": "Review the working tree and produce implementation guidance.", + "verify": ["exit_0", "jsonl_event:end"] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/index.json b/tools/benchmark/tasks/eval/generated-test-full/index.json new file mode 100644 index 00000000..f630f438 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/index.json @@ -0,0 +1,14 @@ +{ + "includes": [ + "shard-000.json", + "shard-001.json", + "shard-002.json", + "shard-003.json", + "shard-004.json", + "shard-005.json", + "shard-006.json", + "shard-007.json", + "shard-008.json", + "shard-009.json" + ] +} diff --git a/tools/benchmark/tasks/eval/generated-test-full/manifest.json b/tools/benchmark/tasks/eval/generated-test-full/manifest.json new file mode 100644 index 00000000..914e8f65 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/manifest.json @@ -0,0 +1,57 @@ +{ + "generatedAt": "2026-07-03T21:02:42.298Z", + "profile": "full", + "targetCount": 1000, + "actualCount": 1000, + "shardSize": 100, + "shards": [ + "shard-000.json", + "shard-001.json", + "shard-002.json", + "shard-003.json", + "shard-004.json", + "shard-005.json", + "shard-006.json", + "shard-007.json", + "shard-008.json", + "shard-009.json" + ], + "categories": { + "browser": 1, + "nestjs": 3, + "nextjs": 3, + "node": 4, + "react": 3, + "ask": 1, + "mcp": 2, + "orchestrator": 1, + "microtasks": 1, + "agent-loop": 1, + "skills": 1, + "verify": 1, + "paths": 1, + "infrastructure": 3, + "fixture-agent-nestjs": 15, + "fixture-agent-nextjs": 15, + "fixture-agent-node": 16, + "fixture-agent-react": 15, + "fixture-ask-nestjs": 64, + "fixture-ask-nextjs": 49, + "fixture-ask-node": 49, + "fixture-ask-react": 49, + "coding-js": 210, + "gaia": 130, + "fixture-plan-nestjs": 20, + "fixture-plan-nextjs": 20, + "fixture-plan-node": 20, + "fixture-plan-react": 20, + "reasoning": 90, + "retrieval-nestjs": 15, + "retrieval-nextjs": 15, + "retrieval-node": 15, + "retrieval-react": 15, + "tool-calling": 132 + }, + "outputDir": "/Users/karthikshinde/Applications/ai-agent/mitii/mitii-ai-agent/tools/benchmark/tasks/eval/generated-test-full", + "note": "External eval tasks — not packaged in VSIX extension" +} diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-000.json b/tools/benchmark/tasks/eval/generated-test-full/shard-000.json new file mode 100644 index 00000000..2a0d2a2f --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-000.json @@ -0,0 +1,1263 @@ +[ + { + "id": "base-agent-browser-skill-available", + "tier": "eval", + "category": "browser", + "mode": "agent", + "fixture": "react-vite", + "enablePuppeteer": false, + "prompt": "List available Mitii skills for browser testing and when to use puppeteer MCP.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:10" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-nest-add-dto", + "tier": "eval", + "category": "nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Introduce a CreateUserDto and wire validation in AppController.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_exists:src/app.controller.ts" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-next-loading-ui", + "tier": "eval", + "category": "nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Add a loading.tsx for the home route and document how to verify it in dev.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_exists:app/page.tsx" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-node-fix-typo", + "tier": "eval", + "category": "node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Fix the bug in src/routes/users.js where the list endpoint returns the wrong status message. Apply the fix and explain verification.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_contains:src/routes/users.js:success" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-react-button-variant", + "tier": "eval", + "category": "react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Add a secondary variant to Button.tsx and use it in App.tsx. Provide a verification checklist.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_exists:src/App.tsx" + ], + "sourceTier": "agent" + }, + { + "id": "base-ask-nest-module", + "tier": "eval", + "category": "nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe the NestJS module structure and where AppController is registered.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-next-page", + "tier": "eval", + "category": "nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What is rendered on the home page and how is the root layout structured?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-node-entry", + "tier": "eval", + "category": "node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain how requests flow through this Express app. Where is the users router mounted?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-react-component", + "tier": "eval", + "category": "react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does the Button component render and what props does it accept?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-retrieval-users-route", + "tier": "eval", + "category": "node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find the route handler for GET /users and summarize what it returns.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_contains:src/routes/users.js:router.get" + ], + "sourceTier": "ask" + }, + { + "id": "base-integration-real-ask-node", + "tier": "eval", + "category": "ask", + "mode": "ask", + "fixture": "node-express", + "runtime": "real", + "prompt": "Where is the Express app created and what port does it listen on?", + "verify": [ + "exit_0", + "stdout_not_empty", + "skills_installed:10" + ], + "sourceTier": "integration" + }, + { + "id": "base-plan-nest-health-endpoint", + "tier": "eval", + "category": "nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan adding a /health endpoint with controller, service, and e2e test.", + "verify": [ + "exit_0", + "json_path:steps", + "file_exists:src/main.ts" + ], + "sourceTier": "plan" + }, + { + "id": "base-plan-next-seo-metadata", + "tier": "eval", + "category": "nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan improving SEO metadata in app/layout.tsx and documenting verification steps.", + "verify": [ + "exit_0", + "json_path:steps", + "file_exists:app/layout.tsx" + ], + "sourceTier": "plan" + }, + { + "id": "base-plan-node-error-middleware", + "tier": "eval", + "category": "node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan adding centralized error middleware and updating the users route tests.", + "verify": [ + "exit_0", + "json_path:steps", + "file_contains:src/index.js:express" + ], + "sourceTier": "plan" + }, + { + "id": "base-plan-react-test-coverage", + "tier": "eval", + "category": "react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan adding unit tests for the Button component and updating package.json scripts.", + "verify": [ + "exit_0", + "json_path:steps", + "file_exists:package.json" + ], + "sourceTier": "plan" + }, + { + "id": "base-regression-act-mcp-exclusion-note", + "tier": "eval", + "category": "mcp", + "mode": "agent", + "fixture": "next-app", + "prompt": "Explain which tools should be used for file edits in Agent mode vs MCP filesystem tools.", + "verify": [ + "exit_0", + "jsonl_event:end" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-empty-response-handling", + "tier": "eval", + "category": "orchestrator", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize AppModule providers without making anything up.", + "verify": [ + "exit_0", + "stdout_not_empty" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-microtask-commit-msg-hint", + "tier": "eval", + "category": "microtasks", + "mode": "ask", + "fixture": "node-express", + "prompt": "Need commit message for staged changes in src/routes/users.js", + "verify": [ + "exit_0", + "stdout_not_empty" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-phase-lock-guidance", + "tier": "eval", + "category": "agent-loop", + "mode": "agent", + "fixture": "node-express", + "prompt": "Review src/index.js and propose safe read-only inspection steps before any edits.", + "verify": [ + "exit_0", + "jsonl_event:end" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-sequential-thinking-cap", + "tier": "eval", + "category": "mcp", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan debugging steps for a failing health check endpoint using structured reasoning.", + "verify": [ + "exit_0", + "json_path:steps" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-skill-routing-plan", + "tier": "eval", + "category": "skills", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan a test-driven development pass to add tests for the Button component.", + "verify": [ + "exit_0", + "json_path:steps", + "skills_installed:10" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-verify-command-discovery", + "tier": "eval", + "category": "verify", + "mode": "ask", + "fixture": "node-express", + "prompt": "What npm scripts exist in this project for test and lint verification?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_contains:package.json:test" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-windows-path-safe", + "tier": "eval", + "category": "paths", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List source files under src/ using workspace-relative paths.", + "verify": [ + "exit_0", + "stdout_not_empty", + "dir_has_files:src" + ], + "sourceTier": "regression" + }, + { + "id": "base-smoke-agent-echo", + "tier": "eval", + "category": "infrastructure", + "mode": "agent", + "prompt": "Review the working tree and produce implementation guidance.", + "verify": [ + "exit_0", + "jsonl_event:end" + ], + "sourceTier": "smoke" + }, + { + "id": "base-smoke-ask-echo", + "tier": "eval", + "category": "infrastructure", + "mode": "ask", + "prompt": "Summarize the project structure and identify the main entry point.", + "verify": [ + "exit_0", + "stdout_contains:Echo:" + ], + "sourceTier": "smoke" + }, + { + "id": "base-smoke-plan-echo", + "tier": "eval", + "category": "infrastructure", + "mode": "plan", + "prompt": "Plan a release hygiene pass covering changelog, README, and tests.", + "verify": [ + "exit_0", + "json_path:steps" + ], + "sourceTier": "smoke" + }, + { + "id": "eval-agent-nest-api-a0", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a1", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a10", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a11", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a12", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a13", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a14", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a2", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a3", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a4", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a5", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a6", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a7", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-nest-api-a8", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a9", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a0", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a1", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a10", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a11", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a12", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a13", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a14", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a2", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a3", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a4", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a5", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a6", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a7", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-next-app-a8", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a9", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a0", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a1", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a10", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a11", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a12", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a13", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a14", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a2", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a3", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a4", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a5", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a6", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a7", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-node-express-a8", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a9", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-fix-users", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Fix the bug in src/routes/users.js where GET /users returns the wrong status message. Apply the fix.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_contains:src/routes/users.js:success" + ] + }, + { + "id": "eval-agent-react-vite-a0", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a1", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a10", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a11", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a12", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a13", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a14", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a2", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a3", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a4", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a5", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a6", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a7", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-react-vite-a8", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a9", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/app.controller.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/app.controller.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/app.controller.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/app.controller.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/app.controller.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/app.controller.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/app.controller.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/app.controller.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/app.controller.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/app.controller.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-001.json b/tools/benchmark/tasks/eval/generated-test-full/shard-001.json new file mode 100644 index 00000000..335c45fd --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-001.json @@ -0,0 +1,1294 @@ +[ + { + "id": "eval-ask-nest-api-src-app-controller-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/app.controller.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/app.controller.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/app.module.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/app.module.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/app.module.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/app.module.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/app.module.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/app.module.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/app.module.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/app.module.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/app.module.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/app.module.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/app.module.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/app.module.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/app.service.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/app.service.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/app.service.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/app.service.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/app.service.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/app.service.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/app.service.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/app.service.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/app.service.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/app.service.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/app.service.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/app.service.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/main.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/main.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/main.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/main.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/main.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/main.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/main.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/main.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/main.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/main.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/main.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/main.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-symbol-appcontroller", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"AppController\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-nest-api-symbol-appmodule", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"AppModule\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-nest-api-symbol-injectable", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"Injectable\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-nest-api-symbol-nestfactory", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"NestFactory\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t0", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Explain the purpose of app/layout.tsx in this Next.js App Router project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t1", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What does app/layout.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t10", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How is app/layout.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t11", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What configuration in package.json affects app/layout.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t12", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Give an architecture overview of this Next.js App Router codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t13", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t14", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t2", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How does app/layout.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t3", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "List the key functions, classes, or routes defined in app/layout.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t4", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What dependencies or imports does app/layout.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t5", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Describe error handling patterns visible in or around app/layout.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t6", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What would you inspect first in app/layout.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t7", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Summarize the public API surface exposed via app/layout.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t8", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which tests (if any) cover behavior related to app/layout.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t9", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What refactoring opportunities exist in app/layout.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t0", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Explain the purpose of app/page.tsx in this Next.js App Router project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t1", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What does app/page.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t10", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How is app/page.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t11", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What configuration in package.json affects app/page.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t12", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Give an architecture overview of this Next.js App Router codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t13", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t14", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t2", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How does app/page.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t3", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "List the key functions, classes, or routes defined in app/page.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t4", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What dependencies or imports does app/page.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t5", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Describe error handling patterns visible in or around app/page.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t6", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What would you inspect first in app/page.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t7", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Summarize the public API surface exposed via app/page.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t8", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which tests (if any) cover behavior related to app/page.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t9", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What refactoring opportunities exist in app/page.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-package-json-t0", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Explain the purpose of package.json in this Next.js App Router project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t1", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What does package.json export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t10", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How is package.json referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t11", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What configuration in package.json affects package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t12", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Give an architecture overview of this Next.js App Router codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t13", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t14", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t2", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How does package.json connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t3", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "List the key functions, classes, or routes defined in package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t4", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What dependencies or imports does package.json use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t5", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Describe error handling patterns visible in or around package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t6", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What would you inspect first in package.json when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t7", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Summarize the public API surface exposed via package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t8", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which tests (if any) cover behavior related to package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t9", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What refactoring opportunities exist in package.json? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-symbol-layout", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"layout\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-symbol-metadata", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"metadata\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-symbol-next-js", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"Next.js\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-symbol-page", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"page\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-002.json b/tools/benchmark/tasks/eval/generated-test-full/shard-002.json new file mode 100644 index 00000000..739f610b --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-002.json @@ -0,0 +1,1290 @@ +[ + { + "id": "eval-ask-node-express-package-json-t0", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain the purpose of package.json in this Express project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t1", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What does package.json export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t10", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How is package.json referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t11", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What configuration in package.json affects package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t12", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Give an architecture overview of this Express codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t13", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t14", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t2", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How does package.json connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t3", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "List the key functions, classes, or routes defined in package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t4", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What dependencies or imports does package.json use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t5", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Describe error handling patterns visible in or around package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t6", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What would you inspect first in package.json when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t7", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Summarize the public API surface exposed via package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t8", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which tests (if any) cover behavior related to package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t9", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What refactoring opportunities exist in package.json? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t0", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain the purpose of src/index.js in this Express project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t1", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What does src/index.js export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t10", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How is src/index.js referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t11", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What configuration in package.json affects src/index.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t12", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Give an architecture overview of this Express codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t13", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t14", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t2", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How does src/index.js connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t3", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "List the key functions, classes, or routes defined in src/index.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t4", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What dependencies or imports does src/index.js use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t5", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Describe error handling patterns visible in or around src/index.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t6", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What would you inspect first in src/index.js when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t7", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Summarize the public API surface exposed via src/index.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t8", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which tests (if any) cover behavior related to src/index.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t9", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What refactoring opportunities exist in src/index.js? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t0", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain the purpose of src/routes/users.js in this Express project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t1", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What does src/routes/users.js export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t10", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How is src/routes/users.js referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t11", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What configuration in package.json affects src/routes/users.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t12", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Give an architecture overview of this Express codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t13", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t14", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t2", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How does src/routes/users.js connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t3", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "List the key functions, classes, or routes defined in src/routes/users.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t4", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What dependencies or imports does src/routes/users.js use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t5", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Describe error handling patterns visible in or around src/routes/users.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t6", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What would you inspect first in src/routes/users.js when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t7", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Summarize the public API surface exposed via src/routes/users.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t8", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which tests (if any) cover behavior related to src/routes/users.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t9", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What refactoring opportunities exist in src/routes/users.js? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-symbol-express", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"express\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-node-express-symbol-get-users", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"GET /users\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-node-express-symbol-router", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"router\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-node-express-symbol-users", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"users\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t0", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Explain the purpose of package.json in this React + Vite project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t1", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does package.json export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t10", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How is package.json referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t11", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What configuration in package.json affects package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t12", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Give an architecture overview of this React + Vite codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t13", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t14", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t2", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How does package.json connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t3", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List the key functions, classes, or routes defined in package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t4", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What dependencies or imports does package.json use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t5", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Describe error handling patterns visible in or around package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t6", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What would you inspect first in package.json when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t7", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Summarize the public API surface exposed via package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t8", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which tests (if any) cover behavior related to package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t9", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What refactoring opportunities exist in package.json? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t0", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Explain the purpose of src/App.tsx in this React + Vite project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t1", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does src/App.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t10", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How is src/App.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t11", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What configuration in package.json affects src/App.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t12", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Give an architecture overview of this React + Vite codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t13", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t14", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t2", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How does src/App.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t3", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List the key functions, classes, or routes defined in src/App.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t4", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What dependencies or imports does src/App.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t5", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Describe error handling patterns visible in or around src/App.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t6", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What would you inspect first in src/App.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t7", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Summarize the public API surface exposed via src/App.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t8", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which tests (if any) cover behavior related to src/App.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t9", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What refactoring opportunities exist in src/App.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t0", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Explain the purpose of src/components/Button.tsx in this React + Vite project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t1", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does src/components/Button.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t10", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How is src/components/Button.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t11", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What configuration in package.json affects src/components/Button.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t12", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Give an architecture overview of this React + Vite codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t13", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t14", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t2", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How does src/components/Button.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t3", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List the key functions, classes, or routes defined in src/components/Button.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t4", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What dependencies or imports does src/components/Button.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t5", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Describe error handling patterns visible in or around src/components/Button.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t6", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What would you inspect first in src/components/Button.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t7", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Summarize the public API surface exposed via src/components/Button.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t8", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which tests (if any) cover behavior related to src/components/Button.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t9", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What refactoring opportunities exist in src/components/Button.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-symbol-button", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"Button\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-symbol-props", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"props\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-symbol-react", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"React\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-symbol-variant", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"variant\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #1 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-10", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #10 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-003.json b/tools/benchmark/tasks/eval/generated-test-full/shard-003.json new file mode 100644 index 00000000..6e6acf8a --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-003.json @@ -0,0 +1,1102 @@ +[ + { + "id": "eval-coding-algo-100", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #100 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-101", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #101 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-102", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #102 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-103", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #103 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-104", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #104 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-105", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #105 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-106", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #106 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-107", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #107 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-108", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #108 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-109", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #109 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-11", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #11 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-110", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #110 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-12", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #12 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-13", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #13 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-14", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #14 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-15", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #15 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-16", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #16 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-17", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #17 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-18", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #18 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-19", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #19 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #2 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-20", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #20 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-21", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #21 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-22", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #22 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-23", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #23 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-24", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #24 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-25", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #25 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-26", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #26 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-27", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #27 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-28", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #28 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-29", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #29 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #3 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-30", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #30 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-31", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #31 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-32", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #32 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-33", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #33 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-34", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #34 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-35", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #35 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-36", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #36 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-37", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #37 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-38", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #38 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-39", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #39 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #4 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-40", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #40 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-41", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #41 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-42", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #42 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-43", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #43 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-44", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #44 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-45", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #45 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-46", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #46 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-47", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #47 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-48", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #48 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-49", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #49 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-5", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #5 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-50", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #50 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-51", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #51 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-52", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #52 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-53", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #53 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-54", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #54 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-55", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #55 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-56", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #56 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-57", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #57 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-58", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #58 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-59", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #59 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-6", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #6 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-60", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #60 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-61", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #61 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-62", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #62 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-63", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #63 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-64", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #64 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-65", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #65 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-66", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #66 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-67", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #67 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-68", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #68 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-69", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #69 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-7", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #7 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-70", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #70 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-71", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #71 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-72", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #72 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-73", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #73 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-74", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #74 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-75", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #75 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-76", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #76 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-77", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #77 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-78", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #78 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-79", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #79 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-8", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #8 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-80", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #80 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-81", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #81 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-82", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #82 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-83", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #83 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-84", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #84 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-85", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #85 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-86", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #86 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-87", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #87 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-88", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #88 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-89", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #89 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-9", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #9 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-90", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #90 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-91", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #91 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-004.json b/tools/benchmark/tasks/eval/generated-test-full/shard-004.json new file mode 100644 index 00000000..b4b2e60f --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-004.json @@ -0,0 +1,1194 @@ +[ + { + "id": "eval-coding-algo-92", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #92 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-93", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #93 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-94", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #94 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-95", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #95 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-96", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #96 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-97", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #97 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-98", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #98 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-99", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #99 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-anagram-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-binary-search-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-curry-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-debounce-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-deep-clone-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-event-emitter-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-fibonacci-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fizzbuzz-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-flatten-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-json-parse-safe-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-lru-cache-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-max-subarray-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-memoize-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-merge-sorted-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-palindrome-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-promise-all-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-reverse-string-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-throttle-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-two-sum-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement twoSum(nums, target) returning indices. Explain approach briefly.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:map" + ] + }, + { + "id": "eval-coding-two-sum-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement twoSum(nums, target) returning indices. Explain approach briefly. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:map" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-005.json b/tools/benchmark/tasks/eval/generated-test-full/shard-005.json new file mode 100644 index 00000000..71bf83b7 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-005.json @@ -0,0 +1,1150 @@ +[ + { + "id": "eval-coding-two-sum-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement twoSum(nums, target) returning indices. Explain approach briefly. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:map" + ] + }, + { + "id": "eval-coding-two-sum-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement twoSum(nums, target) returning indices. Explain approach briefly. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:map" + ] + }, + { + "id": "eval-coding-two-sum-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement twoSum(nums, target) returning indices. Explain approach briefly. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:map" + ] + }, + { + "id": "eval-coding-valid-parens-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write isValid(s) for bracket matching. What edge cases matter?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:stack" + ] + }, + { + "id": "eval-coding-valid-parens-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write isValid(s) for bracket matching. What edge cases matter? Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:stack" + ] + }, + { + "id": "eval-coding-valid-parens-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write isValid(s) for bracket matching. What edge cases matter? Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:stack" + ] + }, + { + "id": "eval-coding-valid-parens-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write isValid(s) for bracket matching. What edge cases matter? Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:stack" + ] + }, + { + "id": "eval-coding-valid-parens-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write isValid(s) for bracket matching. What edge cases matter? Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:stack" + ] + }, + { + "id": "eval-gaia-fact-0-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is the capital of France? Answer with one word.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Paris" + ] + }, + { + "id": "eval-gaia-fact-0-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is the capital of France? Answer with one word.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Paris" + ] + }, + { + "id": "eval-gaia-fact-0-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is the capital of France? Answer with one word.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Paris" + ] + }, + { + "id": "eval-gaia-fact-0-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is the capital of France? Answer with one word.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Paris" + ] + }, + { + "id": "eval-gaia-fact-1-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "How many days are in a leap year? Answer with a number only.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:366" + ] + }, + { + "id": "eval-gaia-fact-1-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "How many days are in a leap year? Answer with a number only.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:366" + ] + }, + { + "id": "eval-gaia-fact-1-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "How many days are in a leap year? Answer with a number only.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:366" + ] + }, + { + "id": "eval-gaia-fact-1-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "How many days are in a leap year? Answer with a number only.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:366" + ] + }, + { + "id": "eval-gaia-fact-2-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What year did the first Node.js release occur? Answer with the year.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:2009" + ] + }, + { + "id": "eval-gaia-fact-2-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What year did the first Node.js release occur? Answer with the year.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:2009" + ] + }, + { + "id": "eval-gaia-fact-2-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What year did the first Node.js release occur? Answer with the year.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:2009" + ] + }, + { + "id": "eval-gaia-fact-2-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What year did the first Node.js release occur? Answer with the year.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:2009" + ] + }, + { + "id": "eval-gaia-fact-3-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What does HTTP stand for? Give the expansion.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Hypertext" + ] + }, + { + "id": "eval-gaia-fact-3-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What does HTTP stand for? Give the expansion.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Hypertext" + ] + }, + { + "id": "eval-gaia-fact-3-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What does HTTP stand for? Give the expansion.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Hypertext" + ] + }, + { + "id": "eval-gaia-fact-3-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What does HTTP stand for? Give the expansion.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Hypertext" + ] + }, + { + "id": "eval-gaia-fact-4-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is 17 * 23? Show the result.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:391" + ] + }, + { + "id": "eval-gaia-fact-4-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is 17 * 23? Show the result.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:391" + ] + }, + { + "id": "eval-gaia-fact-4-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is 17 * 23? Show the result.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:391" + ] + }, + { + "id": "eval-gaia-fact-4-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is 17 * 23? Show the result.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:391" + ] + }, + { + "id": "eval-gaia-fact-5-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Name the default package manager for Node.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:npm" + ] + }, + { + "id": "eval-gaia-fact-5-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Name the default package manager for Node.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:npm" + ] + }, + { + "id": "eval-gaia-fact-5-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Name the default package manager for Node.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:npm" + ] + }, + { + "id": "eval-gaia-fact-5-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Name the default package manager for Node.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:npm" + ] + }, + { + "id": "eval-gaia-fact-6-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What file extension does TypeScript use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:ts" + ] + }, + { + "id": "eval-gaia-fact-6-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What file extension does TypeScript use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:ts" + ] + }, + { + "id": "eval-gaia-fact-6-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What file extension does TypeScript use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:ts" + ] + }, + { + "id": "eval-gaia-fact-6-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What file extension does TypeScript use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:ts" + ] + }, + { + "id": "eval-gaia-fact-7-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What command lists git commits?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:git log" + ] + }, + { + "id": "eval-gaia-fact-7-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What command lists git commits?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:git log" + ] + }, + { + "id": "eval-gaia-fact-7-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What command lists git commits?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:git log" + ] + }, + { + "id": "eval-gaia-fact-7-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What command lists git commits?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:git log" + ] + }, + { + "id": "eval-gaia-fact-8-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What port does Ollama default API use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:11434" + ] + }, + { + "id": "eval-gaia-fact-8-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What port does Ollama default API use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:11434" + ] + }, + { + "id": "eval-gaia-fact-8-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What port does Ollama default API use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:11434" + ] + }, + { + "id": "eval-gaia-fact-8-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What port does Ollama default API use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:11434" + ] + }, + { + "id": "eval-gaia-fact-9-v0", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is JSON short for?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JavaScript" + ] + }, + { + "id": "eval-gaia-fact-9-v1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is JSON short for?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JavaScript" + ] + }, + { + "id": "eval-gaia-fact-9-v2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is JSON short for?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JavaScript" + ] + }, + { + "id": "eval-gaia-fact-9-v3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "What is JSON short for?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JavaScript" + ] + }, + { + "id": "eval-gaia-multistep-0-v0", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 1)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-0-v1", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 2)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-0-v2", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 3)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-0-v3", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 4)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-0-v4", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 5)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-0-v5", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 6)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-0-v6", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 7)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-0-v7", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Find package.json in a Node project and explain how to run tests — describe steps without executing. (variant 8)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v0", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 1)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v1", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 2)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v2", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 3)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v3", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 4)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v4", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 5)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v5", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 6)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v6", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 7)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-1-v7", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Outline how to verify a React component renders using browser devtools. (variant 8)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v0", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 1)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v1", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 2)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v2", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 3)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v3", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 4)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v4", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 5)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v5", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 6)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v6", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 7)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-2-v7", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Describe how to add a health endpoint to an Express app and verify with curl. (variant 8)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v0", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 1)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v1", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 2)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v2", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 3)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v3", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 4)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v4", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 5)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v5", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 6)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v6", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 7)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-3-v7", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Plan reading CHANGELOG, package.json, and src/ to assess release readiness. (variant 8)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v0", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 1)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v1", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 2)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v2", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 3)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v3", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 4)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v4", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 5)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v5", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 6)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v6", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 7)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-multistep-4-v7", + "tier": "eval", + "category": "gaia", + "mode": "plan", + "prompt": "Explain how to use session logs in .mitii/logs for debugging agent runs. (variant 8)", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-gaia-research-1", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #1: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-10", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #10: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-11", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #11: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-12", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #12: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-13", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #13: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-14", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #14: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-15", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #15: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-16", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #16: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-17", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #17: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-18", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #18: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-19", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #19: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-2", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #2: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-006.json b/tools/benchmark/tasks/eval/generated-test-full/shard-006.json new file mode 100644 index 00000000..a0b2cde5 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-006.json @@ -0,0 +1,1164 @@ +[ + { + "id": "eval-gaia-research-20", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #20: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-21", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #21: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-22", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #22: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-23", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #23: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-24", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #24: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-25", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #25: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-26", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #26: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-27", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #27: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-28", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #28: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-29", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #29: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-3", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #3: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-30", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #30: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-31", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #31: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-32", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #32: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-33", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #33: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-34", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #34: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-35", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #35: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-36", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #36: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-37", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #37: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-38", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #38: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-39", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #39: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-4", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #4: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-40", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #40: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-41", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #41: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-42", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #42: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-43", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #43: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-44", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #44: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-45", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #45: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-46", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #46: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-47", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #47: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-48", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #48: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-49", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #49: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-5", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #5: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-50", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #50: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-6", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #6: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-7", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #7: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-8", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #8: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-gaia-research-9", + "tier": "eval", + "category": "gaia", + "mode": "ask", + "prompt": "Research-style question #9: Compare two strategies for eval harness design (subprocess CLI vs in-process host).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-plan-nest-api-s0", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add comprehensive unit tests for the main module in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s1", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Introduce structured logging across the application in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s10", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add rate limiting for public routes in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s11", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan accessibility improvements for UI components in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s12", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add integration tests with a test database or mock server in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s13", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan dependency audit and security hardening in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s14", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add observability: metrics and tracing hooks in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s15", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan refactoring to reduce coupling between modules in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s16", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add caching layer for frequently accessed data in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s17", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan feature flags for gradual rollout in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s18", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add database migration strategy (if applicable) in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s19", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan dark mode support for the UI in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s2", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add input validation for all public endpoints or components in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s3", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan a migration from JavaScript to TypeScript incrementally in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s4", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add health check and readiness endpoints in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s5", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Improve error messages for API consumers in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s6", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add API documentation generation (OpenAPI or similar) in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s7", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan performance profiling for hot paths in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s8", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Add environment-based configuration with validation in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-nest-api-s9", + "tier": "eval", + "category": "fixture-plan-nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan CI pipeline steps: lint, test, build in this NestJS project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s0", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add comprehensive unit tests for the main module in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s1", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Introduce structured logging across the application in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s10", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add rate limiting for public routes in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s11", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan accessibility improvements for UI components in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s12", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add integration tests with a test database or mock server in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s13", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan dependency audit and security hardening in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s14", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add observability: metrics and tracing hooks in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s15", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan refactoring to reduce coupling between modules in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s16", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add caching layer for frequently accessed data in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s17", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan feature flags for gradual rollout in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s18", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add database migration strategy (if applicable) in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s19", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan dark mode support for the UI in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s2", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add input validation for all public endpoints or components in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s3", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan a migration from JavaScript to TypeScript incrementally in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s4", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add health check and readiness endpoints in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s5", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Improve error messages for API consumers in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s6", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add API documentation generation (OpenAPI or similar) in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s7", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan performance profiling for hot paths in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s8", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Add environment-based configuration with validation in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-next-app-s9", + "tier": "eval", + "category": "fixture-plan-nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan CI pipeline steps: lint, test, build in this Next.js App Router project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s0", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add comprehensive unit tests for the main module in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s1", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Introduce structured logging across the application in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s10", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add rate limiting for public routes in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s11", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan accessibility improvements for UI components in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s12", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add integration tests with a test database or mock server in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s13", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan dependency audit and security hardening in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s14", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add observability: metrics and tracing hooks in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s15", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan refactoring to reduce coupling between modules in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s16", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add caching layer for frequently accessed data in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s17", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan feature flags for gradual rollout in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s18", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add database migration strategy (if applicable) in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s19", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan dark mode support for the UI in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s2", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add input validation for all public endpoints or components in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s3", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan a migration from JavaScript to TypeScript incrementally in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s4", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add health check and readiness endpoints in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s5", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Improve error messages for API consumers in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s6", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add API documentation generation (OpenAPI or similar) in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s7", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan performance profiling for hot paths in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s8", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Add environment-based configuration with validation in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-node-express-s9", + "tier": "eval", + "category": "fixture-plan-node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan CI pipeline steps: lint, test, build in this Express project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s0", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add comprehensive unit tests for the main module in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s1", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Introduce structured logging across the application in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-007.json b/tools/benchmark/tasks/eval/generated-test-full/shard-007.json new file mode 100644 index 00000000..73be61e5 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-007.json @@ -0,0 +1,1120 @@ +[ + { + "id": "eval-plan-react-vite-s10", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add rate limiting for public routes in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s11", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan accessibility improvements for UI components in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s12", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add integration tests with a test database or mock server in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s13", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan dependency audit and security hardening in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s14", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add observability: metrics and tracing hooks in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s15", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan refactoring to reduce coupling between modules in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s16", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add caching layer for frequently accessed data in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s17", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan feature flags for gradual rollout in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s18", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add database migration strategy (if applicable) in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s19", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan dark mode support for the UI in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s2", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add input validation for all public endpoints or components in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s3", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan a migration from JavaScript to TypeScript incrementally in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s4", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add health check and readiness endpoints in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s5", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Improve error messages for API consumers in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s6", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add API documentation generation (OpenAPI or similar) in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s7", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan performance profiling for hot paths in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s8", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Add environment-based configuration with validation in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-plan-react-vite-s9", + "tier": "eval", + "category": "fixture-plan-react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan CI pipeline steps: lint, test, build in this React + Vite project. Break into ordered steps with verification.", + "verify": [ + "exit_0", + "json_path:steps" + ] + }, + { + "id": "eval-reasoning-0-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "If a CI pipeline fails only on Windows, what hypotheses do you test first? (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-0-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "If a CI pipeline fails only on Windows, what hypotheses do you test first? (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-0-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "If a CI pipeline fails only on Windows, what hypotheses do you test first? (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-0-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "If a CI pipeline fails only on Windows, what hypotheses do you test first? (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-0-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "If a CI pipeline fails only on Windows, what hypotheses do you test first? (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-1-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Compare monorepo vs polyrepo for a 10-engineer team shipping JS libraries. (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-1-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Compare monorepo vs polyrepo for a 10-engineer team shipping JS libraries. (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-1-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Compare monorepo vs polyrepo for a 10-engineer team shipping JS libraries. (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-1-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Compare monorepo vs polyrepo for a 10-engineer team shipping JS libraries. (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-1-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Compare monorepo vs polyrepo for a 10-engineer team shipping JS libraries. (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-2-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When should an agent ask for approval before editing package.json? (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-2-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When should an agent ask for approval before editing package.json? (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-2-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When should an agent ask for approval before editing package.json? (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-2-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When should an agent ask for approval before editing package.json? (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-2-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When should an agent ask for approval before editing package.json? (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-3-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do you verify an LLM-generated patch without running full e2e? (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-3-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do you verify an LLM-generated patch without running full e2e? (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-3-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do you verify an LLM-generated patch without running full e2e? (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-3-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do you verify an LLM-generated patch without running full e2e? (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-3-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do you verify an LLM-generated patch without running full e2e? (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-4-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "What signals indicate index staleness in a coding agent? (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-4-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "What signals indicate index staleness in a coding agent? (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-4-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "What signals indicate index staleness in a coding agent? (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-4-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "What signals indicate index staleness in a coding agent? (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-4-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "What signals indicate index staleness in a coding agent? (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-5-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Explain tradeoffs: stub runtime vs real runtime in benchmark harnesses. (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-5-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Explain tradeoffs: stub runtime vs real runtime in benchmark harnesses. (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-5-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Explain tradeoffs: stub runtime vs real runtime in benchmark harnesses. (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-5-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Explain tradeoffs: stub runtime vs real runtime in benchmark harnesses. (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-5-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Explain tradeoffs: stub runtime vs real runtime in benchmark harnesses. (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-6-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How would you shard 1000 eval tasks across 8 workers fairly? (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-6-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How would you shard 1000 eval tasks across 8 workers fairly? (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-6-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How would you shard 1000 eval tasks across 8 workers fairly? (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-6-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How would you shard 1000 eval tasks across 8 workers fairly? (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-6-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How would you shard 1000 eval tasks across 8 workers fairly? (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-7-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When is retrieval-augmented ask mode preferable to agent mode? (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-7-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When is retrieval-augmented ask mode preferable to agent mode? (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-7-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When is retrieval-augmented ask mode preferable to agent mode? (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-7-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When is retrieval-augmented ask mode preferable to agent mode? (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-7-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "When is retrieval-augmented ask mode preferable to agent mode? (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-8-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Describe a safe rollback strategy after a bad agent edit. (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-8-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Describe a safe rollback strategy after a bad agent edit. (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-8-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Describe a safe rollback strategy after a bad agent edit. (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-8-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Describe a safe rollback strategy after a bad agent edit. (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-8-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Describe a safe rollback strategy after a bad agent edit. (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-9-v0", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do session JSONL logs help post-hoc eval scoring? (variant 1: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-9-v1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do session JSONL logs help post-hoc eval scoring? (variant 2: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-9-v2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do session JSONL logs help post-hoc eval scoring? (variant 3: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-9-v3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do session JSONL logs help post-hoc eval scoring? (variant 4: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-9-v4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "How do session JSONL logs help post-hoc eval scoring? (variant 5: be concise and structured).", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-1", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 1 where you sum integers from 1 to 11.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-10", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 10 where you sum integers from 1 to 20.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-11", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 11 where you sum integers from 1 to 21.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-12", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 12 where you sum integers from 1 to 22.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-13", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 13 where you sum integers from 1 to 23.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-14", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 14 where you sum integers from 1 to 24.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-15", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 15 where you sum integers from 1 to 25.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-16", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 16 where you sum integers from 1 to 26.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-17", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 17 where you sum integers from 1 to 27.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-18", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 18 where you sum integers from 1 to 28.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-19", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 19 where you sum integers from 1 to 29.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-2", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 2 where you sum integers from 1 to 12.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-20", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 20 where you sum integers from 1 to 30.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-21", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 21 where you sum integers from 1 to 31.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-22", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 22 where you sum integers from 1 to 32.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-23", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 23 where you sum integers from 1 to 33.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-24", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 24 where you sum integers from 1 to 34.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-25", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 25 where you sum integers from 1 to 35.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-26", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 26 where you sum integers from 1 to 36.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-27", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 27 where you sum integers from 1 to 37.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-28", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 28 where you sum integers from 1 to 38.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-29", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 29 where you sum integers from 1 to 39.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-3", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 3 where you sum integers from 1 to 13.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-30", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 30 where you sum integers from 1 to 40.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-31", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 31 where you sum integers from 1 to 41.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-32", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 32 where you sum integers from 1 to 42.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-33", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 33 where you sum integers from 1 to 43.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-34", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 34 where you sum integers from 1 to 44.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-35", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 35 where you sum integers from 1 to 45.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-36", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 36 where you sum integers from 1 to 46.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-37", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 37 where you sum integers from 1 to 47.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-38", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 38 where you sum integers from 1 to 48.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-008.json b/tools/benchmark/tasks/eval/generated-test-full/shard-008.json new file mode 100644 index 00000000..7e773e00 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-008.json @@ -0,0 +1,1162 @@ +[ + { + "id": "eval-reasoning-math-39", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 39 where you sum integers from 1 to 49.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-4", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 4 where you sum integers from 1 to 14.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-40", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 40 where you sum integers from 1 to 50.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-5", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 5 where you sum integers from 1 to 15.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-6", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 6 where you sum integers from 1 to 16.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-7", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 7 where you sum integers from 1 to 17.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-8", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 8 where you sum integers from 1 to 18.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-reasoning-math-9", + "tier": "eval", + "category": "reasoning", + "mode": "ask", + "prompt": "Without using tools: explain step-by-step how to verify the answer to problem 9 where you sum integers from 1 to 19.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q0", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Find the file that defines the main HTTP server bootstrap.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q1", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Locate the primary UI component rendered on the home view.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q10", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Locate the Express app mount point for routers.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q11", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Find TypeScript configuration if present.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q12", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is the main page metadata defined?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q13", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Find service layer business logic.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q14", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Locate entry point for the build tool configuration.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q2", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is the root NestJS module declared?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q3", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Find the Next.js root layout component.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q4", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which file handles the /users route?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q5", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where are React component props typed?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q6", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Find the NestJS controller class.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q7", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Locate package.json and summarize its name field.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q8", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Find test files in this repository.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-nest-api-q9", + "tier": "eval", + "category": "retrieval-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which source file has the most imports?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q0", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Find the file that defines the main HTTP server bootstrap.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q1", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Locate the primary UI component rendered on the home view.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q10", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Locate the Express app mount point for routers.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q11", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Find TypeScript configuration if present.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q12", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is the main page metadata defined?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q13", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Find service layer business logic.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q14", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Locate entry point for the build tool configuration.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q2", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is the root NestJS module declared?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q3", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Find the Next.js root layout component.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q4", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which file handles the /users route?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q5", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where are React component props typed?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q6", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Find the NestJS controller class.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q7", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Locate package.json and summarize its name field.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q8", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Find test files in this repository.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-next-app-q9", + "tier": "eval", + "category": "retrieval-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which source file has the most imports?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q0", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find the file that defines the main HTTP server bootstrap.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q1", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Locate the primary UI component rendered on the home view.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q10", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Locate the Express app mount point for routers.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q11", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find TypeScript configuration if present.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q12", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is the main page metadata defined?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q13", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find service layer business logic.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q14", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Locate entry point for the build tool configuration.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q2", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is the root NestJS module declared?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q3", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find the Next.js root layout component.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q4", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which file handles the /users route?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q5", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where are React component props typed?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q6", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find the NestJS controller class.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q7", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Locate package.json and summarize its name field.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q8", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find test files in this repository.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-node-express-q9", + "tier": "eval", + "category": "retrieval-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which source file has the most imports?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q0", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Find the file that defines the main HTTP server bootstrap.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q1", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Locate the primary UI component rendered on the home view.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q10", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Locate the Express app mount point for routers.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q11", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Find TypeScript configuration if present.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q12", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is the main page metadata defined?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q13", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Find service layer business logic.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q14", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Locate entry point for the build tool configuration.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q2", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is the root NestJS module declared?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q3", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Find the Next.js root layout component.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q4", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which file handles the /users route?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q5", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where are React component props typed?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q6", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Find the NestJS controller class.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q7", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Locate package.json and summarize its name field.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q8", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Find test files in this repository.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-retrieval-react-vite-q9", + "tier": "eval", + "category": "retrieval-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which source file has the most imports?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p0-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the browser_navigate tool? Give an example with args { \"url\": \"http://localhost:3000\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p0-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the browser_navigate tool? Give an example with args { \"url\": \"http://localhost:3000\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p0-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the browser_navigate tool? Give an example with args { \"url\": \"http://localhost:3000\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p0-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the browser_navigate tool? Give an example with args { \"url\": \"http://localhost:3000\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p0-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the browser_navigate tool? Give an example with args { \"url\": \"http://localhost:3000\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p1-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for browser_navigate: { \"url\": \"http://localhost:3000\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p1-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for browser_navigate: { \"url\": \"http://localhost:3000\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p1-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for browser_navigate: { \"url\": \"http://localhost:3000\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p1-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for browser_navigate: { \"url\": \"http://localhost:3000\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p1-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for browser_navigate: { \"url\": \"http://localhost:3000\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p2-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking browser_navigate?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p2-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking browser_navigate?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p2-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking browser_navigate?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p2-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking browser_navigate?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p2-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking browser_navigate?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p3-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when browser_navigate is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p3-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when browser_navigate is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p3-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when browser_navigate is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p3-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when browser_navigate is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-browser_navigate-p3-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when browser_navigate is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p0-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the create_plan tool? Give an example with args { \"steps\": [] }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p0-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the create_plan tool? Give an example with args { \"steps\": [] }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p0-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the create_plan tool? Give an example with args { \"steps\": [] }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p0-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the create_plan tool? Give an example with args { \"steps\": [] }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p0-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the create_plan tool? Give an example with args { \"steps\": [] }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p1-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for create_plan: { \"steps\": [] }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p1-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for create_plan: { \"steps\": [] }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p1-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for create_plan: { \"steps\": [] }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p1-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for create_plan: { \"steps\": [] }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p1-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for create_plan: { \"steps\": [] }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p2-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking create_plan?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p2-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking create_plan?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test-full/shard-009.json b/tools/benchmark/tasks/eval/generated-test-full/shard-009.json new file mode 100644 index 00000000..fde6b902 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test-full/shard-009.json @@ -0,0 +1,1102 @@ +[ + { + "id": "eval-tool-create_plan-p2-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking create_plan?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p2-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking create_plan?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p2-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking create_plan?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p3-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when create_plan is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p3-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when create_plan is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p3-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when create_plan is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p3-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when create_plan is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-create_plan-p3-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when create_plan is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p0-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the git_status tool? Give an example with args {}.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p0-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the git_status tool? Give an example with args {}.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p0-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the git_status tool? Give an example with args {}.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p0-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the git_status tool? Give an example with args {}.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p0-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the git_status tool? Give an example with args {}.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p1-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for git_status: {}", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p1-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for git_status: {}", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p1-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for git_status: {}", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p1-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for git_status: {}", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p1-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for git_status: {}", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p2-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking git_status?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p2-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking git_status?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p2-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking git_status?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p2-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking git_status?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p2-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking git_status?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p3-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when git_status is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p3-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when git_status is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p3-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when git_status is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p3-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when git_status is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-git_status-p3-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when git_status is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p0-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the list_directory tool? Give an example with args { \"path\": \"src\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p0-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the list_directory tool? Give an example with args { \"path\": \"src\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p0-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the list_directory tool? Give an example with args { \"path\": \"src\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p0-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the list_directory tool? Give an example with args { \"path\": \"src\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p0-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the list_directory tool? Give an example with args { \"path\": \"src\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p1-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for list_directory: { \"path\": \"src\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p1-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for list_directory: { \"path\": \"src\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p1-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for list_directory: { \"path\": \"src\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p1-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for list_directory: { \"path\": \"src\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p1-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for list_directory: { \"path\": \"src\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p2-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking list_directory?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p2-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking list_directory?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p2-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking list_directory?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p2-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking list_directory?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p2-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking list_directory?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p3-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when list_directory is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p3-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when list_directory is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p3-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when list_directory is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p3-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when list_directory is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-list_directory-p3-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when list_directory is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p0-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the read_file tool? Give an example with args { \"path\": \"src/index.js\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p0-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the read_file tool? Give an example with args { \"path\": \"src/index.js\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p0-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the read_file tool? Give an example with args { \"path\": \"src/index.js\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p0-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the read_file tool? Give an example with args { \"path\": \"src/index.js\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p0-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the read_file tool? Give an example with args { \"path\": \"src/index.js\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p1-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for read_file: { \"path\": \"src/index.js\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p1-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for read_file: { \"path\": \"src/index.js\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p1-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for read_file: { \"path\": \"src/index.js\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p1-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for read_file: { \"path\": \"src/index.js\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p1-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for read_file: { \"path\": \"src/index.js\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p2-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking read_file?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p2-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking read_file?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p2-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking read_file?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p2-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking read_file?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p2-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking read_file?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p3-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when read_file is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p3-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when read_file is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p3-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when read_file is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p3-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when read_file is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-read_file-p3-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when read_file is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p0-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the run_terminal tool? Give an example with args { \"command\": \"npm test\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p0-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the run_terminal tool? Give an example with args { \"command\": \"npm test\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p0-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the run_terminal tool? Give an example with args { \"command\": \"npm test\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p0-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the run_terminal tool? Give an example with args { \"command\": \"npm test\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p0-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the run_terminal tool? Give an example with args { \"command\": \"npm test\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p1-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for run_terminal: { \"command\": \"npm test\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p1-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for run_terminal: { \"command\": \"npm test\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p1-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for run_terminal: { \"command\": \"npm test\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p1-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for run_terminal: { \"command\": \"npm test\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p1-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for run_terminal: { \"command\": \"npm test\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p2-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking run_terminal?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p2-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking run_terminal?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p2-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking run_terminal?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p2-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking run_terminal?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p2-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking run_terminal?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p3-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when run_terminal is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p3-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when run_terminal is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p3-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when run_terminal is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p3-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when run_terminal is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-run_terminal-p3-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What failure modes occur when run_terminal is misused?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p0-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the search_codebase tool? Give an example with args { \"query\": \"router.get\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p0-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the search_codebase tool? Give an example with args { \"query\": \"router.get\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p0-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the search_codebase tool? Give an example with args { \"query\": \"router.get\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p0-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the search_codebase tool? Give an example with args { \"query\": \"router.get\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p0-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "When should a coding agent call the search_codebase tool? Give an example with args { \"query\": \"router.get\" }.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p1-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for search_codebase: { \"query\": \"router.get\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p1-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for search_codebase: { \"query\": \"router.get\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p1-v2", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for search_codebase: { \"query\": \"router.get\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p1-v3", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for search_codebase: { \"query\": \"router.get\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p1-v4", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "Describe correct JSON arguments for search_codebase: { \"query\": \"router.get\" }", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p2-v0", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking search_codebase?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-tool-search_codebase-p2-v1", + "tier": "eval", + "category": "tool-calling", + "mode": "ask", + "prompt": "What preconditions must be true before invoking search_codebase?", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test/index.json b/tools/benchmark/tasks/eval/generated-test/index.json new file mode 100644 index 00000000..c0637fcf --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test/index.json @@ -0,0 +1,9 @@ +{ + "includes": [ + "shard-000.json", + "shard-001.json", + "shard-002.json", + "shard-003.json", + "shard-004.json" + ] +} diff --git a/tools/benchmark/tasks/eval/generated-test/manifest.json b/tools/benchmark/tasks/eval/generated-test/manifest.json new file mode 100644 index 00000000..ccf06708 --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test/manifest.json @@ -0,0 +1,41 @@ +{ + "generatedAt": "2026-07-03T21:02:42.220Z", + "profile": "standard", + "targetCount": 500, + "actualCount": 500, + "shardSize": 100, + "shards": [ + "shard-000.json", + "shard-001.json", + "shard-002.json", + "shard-003.json", + "shard-004.json" + ], + "categories": { + "browser": 1, + "nestjs": 3, + "nextjs": 3, + "node": 4, + "react": 3, + "ask": 1, + "mcp": 2, + "orchestrator": 1, + "microtasks": 1, + "agent-loop": 1, + "skills": 1, + "verify": 1, + "paths": 1, + "infrastructure": 3, + "fixture-agent-nestjs": 15, + "fixture-agent-nextjs": 15, + "fixture-agent-node": 16, + "fixture-agent-react": 15, + "fixture-ask-nestjs": 64, + "fixture-ask-nextjs": 49, + "fixture-ask-node": 49, + "fixture-ask-react": 49, + "coding-js": 202 + }, + "outputDir": "/Users/karthikshinde/Applications/ai-agent/mitii/mitii-ai-agent/tools/benchmark/tasks/eval/generated-test", + "note": "External eval tasks — not packaged in VSIX extension" +} diff --git a/tools/benchmark/tasks/eval/generated-test/shard-000.json b/tools/benchmark/tasks/eval/generated-test/shard-000.json new file mode 100644 index 00000000..2a0d2a2f --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test/shard-000.json @@ -0,0 +1,1263 @@ +[ + { + "id": "base-agent-browser-skill-available", + "tier": "eval", + "category": "browser", + "mode": "agent", + "fixture": "react-vite", + "enablePuppeteer": false, + "prompt": "List available Mitii skills for browser testing and when to use puppeteer MCP.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:10" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-nest-add-dto", + "tier": "eval", + "category": "nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Introduce a CreateUserDto and wire validation in AppController.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_exists:src/app.controller.ts" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-next-loading-ui", + "tier": "eval", + "category": "nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Add a loading.tsx for the home route and document how to verify it in dev.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_exists:app/page.tsx" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-node-fix-typo", + "tier": "eval", + "category": "node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Fix the bug in src/routes/users.js where the list endpoint returns the wrong status message. Apply the fix and explain verification.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_contains:src/routes/users.js:success" + ], + "sourceTier": "agent" + }, + { + "id": "base-agent-react-button-variant", + "tier": "eval", + "category": "react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Add a secondary variant to Button.tsx and use it in App.tsx. Provide a verification checklist.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_exists:src/App.tsx" + ], + "sourceTier": "agent" + }, + { + "id": "base-ask-nest-module", + "tier": "eval", + "category": "nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe the NestJS module structure and where AppController is registered.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-next-page", + "tier": "eval", + "category": "nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What is rendered on the home page and how is the root layout structured?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-node-entry", + "tier": "eval", + "category": "node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain how requests flow through this Express app. Where is the users router mounted?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-react-component", + "tier": "eval", + "category": "react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does the Button component render and what props does it accept?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ], + "sourceTier": "ask" + }, + { + "id": "base-ask-retrieval-users-route", + "tier": "eval", + "category": "node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Find the route handler for GET /users and summarize what it returns.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_contains:src/routes/users.js:router.get" + ], + "sourceTier": "ask" + }, + { + "id": "base-integration-real-ask-node", + "tier": "eval", + "category": "ask", + "mode": "ask", + "fixture": "node-express", + "runtime": "real", + "prompt": "Where is the Express app created and what port does it listen on?", + "verify": [ + "exit_0", + "stdout_not_empty", + "skills_installed:10" + ], + "sourceTier": "integration" + }, + { + "id": "base-plan-nest-health-endpoint", + "tier": "eval", + "category": "nestjs", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan adding a /health endpoint with controller, service, and e2e test.", + "verify": [ + "exit_0", + "json_path:steps", + "file_exists:src/main.ts" + ], + "sourceTier": "plan" + }, + { + "id": "base-plan-next-seo-metadata", + "tier": "eval", + "category": "nextjs", + "mode": "plan", + "fixture": "next-app", + "prompt": "Plan improving SEO metadata in app/layout.tsx and documenting verification steps.", + "verify": [ + "exit_0", + "json_path:steps", + "file_exists:app/layout.tsx" + ], + "sourceTier": "plan" + }, + { + "id": "base-plan-node-error-middleware", + "tier": "eval", + "category": "node", + "mode": "plan", + "fixture": "node-express", + "prompt": "Plan adding centralized error middleware and updating the users route tests.", + "verify": [ + "exit_0", + "json_path:steps", + "file_contains:src/index.js:express" + ], + "sourceTier": "plan" + }, + { + "id": "base-plan-react-test-coverage", + "tier": "eval", + "category": "react", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan adding unit tests for the Button component and updating package.json scripts.", + "verify": [ + "exit_0", + "json_path:steps", + "file_exists:package.json" + ], + "sourceTier": "plan" + }, + { + "id": "base-regression-act-mcp-exclusion-note", + "tier": "eval", + "category": "mcp", + "mode": "agent", + "fixture": "next-app", + "prompt": "Explain which tools should be used for file edits in Agent mode vs MCP filesystem tools.", + "verify": [ + "exit_0", + "jsonl_event:end" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-empty-response-handling", + "tier": "eval", + "category": "orchestrator", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize AppModule providers without making anything up.", + "verify": [ + "exit_0", + "stdout_not_empty" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-microtask-commit-msg-hint", + "tier": "eval", + "category": "microtasks", + "mode": "ask", + "fixture": "node-express", + "prompt": "Need commit message for staged changes in src/routes/users.js", + "verify": [ + "exit_0", + "stdout_not_empty" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-phase-lock-guidance", + "tier": "eval", + "category": "agent-loop", + "mode": "agent", + "fixture": "node-express", + "prompt": "Review src/index.js and propose safe read-only inspection steps before any edits.", + "verify": [ + "exit_0", + "jsonl_event:end" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-sequential-thinking-cap", + "tier": "eval", + "category": "mcp", + "mode": "plan", + "fixture": "nest-api", + "prompt": "Plan debugging steps for a failing health check endpoint using structured reasoning.", + "verify": [ + "exit_0", + "json_path:steps" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-skill-routing-plan", + "tier": "eval", + "category": "skills", + "mode": "plan", + "fixture": "react-vite", + "prompt": "Plan a test-driven development pass to add tests for the Button component.", + "verify": [ + "exit_0", + "json_path:steps", + "skills_installed:10" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-verify-command-discovery", + "tier": "eval", + "category": "verify", + "mode": "ask", + "fixture": "node-express", + "prompt": "What npm scripts exist in this project for test and lint verification?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_contains:package.json:test" + ], + "sourceTier": "regression" + }, + { + "id": "base-regression-windows-path-safe", + "tier": "eval", + "category": "paths", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List source files under src/ using workspace-relative paths.", + "verify": [ + "exit_0", + "stdout_not_empty", + "dir_has_files:src" + ], + "sourceTier": "regression" + }, + { + "id": "base-smoke-agent-echo", + "tier": "eval", + "category": "infrastructure", + "mode": "agent", + "prompt": "Review the working tree and produce implementation guidance.", + "verify": [ + "exit_0", + "jsonl_event:end" + ], + "sourceTier": "smoke" + }, + { + "id": "base-smoke-ask-echo", + "tier": "eval", + "category": "infrastructure", + "mode": "ask", + "prompt": "Summarize the project structure and identify the main entry point.", + "verify": [ + "exit_0", + "stdout_contains:Echo:" + ], + "sourceTier": "smoke" + }, + { + "id": "base-smoke-plan-echo", + "tier": "eval", + "category": "infrastructure", + "mode": "plan", + "prompt": "Plan a release hygiene pass covering changelog, README, and tests.", + "verify": [ + "exit_0", + "json_path:steps" + ], + "sourceTier": "smoke" + }, + { + "id": "eval-agent-nest-api-a0", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a1", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a10", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a11", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a12", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a13", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a14", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a2", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a3", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a4", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a5", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a6", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a7", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-nest-api-a8", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-nest-api-a9", + "tier": "eval", + "category": "fixture-agent-nestjs", + "mode": "agent", + "fixture": "nest-api", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a0", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a1", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a10", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a11", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a12", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a13", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a14", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a2", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a3", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a4", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a5", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a6", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a7", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-next-app-a8", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-next-app-a9", + "tier": "eval", + "category": "fixture-agent-nextjs", + "mode": "agent", + "fixture": "next-app", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a0", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a1", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a10", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a11", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a12", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a13", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a14", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a2", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a3", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a4", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a5", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a6", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a7", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-node-express-a8", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-a9", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-node-express-fix-users", + "tier": "eval", + "category": "fixture-agent-node", + "mode": "agent", + "fixture": "node-express", + "prompt": "Fix the bug in src/routes/users.js where GET /users returns the wrong status message. Apply the fix.", + "verify": [ + "exit_0", + "jsonl_event:end", + "file_contains:src/routes/users.js:success" + ] + }, + { + "id": "eval-agent-react-vite-a0", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Read src structure and list the top 3 improvement areas without editing files.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a1", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Inspect the main entry file and summarize middleware or bootstrap setup.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a10", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Find duplicate logic across files and suggest consolidation targets.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a11", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Outline safe read-only inspection steps before editing any file.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a12", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Summarize environment variables or config this app would need in production.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a13", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Identify missing error handling and rank by severity.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a14", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "List files that should never be auto-edited by an agent and why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a2", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Find TODO or FIXME comments if any; report locations.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a3", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Propose a minimal test file skeleton for the core module (describe only, do not write unless asked).", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a4", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Review package.json scripts and suggest one missing script for developer workflow.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a5", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Identify the highest-risk file for production bugs and explain why.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a6", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "List all exported symbols from the main service or route module.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a7", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Explain which Mitii skills apply to this codebase and when to use them.", + "verify": [ + "exit_0", + "jsonl_event:end", + "skills_installed:5" + ] + }, + { + "id": "eval-agent-react-vite-a8", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Draft a verification checklist before making any code changes.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-agent-react-vite-a9", + "tier": "eval", + "category": "fixture-agent-react", + "mode": "agent", + "fixture": "react-vite", + "prompt": "Compare this project structure to common best practices for its stack.", + "verify": [ + "exit_0", + "jsonl_event:end" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/app.controller.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/app.controller.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/app.controller.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/app.controller.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/app.controller.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/app.controller.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/app.controller.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/app.controller.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/app.controller.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/app.controller.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test/shard-001.json b/tools/benchmark/tasks/eval/generated-test/shard-001.json new file mode 100644 index 00000000..335c45fd --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test/shard-001.json @@ -0,0 +1,1294 @@ +[ + { + "id": "eval-ask-nest-api-src-app-controller-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/app.controller.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-controller-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/app.controller.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.controller.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/app.module.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/app.module.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/app.module.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/app.module.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/app.module.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/app.module.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/app.module.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/app.module.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/app.module.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/app.module.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/app.module.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-module-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/app.module.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.module.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/app.service.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/app.service.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/app.service.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/app.service.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/app.service.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/app.service.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/app.service.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/app.service.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/app.service.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/app.service.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/app.service.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-app-service-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/app.service.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/app.service.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t0", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Explain the purpose of src/main.ts in this NestJS project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t1", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What does src/main.ts export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t10", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How is src/main.ts referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t11", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What configuration in package.json affects src/main.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t12", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Give an architecture overview of this NestJS codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t13", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t14", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t2", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "How does src/main.ts connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t3", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "List the key functions, classes, or routes defined in src/main.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t4", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What dependencies or imports does src/main.ts use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t5", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Describe error handling patterns visible in or around src/main.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t6", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What would you inspect first in src/main.ts when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t7", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Summarize the public API surface exposed via src/main.ts.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t8", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Which tests (if any) cover behavior related to src/main.ts?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-src-main-ts-t9", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "What refactoring opportunities exist in src/main.ts? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/main.ts" + ] + }, + { + "id": "eval-ask-nest-api-symbol-appcontroller", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"AppController\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-nest-api-symbol-appmodule", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"AppModule\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-nest-api-symbol-injectable", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"Injectable\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-nest-api-symbol-nestfactory", + "tier": "eval", + "category": "fixture-ask-nestjs", + "mode": "ask", + "fixture": "nest-api", + "prompt": "Where is \"NestFactory\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t0", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Explain the purpose of app/layout.tsx in this Next.js App Router project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t1", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What does app/layout.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t10", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How is app/layout.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t11", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What configuration in package.json affects app/layout.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t12", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Give an architecture overview of this Next.js App Router codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t13", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t14", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t2", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How does app/layout.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t3", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "List the key functions, classes, or routes defined in app/layout.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t4", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What dependencies or imports does app/layout.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t5", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Describe error handling patterns visible in or around app/layout.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t6", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What would you inspect first in app/layout.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t7", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Summarize the public API surface exposed via app/layout.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t8", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which tests (if any) cover behavior related to app/layout.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-layout-tsx-t9", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What refactoring opportunities exist in app/layout.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/layout.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t0", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Explain the purpose of app/page.tsx in this Next.js App Router project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t1", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What does app/page.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t10", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How is app/page.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t11", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What configuration in package.json affects app/page.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t12", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Give an architecture overview of this Next.js App Router codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t13", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t14", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t2", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How does app/page.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t3", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "List the key functions, classes, or routes defined in app/page.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t4", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What dependencies or imports does app/page.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t5", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Describe error handling patterns visible in or around app/page.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t6", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What would you inspect first in app/page.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t7", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Summarize the public API surface exposed via app/page.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t8", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which tests (if any) cover behavior related to app/page.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-app-page-tsx-t9", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What refactoring opportunities exist in app/page.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:app/page.tsx" + ] + }, + { + "id": "eval-ask-next-app-package-json-t0", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Explain the purpose of package.json in this Next.js App Router project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t1", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What does package.json export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t10", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How is package.json referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t11", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What configuration in package.json affects package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t12", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Give an architecture overview of this Next.js App Router codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t13", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t14", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t2", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "How does package.json connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t3", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "List the key functions, classes, or routes defined in package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t4", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What dependencies or imports does package.json use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t5", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Describe error handling patterns visible in or around package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t6", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What would you inspect first in package.json when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t7", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Summarize the public API surface exposed via package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t8", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Which tests (if any) cover behavior related to package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-package-json-t9", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "What refactoring opportunities exist in package.json? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-next-app-symbol-layout", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"layout\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-symbol-metadata", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"metadata\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-symbol-next-js", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"Next.js\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-next-app-symbol-page", + "tier": "eval", + "category": "fixture-ask-nextjs", + "mode": "ask", + "fixture": "next-app", + "prompt": "Where is \"page\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test/shard-002.json b/tools/benchmark/tasks/eval/generated-test/shard-002.json new file mode 100644 index 00000000..739f610b --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test/shard-002.json @@ -0,0 +1,1290 @@ +[ + { + "id": "eval-ask-node-express-package-json-t0", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain the purpose of package.json in this Express project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t1", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What does package.json export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t10", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How is package.json referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t11", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What configuration in package.json affects package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t12", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Give an architecture overview of this Express codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t13", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t14", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t2", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How does package.json connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t3", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "List the key functions, classes, or routes defined in package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t4", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What dependencies or imports does package.json use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t5", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Describe error handling patterns visible in or around package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t6", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What would you inspect first in package.json when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t7", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Summarize the public API surface exposed via package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t8", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which tests (if any) cover behavior related to package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-package-json-t9", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What refactoring opportunities exist in package.json? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t0", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain the purpose of src/index.js in this Express project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t1", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What does src/index.js export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t10", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How is src/index.js referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t11", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What configuration in package.json affects src/index.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t12", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Give an architecture overview of this Express codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t13", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t14", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t2", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How does src/index.js connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t3", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "List the key functions, classes, or routes defined in src/index.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t4", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What dependencies or imports does src/index.js use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t5", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Describe error handling patterns visible in or around src/index.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t6", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What would you inspect first in src/index.js when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t7", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Summarize the public API surface exposed via src/index.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t8", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which tests (if any) cover behavior related to src/index.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-index-js-t9", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What refactoring opportunities exist in src/index.js? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/index.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t0", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Explain the purpose of src/routes/users.js in this Express project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t1", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What does src/routes/users.js export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t10", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How is src/routes/users.js referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t11", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What configuration in package.json affects src/routes/users.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t12", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Give an architecture overview of this Express codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t13", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t14", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t2", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "How does src/routes/users.js connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t3", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "List the key functions, classes, or routes defined in src/routes/users.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t4", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What dependencies or imports does src/routes/users.js use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t5", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Describe error handling patterns visible in or around src/routes/users.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t6", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What would you inspect first in src/routes/users.js when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t7", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Summarize the public API surface exposed via src/routes/users.js.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t8", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Which tests (if any) cover behavior related to src/routes/users.js?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-src-routes-users-js-t9", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "What refactoring opportunities exist in src/routes/users.js? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/routes/users.js" + ] + }, + { + "id": "eval-ask-node-express-symbol-express", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"express\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-node-express-symbol-get-users", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"GET /users\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-node-express-symbol-router", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"router\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-node-express-symbol-users", + "tier": "eval", + "category": "fixture-ask-node", + "mode": "ask", + "fixture": "node-express", + "prompt": "Where is \"users\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t0", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Explain the purpose of package.json in this React + Vite project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t1", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does package.json export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t10", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How is package.json referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t11", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What configuration in package.json affects package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t12", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Give an architecture overview of this React + Vite codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t13", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t14", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t2", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How does package.json connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t3", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List the key functions, classes, or routes defined in package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t4", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What dependencies or imports does package.json use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t5", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Describe error handling patterns visible in or around package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t6", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What would you inspect first in package.json when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t7", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Summarize the public API surface exposed via package.json.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t8", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which tests (if any) cover behavior related to package.json?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-package-json-t9", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What refactoring opportunities exist in package.json? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:package.json" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t0", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Explain the purpose of src/App.tsx in this React + Vite project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t1", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does src/App.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t10", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How is src/App.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t11", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What configuration in package.json affects src/App.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t12", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Give an architecture overview of this React + Vite codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t13", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t14", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t2", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How does src/App.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t3", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List the key functions, classes, or routes defined in src/App.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t4", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What dependencies or imports does src/App.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t5", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Describe error handling patterns visible in or around src/App.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t6", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What would you inspect first in src/App.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t7", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Summarize the public API surface exposed via src/App.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t8", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which tests (if any) cover behavior related to src/App.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-App-tsx-t9", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What refactoring opportunities exist in src/App.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/App.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t0", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Explain the purpose of src/components/Button.tsx in this React + Vite project.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t1", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What does src/components/Button.tsx export or define? Summarize without inventing details.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t10", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How is src/components/Button.tsx referenced elsewhere in the repository?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t11", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What configuration in package.json affects src/components/Button.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t12", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Give an architecture overview of this React + Vite codebase.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t13", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What are the main entry points and request/data flows?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t14", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which files would you read to onboard a new engineer to this repo?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t2", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "How does src/components/Button.tsx connect to other modules in this codebase?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t3", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "List the key functions, classes, or routes defined in src/components/Button.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t4", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What dependencies or imports does src/components/Button.tsx use?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t5", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Describe error handling patterns visible in or around src/components/Button.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t6", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What would you inspect first in src/components/Button.tsx when debugging a runtime issue?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t7", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Summarize the public API surface exposed via src/components/Button.tsx.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t8", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Which tests (if any) cover behavior related to src/components/Button.tsx?", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-src-components-Button-tsx-t9", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "What refactoring opportunities exist in src/components/Button.tsx? Be specific to the file.", + "verify": [ + "exit_0", + "stdout_not_empty", + "file_exists:src/components/Button.tsx" + ] + }, + { + "id": "eval-ask-react-vite-symbol-button", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"Button\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-symbol-props", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"props\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-symbol-react", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"React\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-ask-react-vite-symbol-variant", + "tier": "eval", + "category": "fixture-ask-react", + "mode": "ask", + "fixture": "react-vite", + "prompt": "Where is \"variant\" defined or used in this codebase? Explain its role.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #1 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-10", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #10 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test/shard-003.json b/tools/benchmark/tasks/eval/generated-test/shard-003.json new file mode 100644 index 00000000..6e6acf8a --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test/shard-003.json @@ -0,0 +1,1102 @@ +[ + { + "id": "eval-coding-algo-100", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #100 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-101", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #101 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-102", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #102 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-103", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #103 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-104", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #104 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-105", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #105 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-106", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #106 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-107", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #107 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-108", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #108 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-109", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #109 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-11", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #11 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-110", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #110 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-12", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #12 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-13", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #13 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-14", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #14 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-15", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #15 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-16", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #16 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-17", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #17 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-18", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #18 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-19", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #19 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #2 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-20", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #20 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-21", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #21 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-22", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #22 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-23", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #23 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-24", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #24 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-25", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #25 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-26", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #26 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-27", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #27 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-28", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #28 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-29", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #29 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #3 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-30", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #30 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-31", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #31 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-32", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #32 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-33", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #33 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-34", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #34 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-35", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #35 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-36", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #36 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-37", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #37 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-38", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #38 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-39", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #39 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #4 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-40", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #40 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-41", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #41 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-42", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #42 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-43", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #43 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-44", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #44 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-45", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #45 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-46", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #46 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-47", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #47 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-48", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #48 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-49", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #49 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-5", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #5 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-50", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #50 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-51", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #51 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-52", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #52 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-53", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #53 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-54", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #54 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-55", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #55 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-56", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #56 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-57", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #57 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-58", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #58 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-59", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #59 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-6", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #6 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-60", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #60 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-61", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #61 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-62", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #62 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-63", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #63 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-64", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #64 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-65", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #65 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-66", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #66 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-67", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #67 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-68", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #68 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-69", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #69 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-7", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #7 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-70", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #70 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-71", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #71 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-72", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #72 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-73", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #73 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-74", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #74 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-75", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #75 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-76", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #76 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-77", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #77 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-78", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #78 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-79", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #79 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-8", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #8 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-80", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #80 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-81", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #81 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-82", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #82 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-83", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #83 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-84", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #84 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-85", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #85 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-86", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #86 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-87", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #87 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-88", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #88 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-89", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #89 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-9", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #9 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-90", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #90 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-91", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #91 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + } +] diff --git a/tools/benchmark/tasks/eval/generated-test/shard-004.json b/tools/benchmark/tasks/eval/generated-test/shard-004.json new file mode 100644 index 00000000..b4b2e60f --- /dev/null +++ b/tools/benchmark/tasks/eval/generated-test/shard-004.json @@ -0,0 +1,1194 @@ +[ + { + "id": "eval-coding-algo-92", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #92 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-93", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #93 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-94", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #94 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-95", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #95 — find the second largest. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-96", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #96 — find the missing number. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-97", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #97 — find the duplicate. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-98", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #98 — find the pair with sum k. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-algo-99", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Solve: Given an array of integers, problem #99 — find the longest increasing subsequence length. Explain approach and complexity.", + "verify": [ + "exit_0", + "stdout_not_empty" + ] + }, + { + "id": "eval-coding-anagram-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-anagram-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Determine if two strings are anagrams. Compare sorting vs counting. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:anagram" + ] + }, + { + "id": "eval-coding-binary-search-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-binary-search-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement binary search on a sorted array. When does it fail? Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:mid" + ] + }, + { + "id": "eval-coding-curry-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-curry-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement curry for a function with fixed arity. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:curry" + ] + }, + { + "id": "eval-coding-debounce-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-debounce-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement a debounce(fn, wait) utility in JavaScript. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:debounce" + ] + }, + { + "id": "eval-coding-deep-clone-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-deep-clone-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Outline a deepClone for plain objects (no cycles). Mention limitations. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:clone" + ] + }, + { + "id": "eval-coding-event-emitter-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-event-emitter-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Sketch EventEmitter with on, off, emit. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:emit" + ] + }, + { + "id": "eval-coding-fibonacci-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity?", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fibonacci-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement fib(n) iteratively. What is time and space complexity? Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-fizzbuzz-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-fizzbuzz-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Describe FizzBuzz implementation for 1..n. Mention extensibility. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:FizzBuzz" + ] + }, + { + "id": "eval-coding-flatten-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-flatten-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Flatten a nested array to arbitrary depth. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:flat" + ] + }, + { + "id": "eval-coding-json-parse-safe-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-json-parse-safe-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write safeJsonParse that never throws. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:JSON" + ] + }, + { + "id": "eval-coding-lru-cache-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-lru-cache-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Design an LRU cache API (get/put). Describe data structures. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:LRU" + ] + }, + { + "id": "eval-coding-max-subarray-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-max-subarray-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Explain Kadane's algorithm for maximum subarray sum. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:subarray" + ] + }, + { + "id": "eval-coding-memoize-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-memoize-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Add memoization to an expensive pure function. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:cache" + ] + }, + { + "id": "eval-coding-merge-sorted-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-merge-sorted-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Merge two sorted arrays into one sorted array. Describe algorithm. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:merge" + ] + }, + { + "id": "eval-coding-palindrome-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-palindrome-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Check if a string is a palindrome ignoring case and non-alphanumeric. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:palindrome" + ] + }, + { + "id": "eval-coding-promise-all-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-promise-all-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement promiseAll(iterable) like Promise.all. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:Promise" + ] + }, + { + "id": "eval-coding-reverse-string-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-reverse-string-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Write a function reverseString(s) for a string array in-place. Explain complexity. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:O(n)" + ] + }, + { + "id": "eval-coding-throttle-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v2", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Include unit test cases.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v3", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Mention Big-O.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-throttle-v4", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement throttle(fn, limit) and contrast with debounce. Show edge case handling.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:throttle" + ] + }, + { + "id": "eval-coding-two-sum-v0", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement twoSum(nums, target) returning indices. Explain approach briefly.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:map" + ] + }, + { + "id": "eval-coding-two-sum-v1", + "tier": "eval", + "category": "coding-js", + "mode": "ask", + "prompt": "Implement twoSum(nums, target) returning indices. Explain approach briefly. Use TypeScript types in the explanation.", + "verify": [ + "exit_0", + "stdout_not_empty", + "stdout_contains:map" + ] + } +] diff --git a/tools/benchmark/verify.mjs b/tools/benchmark/verify.mjs new file mode 100644 index 00000000..a3c116fc --- /dev/null +++ b/tools/benchmark/verify.mjs @@ -0,0 +1,134 @@ +import { existsSync, readFileSync, readdirSync, statSync } from 'fs'; +import { join } from 'path'; +import { spawnSync } from 'child_process'; + +export function verifyTask(rule, ctx) { + try { + if (typeof rule === 'string') { + return verifyRule(rule, ctx); + } + if (rule.all) { + const results = rule.all.map((r) => verifyRule(r, ctx)); + return { + rule: 'all', + passed: results.every((r) => r.passed), + details: results, + }; + } + if (rule.any) { + const results = rule.any.map((r) => verifyRule(r, ctx)); + return { + rule: 'any', + passed: results.some((r) => r.passed), + details: results, + }; + } + return { rule: 'unknown', passed: false, details: 'Unsupported verify shape' }; + } catch (error) { + return { + rule: String(rule), + passed: false, + details: error instanceof Error ? error.message : String(error), + }; + } +} + +function verifyRule(rule, ctx) { + if (rule === 'exit_0') { + return { rule, passed: ctx.exitCode === 0 }; + } + if (rule.startsWith('stdout_contains:')) { + const text = rule.slice('stdout_contains:'.length); + return { rule, passed: ctx.stdout.includes(text) }; + } + if (rule.startsWith('stdout_not_empty')) { + return { rule, passed: ctx.stdout.trim().length > 0 }; + } + if (rule.startsWith('json_path:')) { + const key = rule.slice('json_path:'.length); + try { + return { rule, passed: Boolean(JSON.parse(ctx.stdout)[key]) }; + } catch { + return { rule, passed: false, details: 'Invalid JSON stdout' }; + } + } + if (rule.startsWith('jsonl_event:')) { + const type = rule.slice('jsonl_event:'.length); + const found = ctx.stdout.split(/\r?\n/).some((line) => { + try { + return JSON.parse(line).type === type; + } catch { + return false; + } + }); + return { rule, passed: found }; + } + if (rule.startsWith('file_exists:')) { + const rel = rule.slice('file_exists:'.length); + return { rule, passed: existsSync(join(ctx.cwd, rel)) }; + } + if (rule.startsWith('file_contains:')) { + const [rel, ...needleParts] = rule.slice('file_contains:'.length).split(':'); + const needle = needleParts.join(':'); + const path = join(ctx.cwd, rel); + if (!existsSync(path)) return { rule, passed: false, details: `Missing ${rel}` }; + return { rule, passed: readFileSync(path, 'utf8').includes(needle) }; + } + if (rule.startsWith('dir_has_files:')) { + const rel = rule.slice('dir_has_files:'.length); + const path = join(ctx.cwd, rel); + if (!existsSync(path)) return { rule, passed: false }; + const count = readdirSync(path).filter((f) => statSync(join(path, f)).isFile()).length; + return { rule, passed: count > 0, details: `${count} files` }; + } + if (rule.startsWith('skills_installed:')) { + const min = Number(rule.slice('skills_installed:'.length) || '1'); + const skillsDir = join(ctx.cwd, '.mitii', 'skills'); + if (!existsSync(skillsDir)) return { rule, passed: false }; + const count = readdirSync(skillsDir).filter((entry) => existsSync(join(skillsDir, entry, 'SKILL.md'))).length; + return { rule, passed: count >= min, details: `${count} skills` }; + } + if (rule.startsWith('command_exit_0:')) { + const command = rule.slice('command_exit_0:'.length); + const result = spawnSync(command, { cwd: ctx.cwd, shell: true, encoding: 'utf8' }); + return { rule, passed: result.status === 0, details: (result.stderr || result.stdout || '').slice(0, 500) }; + } + if (rule.startsWith('session_log_has:')) { + const eventType = rule.slice('session_log_has:'.length); + const logsDir = join(ctx.cwd, '.mitii', 'logs'); + if (!existsSync(logsDir)) return { rule, passed: false }; + const files = readdirSync(logsDir).filter((f) => f.endsWith('.jsonl')).sort(); + const last = files[files.length - 1]; + if (!last) return { rule, passed: false }; + const content = readFileSync(join(logsDir, last), 'utf8'); + const found = content.split('\n').some((line) => { + try { + return JSON.parse(line).type === eventType; + } catch { + return false; + } + }); + return { rule, passed: found }; + } + if (rule.startsWith('tool_registered:')) { + const toolName = rule.slice('tool_registered:'.length); + const cliCheck = spawnSync('node', ['-e', ` + const { HeadlessAgentHost } = require('${join(ctx.packageRoot, 'dist/cli.js').replace(/'/g, "\\'")}'); + `], { encoding: 'utf8' }); + return { rule, passed: ctx.stdout.includes(toolName) || cliCheck.status === 0, details: 'tool check deferred to host tests' }; + } + return { rule, passed: false, details: `Unknown rule: ${rule}` }; +} + +export function summarizeVerifications(results) { + const summary = {}; + for (const result of results) { + for (const verification of result.verifications ?? []) { + const key = typeof verification.rule === 'string' ? verification.rule.split(':')[0] : verification.rule; + if (!summary[key]) summary[key] = { passed: 0, total: 0 }; + summary[key].total += 1; + if (verification.passed) summary[key].passed += 1; + } + } + return summary; +}