From 57c569df2b5f073fe9d8379102008af94e6bb27f Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sat, 7 Feb 2026 20:04:56 -0700 Subject: [PATCH 1/9] Changes for initial public release readiness This commit makes the following changes as part of the overall effort to prepare this 'advanced-security/codeql-development-mcp-server' to be fully ready for initial public release: - Rename entry point to codeql-development-mcp-server.ts - Scope all codeql-pack.yml with advanced-security/ prefix - Add npm publishConfig for GitHub Packages - Add CODEQL_PATH env var with PATH-prepend strategy - New package-paths.ts module for npm-install-safe path resolution - Logger writes all output to stderr (stdout reserved for MCP protocol) - Fix process.cwd() usages in language-resources, language-server-eval, temp-dir, and session-data-manager - Fix relative cwd/test paths resolved against workspaceRootDir - Language server spawn() honors CODEQL_PATH via PATH prepend - Use path.delimiter for Windows portability - Relax engines to node >=22.0.0 - Fix VERSION constant from 1.0.0 to 2.23.9 - Update server/README.md env vars and file listing - Updates unit tests to cover source code changes - Adds 'docs/public.md' documentation of intended public features --- .../mcp-server-primitive-create.yml | 2 +- .../mcp-server-primitive-update.yml | 2 +- .../agents/mcp-enabled-ql-query-developer.md | 6 +- .../mcp-enabled-ql-workshop-developer.md | 4 +- .github/agents/ql-agent-skills-developer.md | 2 +- .github/agents/ql-mcp-tool-developer.md | 4 +- .github/agents/ql-mcp-tool-tester.md | 2 +- ...ql-mcp-server-fix-build-and-test.prompt.md | 3 +- .../add-mcp-support-for-new-language/SKILL.md | 51 ++-- .../upgrade-codeql-cli-and-packs/SKILL.md | 75 +++-- .../SKILL.md | 18 ++ .../workflows/client-integration-tests.yml | 230 +++++++++++++++ .github/workflows/release.yml | 49 +++- .gitignore | 2 + README.md | 36 ++- client/LICENSE | 178 ++++++++++++ client/scripts/start-server.sh | 2 +- client/src/lib/server-manager.js | 2 +- docs/getting-started.md | 55 +++- docs/public.md | 262 +++++++++++++++++ package-lock.json | 18 +- server/.gitignore | 4 +- server/.npmignore | 3 + server/LICENSE | 178 ++++++++++++ server/README.md | 37 ++- ...er.js => codeql-development-mcp-server.js} | 266 ++++++++++++------ .../dist/codeql-development-mcp-server.js.map | 7 + server/dist/ql-mcp-server.js.map | 7 - server/esbuild.config.js | 6 +- server/package.json | 45 ++- server/ql/actions/tools/src/codeql-pack.yml | 3 +- server/ql/actions/tools/test/codeql-pack.yml | 4 +- server/ql/cpp/tools/src/codeql-pack.yml | 3 +- server/ql/cpp/tools/test/codeql-pack.yml | 4 +- server/ql/csharp/tools/src/codeql-pack.yml | 3 +- server/ql/csharp/tools/test/codeql-pack.yml | 4 +- server/ql/go/tools/src/codeql-pack.yml | 3 +- server/ql/go/tools/test/codeql-pack.yml | 4 +- server/ql/java/tools/src/codeql-pack.yml | 3 +- server/ql/java/tools/test/codeql-pack.yml | 4 +- .../javascript/examples/src/codeql-pack.yml | 2 +- .../javascript/examples/test/codeql-pack.yml | 4 +- .../ql/javascript/tools/src/codeql-pack.yml | 3 +- .../ql/javascript/tools/test/codeql-pack.yml | 4 +- server/ql/python/tools/src/codeql-pack.yml | 3 +- server/ql/python/tools/test/codeql-pack.yml | 4 +- server/ql/ruby/tools/src/codeql-pack.yml | 3 +- server/ql/ruby/tools/test/codeql-pack.yml | 4 +- server/ql/swift/tools/src/codeql-pack.yml | 3 +- server/ql/swift/tools/test/codeql-pack.yml | 4 +- ...er.ts => codeql-development-mcp-server.ts} | 16 +- server/src/lib/cli-executor.ts | 90 +++++- server/src/lib/cli-tool-registry.ts | 39 ++- server/src/lib/language-server.ts | 20 +- server/src/lib/session-data-manager.ts | 3 +- server/src/resources/language-resources.ts | 9 +- .../src/tools/codeql/language-server-eval.ts | 10 +- server/src/utils/logger.ts | 12 +- server/src/utils/package-paths.ts | 87 ++++++ server/src/utils/temp-dir.ts | 22 +- server/test/src/lib/cli-executor.test.ts | 140 ++++++++- server/test/src/utils/logger.test.ts | 37 ++- server/test/src/utils/package-paths.test.ts | 114 ++++++++ server/test/src/utils/temp-dir.test.ts | 10 +- 64 files changed, 1912 insertions(+), 322 deletions(-) create mode 100644 client/LICENSE create mode 100644 docs/public.md create mode 100644 server/.npmignore create mode 100644 server/LICENSE rename server/dist/{ql-mcp-server.js => codeql-development-mcp-server.js} (97%) create mode 100644 server/dist/codeql-development-mcp-server.js.map delete mode 100644 server/dist/ql-mcp-server.js.map rename server/src/{ql-mcp-server.ts => codeql-development-mcp-server.ts} (86%) create mode 100644 server/src/utils/package-paths.ts create mode 100644 server/test/src/utils/package-paths.test.ts diff --git a/.github/ISSUE_TEMPLATE/mcp-server-primitive-create.yml b/.github/ISSUE_TEMPLATE/mcp-server-primitive-create.yml index a7b0a87b..b80326ef 100644 --- a/.github/ISSUE_TEMPLATE/mcp-server-primitive-create.yml +++ b/.github/ISSUE_TEMPLATE/mcp-server-primitive-create.yml @@ -19,7 +19,7 @@ body: 1. **Repository Context**: Begin by reading these critical reference files: - **Repository Structure**: `README.md` - Overview of MCP server architecture and capabilities - - **Server Implementation**: `server/src/ql-mcp-server.ts` - Main server implementation + - **Server Implementation**: `server/src/codeql-development-mcp-server.ts` - Main server implementation - **Existing Tools**: `server/src/tools/codeql-tools.ts` - Current tool implementations - **Existing Resources**: `server/src/tools/codeql-resources.ts` - Current resource implementations diff --git a/.github/ISSUE_TEMPLATE/mcp-server-primitive-update.yml b/.github/ISSUE_TEMPLATE/mcp-server-primitive-update.yml index 87cead0e..5032888c 100644 --- a/.github/ISSUE_TEMPLATE/mcp-server-primitive-update.yml +++ b/.github/ISSUE_TEMPLATE/mcp-server-primitive-update.yml @@ -19,7 +19,7 @@ body: 1. **Repository Context**: Begin by reading these critical reference files: - **Repository Structure**: `README.md` - Overview of MCP server architecture - - **Server Implementation**: `server/src/ql-mcp-server.ts` - Main server implementation + - **Server Implementation**: `server/src/codeql-development-mcp-server.ts` - Main server implementation - **Current Tools**: `server/src/tools/codeql-tools.ts` - Tool implementations to update - **Current Resources**: `server/src/tools/codeql-resources.ts` - Resource implementations to update diff --git a/.github/agents/mcp-enabled-ql-query-developer.md b/.github/agents/mcp-enabled-ql-query-developer.md index 8daf030b..6ac54023 100644 --- a/.github/agents/mcp-enabled-ql-query-developer.md +++ b/.github/agents/mcp-enabled-ql-query-developer.md @@ -1,8 +1,8 @@ --- name: mcp-enabled-ql-query-developer description: An agent enabled with QL MCP Server tools for developing CodeQL queries using test-driven development (TDD). -model: Claude Opus 4.5 (copilot) -tools: ['agent', 'codeql-dev-mcp-server/*', 'edit', 'read', 'search', 'todo', 'web', 'vscode'] +model: Claude Opus 4.6 (1M context) (copilot) +tools: ['agent', 'ql-mcp/*', 'edit', 'read', 'search', 'todo', 'web', 'vscode'] handoffs: - agent: ql-mcp-tool-developer label: Fix MCP Tool Issue @@ -18,7 +18,7 @@ handoffs: My `mcp-enabled-ql-query-developer` agent: -- Uses the QL MCP Server tools (`codeql-dev-mcp-server/*`) to develop, test, and validate CodeQL queries, libraries, and tests. +- Uses the QL MCP Server tools (`ql-mcp/*`) to develop, test, and validate CodeQL queries, libraries, and tests. - Follows test-driven development (TDD) practices: write tests first, then implement queries to pass those tests. - Leverages the `codeql` CLI for all CodeQL operations. - ALWAYS uses verbose help (`codeql -h -vv`) when learning about `codeql` CLI commands. diff --git a/.github/agents/mcp-enabled-ql-workshop-developer.md b/.github/agents/mcp-enabled-ql-workshop-developer.md index 32ccafdd..cd4f4fc2 100644 --- a/.github/agents/mcp-enabled-ql-workshop-developer.md +++ b/.github/agents/mcp-enabled-ql-workshop-developer.md @@ -1,7 +1,7 @@ --- name: mcp-enabled-ql-workshop-developer description: An agent that creates CodeQL query development workshops from production queries using the QL MCP Server tools. Use this agent to generate guided learning materials that teach developers how to build CodeQL queries incrementally. -model: Claude Opus 4.5 (copilot) +model: Claude Opus 4.6 (1M context) (copilot) handoffs: - agent: ql-mcp-tool-tester label: Validate Solution Stage @@ -35,7 +35,7 @@ My `mcp-enabled-ql-workshop-developer` agent: ## Core Capabilities -- Uses the QL MCP Server tools (`codeql-dev-mcp-server/*`) to create comprehensive CodeQL query development workshops. +- Uses the QL MCP Server tools (`ql-mcp/*`) to create comprehensive CodeQL query development workshops. - Follows the [`create-codeql-query-development-workshop`](../skills/create-codeql-query-development-workshop/SKILL.md) skill to generate workshops from production-grade queries. - Validates AST/CFG tools queries using the [`validate-ql-mcp-server-tools-queries`](../skills/validate-ql-mcp-server-tools-queries/SKILL.md) skill to ensure non-empty output. - Leverages the `codeql` CLI for all CodeQL operations. diff --git a/.github/agents/ql-agent-skills-developer.md b/.github/agents/ql-agent-skills-developer.md index 7622a7e8..f8b08bc2 100644 --- a/.github/agents/ql-agent-skills-developer.md +++ b/.github/agents/ql-agent-skills-developer.md @@ -2,7 +2,7 @@ name: ql-agent-skills-developer description: Develops and improves Agent Skills for the CodeQL Development MCP Server. argument-hint: 'Provide the name(s) of the Agent Skill(s) to be created or improved under the .github/skills/ directory, along with specific requirements where available.' -model: Claude Opus 4.5 (copilot) +model: Claude Opus 4.6 (1M context) (copilot) handoffs: - label: Validate a newly created workshop agent: ql-mcp-tool-tester diff --git a/.github/agents/ql-mcp-tool-developer.md b/.github/agents/ql-mcp-tool-developer.md index d6fe9113..c26509f8 100644 --- a/.github/agents/ql-mcp-tool-developer.md +++ b/.github/agents/ql-mcp-tool-developer.md @@ -2,7 +2,7 @@ name: ql-mcp-tool-developer description: An agent for developing new tools and/or improving existing tools for the QL MCP Server. argument-hint: 'Provide the name(s) of the CodeQL Development MCP Server tool(s) to be created or improved, along with specific requirements where available.' -model: Claude Opus 4.5 (copilot) +model: Claude Opus 4.6 (1M context) (copilot) handoffs: - label: Test the CodeQL MCP Server tools via workshop agent: ql-mcp-tool-tester @@ -38,7 +38,7 @@ My `ql-mcp-tool-developer` agent: - Runs unit tests: `npm test --workspace=server`. - Runs integration tests: `client/scripts/run-integration-tests.sh`. - Manually validates tools using: `client/src/ql-mcp-client.js`. - - Verifies server startup/shutdown: `server/dist/ql-mcp-server.js`. + - Verifies server startup/shutdown: `server/dist/codeql-development-mcp-server.js`. - Maintains server documentation: - Keeps `server/QL-MCP-SERVER.md` synchronized with tool changes. - Updates the mermaid architecture diagram for structural changes. diff --git a/.github/agents/ql-mcp-tool-tester.md b/.github/agents/ql-mcp-tool-tester.md index c3a43158..adddacc3 100644 --- a/.github/agents/ql-mcp-tool-tester.md +++ b/.github/agents/ql-mcp-tool-tester.md @@ -2,7 +2,7 @@ name: ql-mcp-tool-tester description: An agent for testing and validating tools for the latest QL Development MCP Server. argument-hint: 'Provide the name(s) of the CodeQL Development MCP Server tool(s) to be tested and validated, along with specific testing requirements, where available.' -model: Claude Opus 4.5 (copilot) +model: Claude Opus 4.6 (1M context) (copilot) --- # `ql-mcp-tool-tester` Agent diff --git a/.github/prompts/ql-mcp-server-fix-build-and-test.prompt.md b/.github/prompts/ql-mcp-server-fix-build-and-test.prompt.md index a0ca13c3..4f6509fe 100644 --- a/.github/prompts/ql-mcp-server-fix-build-and-test.prompt.md +++ b/.github/prompts/ql-mcp-server-fix-build-and-test.prompt.md @@ -2,8 +2,7 @@ name: ql-mcp-server-fix-build-and-test description: A prompt for fixing build issues for the QL MCP Server and ensuring extensive testing of the server functionality. agent: ql-mcp-tool-developer -model: Claude Opus 4.5 (copilot) -tools: [agent, edit, execute, memory, read, search, todo, 'codeql-dev-mcp-server/*'] +model: Claude Opus 4.6 (copilot) --- # `ql-mcp-server-fix-build-and-test` Prompt diff --git a/.github/skills/add-mcp-support-for-new-language/SKILL.md b/.github/skills/add-mcp-support-for-new-language/SKILL.md index 74f408a1..9bcb3f4f 100644 --- a/.github/skills/add-mcp-support-for-new-language/SKILL.md +++ b/.github/skills/add-mcp-support-for-new-language/SKILL.md @@ -37,24 +37,27 @@ This skill includes automation scripts to accelerate implementation: ## Quick Reference: Files to Modify -| Category | File Path | Change | -| ----------------- | -------------------------------------------------------------- | --------------------------------------- | -| **TypeScript** | `server/src/prompts/workflow-prompts.ts` | Add to `SUPPORTED_LANGUAGES` | -| | `server/src/lib/query-file-finder.ts` | Add to `LANGUAGE_EXTENSIONS` | -| | `server/src/lib/cli-tool-registry.ts` | Update error message strings | -| **Query Packs** | `server/ql/{language}/tools/src/` | Create 4 tool queries | -| | `server/ql/{language}/tools/test/` | Create test cases | -| **Scripts** | `server/scripts/install-packs.sh` | Add to `VALID_LANGUAGES` + install call | -| | `server/scripts/extract-test-databases.sh` | Add to `VALID_LANGUAGES` | -| | `server/scripts/run-query-unit-tests.sh` | Add to `VALID_LANGUAGES` | -| **Documentation** | `server/ql/README.md` | Add language to list | -| | `server/src/prompts/tools-query-workflow.prompt.md` | Add to supported languages | -| | `server/src/prompts/explain-codeql-query.prompt.md` | Add to language list | -| | `server/src/prompts/document-codeql-query.prompt.md` | Add to language list | -| **Skills** | `.github/skills/create-codeql-query-tdd-generic/SKILL.md` | Add to supported languages | -| | `.github/skills/validate-ql-mcp-server-tools-queries/SKILL.md` | Add to language table | -| **CI/CD** | `.github/workflows/query-unit-tests.yml` | Add to matrix (standard) | -| | `.github/workflows/query-unit-tests-{lang}.yml` | Create if special OS needed | +| Category | File Path | Change | +| ----------------- | -------------------------------------------------------------- | ----------------------------------------------- | +| **TypeScript** | `server/src/prompts/workflow-prompts.ts` | Add to `SUPPORTED_LANGUAGES` | +| | `server/src/lib/query-file-finder.ts` | Add to `LANGUAGE_EXTENSIONS` | +| | `server/src/lib/cli-tool-registry.ts` | Update error message strings | +| **Query Packs** | `server/ql/{language}/tools/src/` | Create 4 tool queries | +| | `server/ql/{language}/tools/test/` | Create test cases | +| **npm Package** | `server/package.json` | Add `ql/{language}/tools/src/` to `files` array | +| **Scripts** | `server/scripts/install-packs.sh` | Add to `VALID_LANGUAGES` + install call | +| | `server/scripts/extract-test-databases.sh` | Add to `VALID_LANGUAGES` | +| | `server/scripts/run-query-unit-tests.sh` | Add to `VALID_LANGUAGES` | +| **Documentation** | `server/ql/README.md` | Add language to list | +| | `server/src/prompts/tools-query-workflow.prompt.md` | Add to supported languages | +| | `server/src/prompts/explain-codeql-query.prompt.md` | Add to language list | +| | `server/src/prompts/document-codeql-query.prompt.md` | Add to language list | +| | `docs/public.md` | Add to Supported Languages table | +| **Skills** | `.github/skills/create-codeql-query-tdd-generic/SKILL.md` | Add to supported languages | +| | `.github/skills/validate-ql-mcp-server-tools-queries/SKILL.md` | Add to language table | +| **CI/CD** | `.github/workflows/query-unit-tests.yml` | Add to matrix (standard) | +| | `.github/workflows/query-unit-tests-{lang}.yml` | Create if special OS needed | +| | `.github/workflows/release.yml` | Add to `LANGUAGES` list in pack publish step | ## Phase 1: Create Query Pack Structure @@ -97,7 +100,7 @@ server/ql/{language}/tools/ Create `server/ql/{language}/tools/src/codeql-pack.yml`: ```yaml -name: ql-mcp-{language}-tools-src +name: advanced-security/ql-mcp-{language}-tools-src version: 0.0.1 library: false dependencies: @@ -109,11 +112,11 @@ dependencies: Create `server/ql/{language}/tools/test/codeql-pack.yml`: ```yaml -name: ql-mcp-{language}-tools-test +name: advanced-security/ql-mcp-{language}-tools-test version: 0.0.1 dependencies: codeql/{language}-queries: '*' - ql-mcp-{language}-tools-src: '*' + advanced-security/ql-mcp-{language}-tools-src: ${workspace} extractor: { language } ``` @@ -545,12 +548,16 @@ Before submitting the PR: - [ ] Pack lock files generated (`codeql-pack.lock.yml`) - [ ] TypeScript source updated and builds successfully - [ ] All scripts updated with new language +- [ ] `server/package.json` `files` array includes `ql/{language}/tools/src/` +- [ ] `.github/workflows/release.yml` `LANGUAGES` list includes new language +- [ ] `docs/public.md` Supported Languages table updated - [ ] Documentation updated (4+ files) - [ ] Skills updated (2+ files) - [ ] CI workflow configured (matrix or dedicated) -- [ ] Server bundle rebuilt (`server/dist/ql-mcp-server.js`) +- [ ] Server bundle rebuilt (`server/dist/codeql-development-mcp-server.js`) - [ ] All existing tests still pass - [ ] New language tests pass +- [ ] `npm pack --dry-run` (from `server/`) includes the new language's `.ql`, `.md`, and `codeql-pack.yml` files ## Success Criteria diff --git a/.github/skills/upgrade-codeql-cli-and-packs/SKILL.md b/.github/skills/upgrade-codeql-cli-and-packs/SKILL.md index 047ed237..47df7817 100644 --- a/.github/skills/upgrade-codeql-cli-and-packs/SKILL.md +++ b/.github/skills/upgrade-codeql-cli-and-packs/SKILL.md @@ -129,15 +129,15 @@ Then re-verify the `cliVersion` is compatible. All `codeql-pack.yml` files under `server/ql/*/tools/`: -| Pack Type | Location | Fields to Update | -| --------- | --------------------------------------------- | ------------------------------------ | -| Source | `server/ql/{lang}/tools/src/codeql-pack.yml` | `version`, `codeql/{lang}-all` | -| Test | `server/ql/{lang}/tools/test/codeql-pack.yml` | `version`, `ql-mcp-{lang}-tools-src` | +| Pack Type | Location | Fields to Update | +| --------- | --------------------------------------------- | ------------------------------------------------------ | +| Source | `server/ql/{lang}/tools/src/codeql-pack.yml` | `version`, `codeql/{lang}-all` | +| Test | `server/ql/{lang}/tools/test/codeql-pack.yml` | `version`, `advanced-security/ql-mcp-{lang}-tools-src` | #### 3.2 Source Pack Template ```yaml -name: ql-mcp-{language}-tools-src +name: advanced-security/ql-mcp-{language}-tools-src version: X.XX.Y # CLI version without 'v' prefix library: false dependencies: @@ -147,10 +147,10 @@ dependencies: #### 3.3 Test Pack Template ```yaml -name: ql-mcp-{language}-tools-test +name: advanced-security/ql-mcp-{language}-tools-test version: X.XX.Y # CLI version without 'v' prefix dependencies: - ql-mcp-{language}-tools-src: X.XX.Y # Same as version field + advanced-security/ql-mcp-{language}-tools-src: ${workspace} extractor: { language } ``` @@ -194,17 +194,17 @@ Some library version upgrades cause non-deterministic output ordering changes. I ## Quick Reference: Languages and Pack Names -| Language | Source Pack | Library Dependency | -| ---------- | --------------------------- | --------------------- | -| actions | ql-mcp-actions-tools-src | codeql/actions-all | -| cpp | ql-mcp-cpp-tools-src | codeql/cpp-all | -| csharp | ql-mcp-csharp-tools-src | codeql/csharp-all | -| go | ql-mcp-go-tools-src | codeql/go-all | -| java | ql-mcp-java-tools-src | codeql/java-all | -| javascript | ql-mcp-javascript-tools-src | codeql/javascript-all | -| python | ql-mcp-python-tools-src | codeql/python-all | -| ruby | ql-mcp-ruby-tools-src | codeql/ruby-all | -| swift | ql-mcp-swift-tools-src | codeql/swift-all | +| Language | Source Pack | Library Dependency | +| ---------- | --------------------------------------------- | --------------------- | +| actions | advanced-security/ql-mcp-actions-tools-src | codeql/actions-all | +| cpp | advanced-security/ql-mcp-cpp-tools-src | codeql/cpp-all | +| csharp | advanced-security/ql-mcp-csharp-tools-src | codeql/csharp-all | +| go | advanced-security/ql-mcp-go-tools-src | codeql/go-all | +| java | advanced-security/ql-mcp-java-tools-src | codeql/java-all | +| javascript | advanced-security/ql-mcp-javascript-tools-src | codeql/javascript-all | +| python | advanced-security/ql-mcp-python-tools-src | codeql/python-all | +| ruby | advanced-security/ql-mcp-ruby-tools-src | codeql/ruby-all | +| swift | advanced-security/ql-mcp-swift-tools-src | codeql/swift-all | ## Lessons Learned @@ -232,6 +232,45 @@ dependencies: Library upgrades can cause non-deterministic ordering changes in query output. These are cosmetic differences - update `.expected` files when the logic is unchanged but output order differs. +### npm Package `files` Field Limitations + +npm's `files` field does **not** support intermediate wildcard patterns like `ql/*/tools/src/`. Each language directory must be listed explicitly: + +```json +"files": [ + "dist/", + "ql/actions/tools/src/", + "ql/cpp/tools/src/", + "ql/csharp/tools/src/", + ... +] +``` + +When adding a new language, add its `ql/{language}/tools/src/` entry to `server/package.json` `files`. + +### Exclude `.qlx` Files from npm + +`server/.npmignore` must contain `*.qlx` to prevent compiled CodeQL query bytecode (which is OS/architecture-specific) from being included in the npm package. + +### Server Logger Writes to stderr Only + +All `logger.info/warn/error/debug` methods write to `stderr` via `console.error`. This is **required** because in stdio transport mode, stdout is reserved exclusively for the MCP JSON-RPC protocol. Any non-protocol bytes on stdout corrupt the message stream. + +### CODEQL_PATH Environment Variable + +The server resolves the CodeQL CLI binary at startup via `resolveCodeQLBinary()` in `cli-executor.ts`. The `CODEQL_PATH` env var takes an **absolute path** to the `codeql` binary, bypassing PATH lookup. This is critical for users who have multiple CodeQL CLI versions installed. + +### Publishing: `codeql pack publish` + +- Use `--threads=-1` (leave 1 core unused) for parallel compilation +- `GITHUB_TOKEN` env var is recognized automatically — no need for `--github-auth-stdin` +- Precompilation is enabled by default (only `--no-precompile` opt-out exists) +- The `codeql pack install` subcommand does **not** have a `--threads` flag + +### LICENSE File Name + +The actual license file is `LICENSE` (no `.md` extension). Workflow steps and documentation must reference `LICENSE`, not `LICENSE.md`. + ## Helper Script See [verify-pack-compatibility.sh](verify-pack-compatibility.sh) for automated compatibility checking. diff --git a/.github/skills/validate-ql-mcp-server-tools-queries/SKILL.md b/.github/skills/validate-ql-mcp-server-tools-queries/SKILL.md index 1fd90bcc..7fe8f681 100644 --- a/.github/skills/validate-ql-mcp-server-tools-queries/SKILL.md +++ b/.github/skills/validate-ql-mcp-server-tools-queries/SKILL.md @@ -320,6 +320,24 @@ This skill exercises the following MCP server tools: | `codeql_pack_install` | Install pack dependencies | | `codeql_pack_ls` | List available packs | +## Important Implementation Notes + +### Server Logger Output Goes to stderr + +All `logger.info/warn/error/debug` methods write to **stderr** (`console.error`), not stdout. This is required because in stdio transport mode, stdout is reserved exclusively for the MCP JSON-RPC protocol wire format. When validating server startup logs (e.g., confirming `CODEQL_PATH` resolution), always check stderr. + +### CODEQL_PATH Environment Variable + +The MCP server resolves the CodeQL CLI binary at startup via `resolveCodeQLBinary()` in `server/src/lib/cli-executor.ts`. When `CODEQL_PATH` is set to an absolute path pointing to a valid `codeql` binary, the server uses that binary for all CodeQL CLI operations instead of searching `PATH`. This is validated per-OS in `.github/workflows/client-integration-tests.yml` (`codeql-path-tests` job). + +### STDIO Transport and stdin EOF + +When the STDIO transport receives an immediate EOF on stdin (e.g., via ` fifo &`). + +### npm Package Includes Tool Query Source Packs + +The published npm package (`@advanced-security/codeql-development-mcp-server`) bundles all tool query source packs under `ql/*/tools/src/`. These are the same `.ql`, `.qll`, `.md`, `codeql-pack.yml`, and `codeql-pack.lock.yml` files — but **never** compiled `.qlx` bytecode (excluded by `server/.npmignore`). + ## Success Criteria Validation passes when **ALL** of the following are true: diff --git a/.github/workflows/client-integration-tests.yml b/.github/workflows/client-integration-tests.yml index ab12c5b8..494bbe3f 100644 --- a/.github/workflows/client-integration-tests.yml +++ b/.github/workflows/client-integration-tests.yml @@ -143,3 +143,233 @@ jobs: run: | echo "## Integration Tests Summary (${{ matrix.os }})" >> $GITHUB_STEP_SUMMARY echo "✅ MCP server integration tests passed on ${{ matrix.os }}" >> $GITHUB_STEP_SUMMARY + + codeql-path-tests: + name: CODEQL_PATH Tests (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + + steps: + - name: CODEQL_PATH Tests - Checkout repository + uses: actions/checkout@v6 + + - name: CODEQL_PATH Tests - Setup Node.js + uses: actions/setup-node@v6 + with: + cache: 'npm' + node-version-file: '.node-version' + + - name: CODEQL_PATH Tests - Install server dependencies + run: npm ci --workspace=server + + - name: CODEQL_PATH Tests - Build server bundle + run: npm run bundle -w server + + - name: CODEQL_PATH Tests - Cache gh-codeql extension (Unix) + if: runner.os != 'Windows' + uses: actions/cache@v4 + with: + path: ~/.local/share/gh-codeql + key: codeql-path-tests-${{ runner.os }}-${{ hashFiles('.codeql-version') }} + + - name: CODEQL_PATH Tests - Cache gh-codeql extension (Windows) + if: runner.os == 'Windows' + uses: actions/cache@v4 + with: + path: ~\AppData\Local\GitHub\gh-codeql + key: codeql-path-tests-${{ runner.os }}-${{ hashFiles('.codeql-version') }} + + - name: CODEQL_PATH Tests - Install CodeQL CLI via gh codeql + id: install-codeql + shell: bash + env: + GH_TOKEN: ${{ github.token }} + run: | + CODEQL_VERSION=$(tr -d '[:space:]' < .codeql-version | sed 's/^v//') + echo "Installing CodeQL CLI version: $CODEQL_VERSION" + + gh extension install github/gh-codeql 2>/dev/null || true + gh codeql set-version "$CODEQL_VERSION" + + INSTALLED=$(gh codeql version --format=terse) + if [[ "$INSTALLED" != "$CODEQL_VERSION" ]]; then + echo "::error::Version mismatch: installed=$INSTALLED expected=$CODEQL_VERSION" + exit 1 + fi + + echo "✅ CodeQL CLI $INSTALLED installed via gh-codeql" + echo "codeql-version=$CODEQL_VERSION" >> "$GITHUB_OUTPUT" + + ## Locate the real CodeQL binary (not the gh-codeql bash stub). + ## The stub delegates to `gh codeql` and works from bash, but Node.js + ## execFile() on Windows cannot execute bash scripts — it needs a real + ## .exe. We search the gh-codeql distribution directory for the binary. + - name: CODEQL_PATH Tests - Locate CodeQL binary + id: locate-codeql + shell: bash + run: | + if [[ "$RUNNER_OS" == "Windows" ]]; then + SEARCH_DIR="${LOCALAPPDATA:-$HOME/AppData/Local}" + CODEQL_BINARY=$(find "$SEARCH_DIR" -path "*gh-codeql*release*" -name "codeql.exe" 2>/dev/null | head -1) + # Convert MSYS path to Windows mixed-mode path for Node.js + if [[ -n "$CODEQL_BINARY" ]]; then + CODEQL_BINARY=$(cygpath -m "$CODEQL_BINARY") + fi + else + for search_dir in "$HOME/.local" "$HOME/Library"; do + if [[ -d "$search_dir" ]]; then + CODEQL_BINARY=$(find "$search_dir" -path "*gh-codeql*release*" -name "codeql" -type f 2>/dev/null | head -1) + if [[ -n "$CODEQL_BINARY" ]]; then + break + fi + fi + done + fi + + if [[ -z "$CODEQL_BINARY" ]]; then + echo "::error::Could not locate CodeQL binary in gh-codeql distribution" + exit 1 + fi + + # Verify the binary works and reports the expected version + ACTUAL=$("$CODEQL_BINARY" version --format=terse 2>/dev/null) + EXPECTED="${{ steps.install-codeql.outputs.codeql-version }}" + if [[ "$ACTUAL" != "$EXPECTED" ]]; then + echo "::error::Binary version mismatch: got '$ACTUAL', expected '$EXPECTED'" + exit 1 + fi + + echo "✅ CodeQL binary verified: $CODEQL_BINARY (version $ACTUAL)" + echo "codeql-binary=$CODEQL_BINARY" >> "$GITHUB_OUTPUT" + + ## Build a PATH that excludes every directory containing 'codeql'. + ## This simulates an environment where the CodeQL CLI is not installed + ## globally, forcing the server to rely solely on CODEQL_PATH. + - name: CODEQL_PATH Tests - Build clean PATH without CodeQL + shell: bash + run: | + CLEAN_PATH="" + IFS=':' read -ra PARTS <<< "$PATH" + for part in "${PARTS[@]}"; do + case "$part" in + *codeql*|*gh-codeql*) ;; + *) + CLEAN_PATH="${CLEAN_PATH:+$CLEAN_PATH:}$part" + ;; + esac + done + + # Verify codeql is NOT findable on the clean PATH + if PATH="$CLEAN_PATH" command -v codeql >/dev/null 2>&1; then + echo "::error::codeql is still discoverable after PATH cleanup" + exit 1 + fi + + echo "✅ codeql is not on the clean PATH" + echo "CLEAN_PATH=$CLEAN_PATH" >> "$GITHUB_ENV" + + ## Test 1: The server must fail early at startup when CODEQL_PATH points + ## to a non-existent file and codeql is not on PATH. + - name: CODEQL_PATH Tests - Test 1 - Fail with invalid CODEQL_PATH + shell: bash + run: | + echo "=== Test 1: Server must fail when CODEQL_PATH is invalid ===" + export PATH="$CLEAN_PATH" + export CODEQL_PATH="/nonexistent/path/to/codeql" + + # Use a long-running Node process as a stdin source to prevent + # immediate EOF (which causes a clean exit instead of a crash). + # Cross-platform: works on Linux, macOS, and Windows (no mkfifo). + node -e "setTimeout(()=>{},999999)" | \ + node server/dist/codeql-development-mcp-server.js >stdout.txt 2>stderr.txt & + SERVER_PID=$! + + # Wait for the process to exit (it should fail within seconds) + sleep 5 + + if kill -0 "$SERVER_PID" 2>/dev/null; then + echo "::error::Server should have exited but is still running" + kill "$SERVER_PID" 2>/dev/null || true + wait "$SERVER_PID" 2>/dev/null || true + cat stderr.txt + exit 1 + fi + + wait "$SERVER_PID" 2>/dev/null + EXIT_CODE=$? + + echo "Exit code: $EXIT_CODE" + cat stderr.txt + + if [[ "$EXIT_CODE" -ne 0 ]] && grep -qi "does not exist" stderr.txt; then + echo "" + echo "✅ PASS: Server failed at startup with expected CODEQL_PATH error" + else + echo "" + echo "::error::Unexpected behavior (exit=$EXIT_CODE)" + exit 1 + fi + + ## Test 2: The server must start without error when CODEQL_PATH points + ## to a valid CodeQL binary, even though codeql is not on PATH. + - name: CODEQL_PATH Tests - Test 2 - Start with valid CODEQL_PATH + shell: bash + run: | + echo "=== Test 2: Server must start when CODEQL_PATH is valid ===" + export PATH="$CLEAN_PATH" + export CODEQL_PATH="${{ steps.locate-codeql.outputs.codeql-binary }}" + + echo "CODEQL_PATH=$CODEQL_PATH" + echo "codeql in PATH: $(command -v codeql 2>/dev/null || echo 'not found')" + + # Use a long-running Node process as a stdin source to keep the + # STDIO transport alive. Cross-platform (no mkfifo needed). + node -e "setTimeout(()=>{},999999)" | \ + node server/dist/codeql-development-mcp-server.js >stdout.txt 2>stderr.txt & + SERVER_PID=$! + + # Give the server time to either start successfully or crash + sleep 5 + + if kill -0 "$SERVER_PID" 2>/dev/null; then + echo "✅ PASS: Server is running after 5 seconds (PID $SERVER_PID)" + echo "--- startup logs ---" + cat stderr.txt + + # Verify stderr confirms CODEQL_PATH was used + if grep -q "CODEQL_PATH" stderr.txt; then + echo "✅ Server logged CODEQL_PATH resolution" + else + echo "⚠️ CODEQL_PATH not found in stderr (non-fatal)" + fi + + # Clean up + kill "$SERVER_PID" 2>/dev/null || true + wait "$SERVER_PID" 2>/dev/null || true + else + wait "$SERVER_PID" 2>/dev/null + EXIT_CODE=$? + echo "::error::Server exited prematurely with code $EXIT_CODE" + cat stderr.txt + exit 1 + fi + + - name: CODEQL_PATH Tests - Summary + shell: bash + run: | + echo "## CODEQL_PATH Tests (${{ matrix.os }})" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Test | Result |" >> $GITHUB_STEP_SUMMARY + echo "| ---- | ------ |" >> $GITHUB_STEP_SUMMARY + echo "| Invalid CODEQL_PATH causes startup failure | ✅ Pass |" >> $GITHUB_STEP_SUMMARY + echo "| Valid CODEQL_PATH (no PATH) starts server | ✅ Pass |" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "| Detail | Value |" >> $GITHUB_STEP_SUMMARY + echo "| ------ | ----- |" >> $GITHUB_STEP_SUMMARY + echo "| CodeQL Version | ${{ steps.install-codeql.outputs.codeql-version }} |" >> $GITHUB_STEP_SUMMARY + echo "| CodeQL Binary | \`${{ steps.locate-codeql.outputs.codeql-binary }}\` |" >> $GITHUB_STEP_SUMMARY + echo "| OS | ${{ matrix.os }} |" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 80bc34b8..4e067655 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,6 +21,7 @@ jobs: permissions: contents: write + packages: write steps: - name: Release - Checkout repository @@ -36,6 +37,7 @@ jobs: with: cache: 'npm' node-version-file: '.node-version' + registry-url: 'https://npm.pkg.github.com' - name: Release - Determine version id: version @@ -88,6 +90,40 @@ jobs: - name: Release - Build server run: npm run build -w server + - name: Release - Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: javascript-typescript + tools: latest + + - name: Release - Publish CodeQL tool query packs + if: startsWith(github.ref, 'refs/tags/') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + LANGUAGES="actions cpp csharp go java javascript python ruby swift" + echo "Publishing CodeQL tool query packs..." + for lang in ${LANGUAGES}; do + PACK_DIR="server/ql/${lang}/tools/src" + if [ -d "${PACK_DIR}" ]; then + echo "📦 Publishing ${PACK_DIR}..." + codeql pack publish --threads=-1 -- "${PACK_DIR}" + echo "✅ Published ${lang} tool query pack" + else + echo "⚠️ Skipping ${lang}: ${PACK_DIR} not found" + fi + done + + - name: Release - Publish npm package + if: startsWith(github.ref, 'refs/tags/') + working-directory: server + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + echo "Publishing @advanced-security/codeql-development-mcp-server to GitHub Packages..." + npm publish + echo "✅ Published npm package to GitHub Packages" + - name: Release - Create distribution directory run: | mkdir -p dist-package/server @@ -103,7 +139,7 @@ jobs: # Copy root files cp README.md dist-package/ - cp LICENSE.md dist-package/ + cp LICENSE dist-package/ # Copy documentation cp -r docs/* dist-package/docs/ @@ -138,6 +174,8 @@ jobs: run: | echo "## Release Summary" >> $GITHUB_STEP_SUMMARY echo "✅ Server built successfully" >> $GITHUB_STEP_SUMMARY + echo "✅ npm package published to GitHub Packages" >> $GITHUB_STEP_SUMMARY + echo "✅ CodeQL tool query packs published to GHCR" >> $GITHUB_STEP_SUMMARY echo "✅ Distribution package created" >> $GITHUB_STEP_SUMMARY echo "✅ Production dependencies installed" >> $GITHUB_STEP_SUMMARY echo "✅ Archive created: codeql-development-mcp-server-${{ steps.version.outputs.version }}.tar.gz" >> $GITHUB_STEP_SUMMARY @@ -148,4 +186,11 @@ jobs: echo "- \`server/node_modules/\` - Production dependencies" >> $GITHUB_STEP_SUMMARY echo "- \`docs/\` - User documentation" >> $GITHUB_STEP_SUMMARY echo "- \`README.md\` - Project overview" >> $GITHUB_STEP_SUMMARY - echo "- \`LICENSE.md\` - CodeQL Terms and Conditions" >> $GITHUB_STEP_SUMMARY + echo "- \`LICENSE\` - CodeQL Terms and Conditions" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### Published CodeQL Packs" >> $GITHUB_STEP_SUMMARY + echo "| Pack | Version |" >> $GITHUB_STEP_SUMMARY + echo "| ---- | ------- |" >> $GITHUB_STEP_SUMMARY + for lang in actions cpp csharp go java javascript python ruby swift; do + echo "| \`advanced-security/ql-mcp-${lang}-tools-src\` | ${{ steps.version.outputs.release_name }} |" >> $GITHUB_STEP_SUMMARY + done diff --git a/.gitignore b/.gitignore index e1731c49..0546ae2a 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,8 @@ codeql-development-mcp-server.code-workspace /query-results.sarif /*.bqrs /evaluator-*.json +/stderr.txt +/stdout.txt # Ignore test scaffolding directory created by query-scaffolding tests .test-query-scaffolding diff --git a/README.md b/README.md index e2fa1690..af10813c 100644 --- a/README.md +++ b/README.md @@ -55,13 +55,23 @@ Please note that this project is released with a [Contributor Code of Conduct](C ## Quick Start -### Download and Install +### Install via npm (recommended) -1. Download the latest release from [GitHub Releases](https://github.com/advanced-security/codeql-development-mcp-server/releases) -2. Extract the archive: +No repository clone needed — install from [GitHub Packages](https://github.com/advanced-security/codeql-development-mcp-server/pkgs/npm/codeql-development-mcp-server): + +```bash +# One-time: route @advanced-security scope to GitHub Packages and authenticate +npm config set @advanced-security:registry https://npm.pkg.github.com +npm login --registry=https://npm.pkg.github.com + +# Install globally +npm install -g @advanced-security/codeql-development-mcp-server +``` + +Or run on-demand without installing globally: ```bash -unzip codeql-development-mcp-server-vX.X.X.zip -d /path/to/destination +npx -y @advanced-security/codeql-development-mcp-server ``` ### VS Code Configuration @@ -77,15 +87,24 @@ Add to your `mcp.json` file: ```json { "servers": { - "codeql-dev-mcp-server": { - "command": "node", - "args": ["/path/to/destination/server/dist/ql-mcp-server.js"], + "ql-mcp": { + "command": "npx", + "args": ["-y", "@advanced-security/codeql-development-mcp-server"], "type": "stdio" } } } ``` +### Install from GitHub Release archive + +1. Download the latest release from [GitHub Releases](https://github.com/advanced-security/codeql-development-mcp-server/releases) +2. Extract the archive: + +```bash +tar -xzf codeql-development-mcp-server-vX.X.X.tar.gz -C /path/to/destination +``` + ### Installing from Source ```bash @@ -99,7 +118,7 @@ npm install && npm run build 1. Restart VS Code 2. Open Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`) 3. Run "GitHub Copilot: List MCP Servers" -4. Confirm `codeql-dev-mcp-server` appears +4. Confirm `ql-mcp` appears ## Supported Languages @@ -117,6 +136,7 @@ npm install && npm run build ## Documentation +- [Public Installation Guide](docs/public.md) - Install and run without cloning the repository - [Getting Started Guide](docs/getting-started.md) - Detailed installation and setup instructions - [Tools Reference](docs/tools-reference.md) - Complete list of available MCP tools and usage examples diff --git a/client/LICENSE b/client/LICENSE new file mode 100644 index 00000000..457fc86f --- /dev/null +++ b/client/LICENSE @@ -0,0 +1,178 @@ +# GitHub CodeQL Terms and Conditions + +These GitHub CodeQL Terms and Conditions ("**Terms**") are a legal +agreement between you (either as an individual or on behalf of an +entity) and GitHub, Inc. regarding your use of the GitHub CodeQL +software and associated documentation (collectively, the +"**Software**"). By using the Software, you accept these Terms. +**Please read all of these Terms;** in many cases, provisions set +forth later in the Terms limit and qualify provisions set forth +earlier in the Terms. If you do not accept these Terms, do not +download, install, use, or copy the Software. + +## Definitions + +In these Terms: + +- "OSI-approved License" means an Open Source Initiative + (OSI)-approved open source software license. + +- "Open Source Codebase" means a codebase that is released under an + OSI-approved License. + +## Use Rights; Scope of License + +The Software is licensed on a per user basis. Here's what you may do +with the Software, but subject to License Restrictions provisions +below: + +- Use the Software to perform academic research. + +- Use the Software to demonstrate the Software. + +- Test CodeQL queries that are released under an OSI-approved + License to confirm that new versions of those queries continue to + find the right vulnerabilities. + +Here's what you may also do with the Software, but only with an Open +Source Codebase and subject to the License Restrictions provisions +below: + +- Perform analysis on the Open Source Codebase. + +- If the Open Source Codebase is hosted and maintained on + GitHub.com, generate CodeQL databases for or during automated + analysis, CI, or CD. + +## License Restrictions + +These Terms do not authorize, and the Software may not be used for any +purpose not expressly set forth above, including: + +- To otherwise or in any other context generate any CodeQL database + for or during automated analysis, CI or CD, whether as part of + normal engineering processes or another context. + +- To otherwise or in any other context use the Software in + connection with any codebase that is not an Open Source Codebase + (e.g., code in a private repo in GitHub). + +_**Please note:** if your use of the Software is under a paid customer +license for GitHub Advanced Security, the restrictions with respect to +automated analysis, CI, and CD and use in connection with non-Open +Source Codebases do not apply._ + +At all times, except (and only to the extent) permitted by applicable +law or applicable third-party license, you will not (and have no right +to): + +- work around any technical limitations in the Software that only + allow you to use it in certain ways; + +- reverse engineer, decompile or disassemble the Software; + +- remove, minimize, block, or modify any notices of GitHub or its + suppliers in the Software; + +- use the Software in any way that is against the law; or + +- share, publish, distribute or lend the Software, provide or make + available the Software as a hosted solution (whether on a + standalone basis or combined, incorporated or integrated with + other software or services) for others to use, or transfer the + Software or these Terms to any third party. + +The Software is licensed, not sold. GitHub reserves all rights not +expressly granted in these Terms. + +## Open Source Software + +The Software may include components licensed under open source +software licenses. Any such licenses are included in the "Open Source +Notices" documentation that is included with the Software. Such +documentation also includes copies of all applicable open source +licenses. + +To the extent the terms of the licenses applicable to open source +components require GitHub to make an offer to provide source code in +connection with the Software, such offer is hereby made, and you may +exercise it by contacting GitHub: https://github.com/contact. + +Unless otherwise agreed to in writing with GitHub, your agreement with +GitHub will always include, at a minimum, these Terms. Open source +software licenses for the Software's source code constitute separate +written agreements. To the limited extent that any open source +software license expressly supersedes these Terms, such open source +license governs your use of the applicable component(s) of the +Software subject to such license. + +## GitHub Trademarks + +These Terms do not grant any right or license to use any of GitHub's +trademarks or logos, including, without limitation, the names GitHub +and CodeQL and any Software logo designs in the "logos" folder of the +Software. You agree not to display or use any of these trademarks or +logos in any manner without GitHub's prior written permission, except +as allowed by GitHub's Logos and Usage Policy located at +https://github.com/logos. GitHub reserves all right, title and +interest in and to all GitHub trademarks and logos. + +## Additional Services + +Auto-Updates: The Software may include an auto-update service. If the +Software automatically enables such service (or, if it is not +automatically enabled and you choose to use it), GitHub will +automatically update the Software when a new version is available. + +## Support + +Because the Software is "as-is," GitHub may not provide support for it. + +## Export Control + +Customer will comply with all applicable export and import laws and +regulations that apply to the Software. + +## Disclaimer; Limitations of Liability + +THE SOFTWARE, INCLUDING ANY ADDITIONAL SERVICES, IS PROVIDED ON AN +"AS-IS" BASIS, AND GITHUB GIVES NO EXPRESS WARRANTIES, GUARANTEES OR +CONDITIONS. TO THE EXTENT PERMITTED BY APPLICABLE LAW, GITHUB +DISCLAIMS THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NON-INFRINGEMENT. YOUR USE OF THE SOFTWARE IS +AT YOUR SOLE RISK. + +TO THE EXTENT PERMITTED BY APPLICABLE LAW, YOU EXPRESSLY UNDERSTAND +AND AGREE THAT (1) YOU CAN RECOVER DIRECT DAMAGES RELATING TO THE +SOFTWARE, INCLUDING ANY ADDITIONAL SERVICES, UP TO U.S. $5.00 FROM +GITHUB AND ITS SUPPLIERS, AND (2) GITHUB WILL NOT BE LIABLE FOR ANY +INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES, +INCLUDING, WITHOUT LIMITATION, ANY DAMAGES FOR LOSS OF PROFITS, +GOODWILL, USE, OR DATA OR OTHER INTANGIBLE LOSSES (EVEN IF GITHUB HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES) RELATING TO THE +SOFTWARE, INCLUDING ANY ADDITIONAL SERVICES. + +## Miscellaneous + +_No Waiver._ The failure of GitHub to exercise or enforce any right or +provision of these Terms will not constitute a waiver of such right or +provision. + +_Entire Agreement._ These Terms, together with any open source +software licenses referenced above, constitute the entire agreement +between you and GitHub regarding your use of the Software, superseding +any prior agreements between you and GitHub (including, but not +limited to, any prior versions of these Terms) regarding such use. + +_Governing Law._ You agree that these Terms and your use of the +Software are governed by the laws of the State of California and any +dispute relating to the Software or your use thereof must be brought +in a tribunal of competent jurisdiction located in or near San +Francisco, California. + +_Modifications._ These Terms may only be modified by a written +amendment signed by an authorized representative of GitHub, or by the +posting by GitHub of a revised version. + +_Contact Us._ Questions about these Terms? Contact us at +https://support.github.com/contact. diff --git a/client/scripts/start-server.sh b/client/scripts/start-server.sh index ae83a486..16d5c95f 100755 --- a/client/scripts/start-server.sh +++ b/client/scripts/start-server.sh @@ -41,7 +41,7 @@ HTTP_HOST="$HTTP_HOST" \ HTTP_PORT="$HTTP_PORT" \ TRANSPORT_MODE="$TRANSPORT_MODE" \ ENABLE_MONITORING_TOOLS="$ENABLE_MONITORING_TOOLS" \ -node server/dist/ql-mcp-server.js > "$CLIENT_DIR/server.log" 2>&1 & +node server/dist/codeql-development-mcp-server.js > "$CLIENT_DIR/server.log" 2>&1 & SERVER_PID=$! echo $SERVER_PID > "$CLIENT_DIR/server.pid" diff --git a/client/src/lib/server-manager.js b/client/src/lib/server-manager.js index 5ff399eb..9dcb4d8a 100644 --- a/client/src/lib/server-manager.js +++ b/client/src/lib/server-manager.js @@ -68,7 +68,7 @@ export async function startServer(options = {}) { env.HTTP_SCHEME = scheme; } - const serverPath = join(ROOT_DIR, "server", "dist", "ql-mcp-server.js"); + const serverPath = join(ROOT_DIR, "server", "dist", "codeql-development-mcp-server.js"); // Start server as detached process const serverProcess = spawn("node", [serverPath], { diff --git a/docs/getting-started.md b/docs/getting-started.md index 35f5325c..24c684b1 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -10,10 +10,29 @@ This guide covers installation, configuration, and usage of the CodeQL Developme ## Installation +### From npm (recommended) + +The package is published to [GitHub Packages](https://github.com/advanced-security/codeql-development-mcp-server/pkgs/npm/codeql-development-mcp-server). Configure npm once, then install: + +```bash +# One-time: route @advanced-security scope to GitHub Packages and authenticate +npm config set @advanced-security:registry https://npm.pkg.github.com +npm login --registry=https://npm.pkg.github.com + +# Install globally +npm install -g @advanced-security/codeql-development-mcp-server +``` + +Or use `npx` to run without a global install: + +```bash +npx -y @advanced-security/codeql-development-mcp-server +``` + ### From GitHub Releases 1. Download the latest release from [Releases](https://github.com/advanced-security/codeql-development-mcp-server/releases) -2. Extract: `unzip codeql-development-mcp-server-vX.X.X.zip -d /path/to/destination` +2. Extract: `tar -xzf codeql-development-mcp-server-vX.X.X.tar.gz -C /path/to/destination` ### From Source @@ -33,12 +52,28 @@ Add to your `mcp.json` file: | Windows | `%APPDATA%\Code\User\mcp.json` | | Linux | `~/.config/Code/User/mcp.json` | +### Using npx (recommended) + +```json +{ + "servers": { + "ql-mcp": { + "command": "npx", + "args": ["-y", "@advanced-security/codeql-development-mcp-server"], + "type": "stdio" + } + } +} +``` + +### Using a local path (from source or release archive) + ```json { "servers": { - "codeql-dev-mcp-server": { + "ql-mcp": { "command": "node", - "args": ["/path/to/destination/server/dist/ql-mcp-server.js"], + "args": ["/path/to/destination/server/dist/codeql-development-mcp-server.js"], "type": "stdio" } } @@ -47,19 +82,19 @@ Add to your `mcp.json` file: ## Environment Variables -| Variable | Description | Default | -| ---------------- | -------------------- | ------- | -| `TRANSPORT_MODE` | `stdio` or `http` | `stdio` | -| `PORT` | HTTP port | `3000` | -| `DEBUG` | Enable debug logging | `false` | -| `CODEQL_PATH` | Path to CodeQL CLI | (PATH) | +| Variable | Description | Default | +| ---------------- | -------------------------------------- | -------- | +| `CODEQL_PATH` | Absolute path to the CodeQL CLI binary | `codeql` | +| `TRANSPORT_MODE` | `stdio` or `http` | `stdio` | +| `HTTP_PORT` | HTTP port | `3000` | +| `DEBUG` | Enable debug logging | `false` | ## Verification 1. Restart VS Code 2. Open Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`) 3. Run "GitHub Copilot: List MCP Servers" -4. Confirm `codeql-dev-mcp-server` appears +4. Confirm `ql-mcp` appears ## Troubleshooting diff --git a/docs/public.md b/docs/public.md new file mode 100644 index 00000000..ee8164bb --- /dev/null +++ b/docs/public.md @@ -0,0 +1,262 @@ +# CodeQL Development MCP Server — Public Installation Guide + +> Install and run the CodeQL Development MCP Server and its tool query packs without cloning the repository. + +## Overview + +The **CodeQL Development MCP Server** (`@advanced-security/codeql-development-mcp-server`) is a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that provides AI assistants with tools, prompts, and resources for developing CodeQL queries. It is published as a public npm package and its companion CodeQL tool query packs are published to the GitHub Container Registry (GHCR). + +Users install the server via `npm` and the tool query packs via `codeql pack download` — no repository clone required. + +## Prerequisites + +| Dependency | Minimum Version | Purpose | +| ---------------------------------------------------------------------------------------------------- | --------------- | ------------------------------- | +| [Node.js](https://nodejs.org/) | v22.0.0 | Runtime for the MCP server | +| [CodeQL CLI](https://github.com/github/codeql-cli-binaries/releases) | Latest | Query compilation and execution | +| [VS Code](https://code.visualstudio.com/) with [GitHub Copilot](https://github.com/features/copilot) | Latest | IDE with MCP support | + +Verify prerequisites: + +```bash +node --version # >= v22.0.0 +codeql --version # any recent release +``` + +## Installation + +### 1. Install the MCP Server (npm) + +The server is published as a scoped package on [GitHub Packages](https://github.com/advanced-security/codeql-development-mcp-server/pkgs/npm/codeql-development-mcp-server). Before installing, configure npm to fetch `@advanced-security` packages from GitHub Packages: + +```bash +# One-time setup: route the @advanced-security scope to GitHub Packages +npm config set @advanced-security:registry https://npm.pkg.github.com + +# Authenticate (requires a GitHub PAT with read:packages scope) +npm login --registry=https://npm.pkg.github.com +``` + +Then install: + +```bash +# Global install (makes the `codeql-development-mcp-server` command available) +npm install -g @advanced-security/codeql-development-mcp-server + +# Or run on-demand without installing globally +npx -y @advanced-security/codeql-development-mcp-server +``` + +The package ships the bundled server (`dist/codeql-development-mcp-server.js`), production dependencies, and the CodeQL tool query source packs (`ql/*/tools/src/`). + +### 2. Install CodeQL Tool Query Packs (optional) + +The server ships with embedded copies of its tool query packs. If you prefer to manage the packs independently, or want to pin a specific version, download them from GHCR: + +```bash +# Download all tool query packs (one per supported language) +codeql pack download advanced-security/ql-mcp-actions-tools-src +codeql pack download advanced-security/ql-mcp-cpp-tools-src +codeql pack download advanced-security/ql-mcp-csharp-tools-src +codeql pack download advanced-security/ql-mcp-go-tools-src +codeql pack download advanced-security/ql-mcp-java-tools-src +codeql pack download advanced-security/ql-mcp-javascript-tools-src +codeql pack download advanced-security/ql-mcp-python-tools-src +codeql pack download advanced-security/ql-mcp-ruby-tools-src +codeql pack download advanced-security/ql-mcp-swift-tools-src +``` + +To pin a version, append `@`: + +```bash +codeql pack download advanced-security/ql-mcp-javascript-tools-src@2.23.9 +``` + +Each tool query pack provides AST printing, control-flow graph printing, and call-graph queries used by the MCP server to give AI assistants structural insight into CodeQL databases. + +## VS Code Configuration + +Add the server to your VS Code MCP configuration (`mcp.json`): + +| OS | Default Location | +| ------- | -------------------------------------------------- | +| macOS | `~/Library/Application Support/Code/User/mcp.json` | +| Linux | `~/.config/Code/User/mcp.json` | +| Windows | `%APPDATA%\Code\User\mcp.json` | + +### Recommended: `npx` (no global install needed) + +```json +{ + "servers": { + "ql-mcp": { + "command": "npx", + "args": ["-y", "@advanced-security/codeql-development-mcp-server"], + "type": "stdio" + } + } +} +``` + +### Alternative: Global install + +```json +{ + "servers": { + "ql-mcp": { + "command": "codeql-development-mcp-server", + "type": "stdio" + } + } +} +``` + +### Alternative: Workspace-level configuration + +Create a `.vscode/mcp.json` in your project root to share the configuration with your team: + +```json +{ + "servers": { + "ql-mcp": { + "command": "npx", + "args": ["-y", "@advanced-security/codeql-development-mcp-server"], + "type": "stdio" + } + } +} +``` + +## Environment Variables + +| Variable | Description | Default | +| ---------------- | -------------------------------------- | -------- | +| `CODEQL_PATH` | Absolute path to the CodeQL CLI binary | `codeql` | +| `TRANSPORT_MODE` | `stdio` or `http` | `stdio` | +| `HTTP_PORT` | HTTP port (when using `http`) | `3000` | +| `DEBUG` | Enable debug logging | `false` | + +`CODEQL_PATH` is the most important variable. When set, the server uses the specified binary instead of looking for `codeql` on `PATH`. This lets you pin a specific CodeQL CLI version independently of what is installed globally: + +```bash +# Example: point the server at a specific CodeQL installation +export CODEQL_PATH="$HOME/codeql-cli/codeql" +``` + +Or configure it directly in your `mcp.json`: + +```json +{ + "servers": { + "ql-mcp": { + "command": "npx", + "args": ["-y", "@advanced-security/codeql-development-mcp-server"], + "type": "stdio", + "env": { + "CODEQL_PATH": "/path/to/codeql-cli/codeql" + } + } + } +} +``` + +## Verification + +1. Restart VS Code (or reload the window). +2. Open the Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`). +3. Run **MCP: List Servers**. +4. Confirm `ql-mcp` appears and shows a running status. +5. Open Copilot Chat in Agent Mode and ask: _"List available CodeQL tools."_ + +## Supported Languages + +The MCP server includes tool query packs for the following CodeQL languages: + +| Language | CodeQL Identifier | Tool Query Pack (GHCR) | +| --------------------- | ----------------- | ----------------------------------------------- | +| GitHub Actions | `actions` | `advanced-security/ql-mcp-actions-tools-src` | +| C/C++ | `cpp` | `advanced-security/ql-mcp-cpp-tools-src` | +| C# | `csharp` | `advanced-security/ql-mcp-csharp-tools-src` | +| Go | `go` | `advanced-security/ql-mcp-go-tools-src` | +| Java/Kotlin | `java` | `advanced-security/ql-mcp-java-tools-src` | +| JavaScript/TypeScript | `javascript` | `advanced-security/ql-mcp-javascript-tools-src` | +| Python | `python` | `advanced-security/ql-mcp-python-tools-src` | +| Ruby | `ruby` | `advanced-security/ql-mcp-ruby-tools-src` | +| Swift | `swift` | `advanced-security/ql-mcp-swift-tools-src` | + +Each pack contains the following tool queries used by the server: + +| Query Directory | Purpose | +| ---------------- | ----------------------------------------------------- | +| `PrintAST/` | Print the Abstract Syntax Tree for a source file | +| `PrintCFG/` | Print the Control Flow Graph for a function or method | +| `CallGraphFrom/` | Find outgoing call-graph edges from a function | +| `CallGraphTo/` | Find incoming call-graph edges to a function | + +> **Note:** The `actions` language pack currently provides `PrintAST` and `PrintCFG` only. All other languages include all four query directories. + +## Updating + +### Update the MCP Server + +```bash +# If installed globally +npm update -g @advanced-security/codeql-development-mcp-server + +# If using npx, the latest version is fetched automatically +# (clear the npx cache to force a refresh) +npx -y @advanced-security/codeql-development-mcp-server@latest +``` + +### Update the Tool Query Packs + +```bash +# Re-download to get the latest versions +codeql pack download advanced-security/ql-mcp-javascript-tools-src +``` + +The server and its tool query packs follow [Semantic Versioning](https://semver.org/). Their version numbers are kept in sync: when the server is at version `X.Y.Z`, each tool query pack is also published at version `X.Y.Z`. + +## Package Details + +### npm Package + +| Field | Value | +| ----------- | ---------------------------------------------------------------------------------------------------------------------------- | +| Name | `@advanced-security/codeql-development-mcp-server` | +| Registry | [GitHub Packages](https://github.com/advanced-security/codeql-development-mcp-server/pkgs/npm/codeql-development-mcp-server) | +| Binary | `codeql-development-mcp-server` | +| Entry Point | `dist/codeql-development-mcp-server.js` | +| License | [GitHub CodeQL Terms and Conditions](https://github.com/github/codeql-cli-binaries/blob/main/LICENSE.md) | + +### CodeQL Packs (GHCR) + +Published to the GitHub Container Registry under the `advanced-security` scope. Each pack's `codeql-pack.yml` follows the `/` naming convention required for `codeql pack publish`: + +```yaml +# Example: server/ql/javascript/tools/src/codeql-pack.yml +name: advanced-security/ql-mcp-javascript-tools-src +version: 2.23.9 +library: false +dependencies: + codeql/javascript-all: 2.6.19 +``` + +## Troubleshooting + +| Problem | Solution | +| ---------------------------- | -------------------------------------------------------------------------------------------------------- | +| Server not listed in VS Code | Verify your `mcp.json` syntax, ensure Node.js is on PATH, and restart VS Code. | +| `npx` times out or fails | Run `npm cache clean --force` and retry. Ensure `.npmrc` routes `@advanced-security` to GitHub Packages. | +| CodeQL CLI errors | Run `codeql --version` to confirm the CLI is installed and on PATH. Set `CODEQL_PATH` if needed. | +| Tool query pack not found | Run `codeql pack download advanced-security/ql-mcp--tools-src` to fetch it from GHCR. | +| Permission denied | On macOS/Linux, check file permissions or use `sudo` for global npm installs. | +| Version mismatch warnings | Ensure the server npm package version matches the tool query pack versions. | + +## Further Reading + +- [Tools Reference](./tools-reference.md) — Complete list of MCP tools and usage examples +- [Getting Started (developer)](./getting-started.md) — Building from source and advanced configuration +- [VS Code MCP Server Documentation](https://code.visualstudio.com/docs/copilot/customization/mcp-servers) — Configuring MCP servers in VS Code +- [Publishing and Using CodeQL Packs](https://docs.github.com/en/code-security/tutorials/customize-code-scanning/publishing-and-using-codeql-packs) — Managing CodeQL packs with the CodeQL CLI +- [Model Context Protocol](https://modelcontextprotocol.io/) — The MCP specification diff --git a/package-lock.json b/package-lock.json index bff03fda..fd1921b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "codeql-development-mcp-server_repo", "version": "2.23.9", - "license": "MIT", + "license": "SEE LICENSE IN LICENSE", "workspaces": [ "client", "server" @@ -28,7 +28,7 @@ "client": { "name": "codeql-development-mcp-server_client", "version": "2.23.9", - "license": "MIT", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "dotenv": "^17.2.4", @@ -49,6 +49,10 @@ "npm": ">=11.6.2" } }, + "node_modules/@advanced-security/codeql-development-mcp-server": { + "resolved": "server", + "link": true + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -2017,10 +2021,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/codeql-development-mcp-server": { - "resolved": "server", - "link": true - }, "node_modules/codeql-development-mcp-server_client": { "resolved": "client", "link": true @@ -4398,9 +4398,9 @@ } }, "server": { - "name": "codeql-development-mcp-server", + "name": "@advanced-security/codeql-development-mcp-server", "version": "2.23.9", - "license": "MIT", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "cors": "^2.8.6", @@ -4411,7 +4411,7 @@ "zod": "^3.25.76" }, "bin": { - "codeql-mcp-server": "dist/ql-mcp-server.js" + "codeql-development-mcp-server": "dist/codeql-development-mcp-server.js" }, "devDependencies": { "@eslint/js": "^9.39.2", diff --git a/server/.gitignore b/server/.gitignore index 37bcf559..fe0e79eb 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,3 +1,3 @@ !dist/ -!dist/ql-mcp-server.js -!dist/ql-mcp-server.js.map +!dist/codeql-development-mcp-server.js +!dist/codeql-development-mcp-server.js.map diff --git a/server/.npmignore b/server/.npmignore new file mode 100644 index 00000000..b21b4310 --- /dev/null +++ b/server/.npmignore @@ -0,0 +1,3 @@ +# Exclude compiled CodeQL query bytecode files. +# These are OS/architecture-specific and must be generated locally by `codeql pack install`. +*.qlx diff --git a/server/LICENSE b/server/LICENSE new file mode 100644 index 00000000..457fc86f --- /dev/null +++ b/server/LICENSE @@ -0,0 +1,178 @@ +# GitHub CodeQL Terms and Conditions + +These GitHub CodeQL Terms and Conditions ("**Terms**") are a legal +agreement between you (either as an individual or on behalf of an +entity) and GitHub, Inc. regarding your use of the GitHub CodeQL +software and associated documentation (collectively, the +"**Software**"). By using the Software, you accept these Terms. +**Please read all of these Terms;** in many cases, provisions set +forth later in the Terms limit and qualify provisions set forth +earlier in the Terms. If you do not accept these Terms, do not +download, install, use, or copy the Software. + +## Definitions + +In these Terms: + +- "OSI-approved License" means an Open Source Initiative + (OSI)-approved open source software license. + +- "Open Source Codebase" means a codebase that is released under an + OSI-approved License. + +## Use Rights; Scope of License + +The Software is licensed on a per user basis. Here's what you may do +with the Software, but subject to License Restrictions provisions +below: + +- Use the Software to perform academic research. + +- Use the Software to demonstrate the Software. + +- Test CodeQL queries that are released under an OSI-approved + License to confirm that new versions of those queries continue to + find the right vulnerabilities. + +Here's what you may also do with the Software, but only with an Open +Source Codebase and subject to the License Restrictions provisions +below: + +- Perform analysis on the Open Source Codebase. + +- If the Open Source Codebase is hosted and maintained on + GitHub.com, generate CodeQL databases for or during automated + analysis, CI, or CD. + +## License Restrictions + +These Terms do not authorize, and the Software may not be used for any +purpose not expressly set forth above, including: + +- To otherwise or in any other context generate any CodeQL database + for or during automated analysis, CI or CD, whether as part of + normal engineering processes or another context. + +- To otherwise or in any other context use the Software in + connection with any codebase that is not an Open Source Codebase + (e.g., code in a private repo in GitHub). + +_**Please note:** if your use of the Software is under a paid customer +license for GitHub Advanced Security, the restrictions with respect to +automated analysis, CI, and CD and use in connection with non-Open +Source Codebases do not apply._ + +At all times, except (and only to the extent) permitted by applicable +law or applicable third-party license, you will not (and have no right +to): + +- work around any technical limitations in the Software that only + allow you to use it in certain ways; + +- reverse engineer, decompile or disassemble the Software; + +- remove, minimize, block, or modify any notices of GitHub or its + suppliers in the Software; + +- use the Software in any way that is against the law; or + +- share, publish, distribute or lend the Software, provide or make + available the Software as a hosted solution (whether on a + standalone basis or combined, incorporated or integrated with + other software or services) for others to use, or transfer the + Software or these Terms to any third party. + +The Software is licensed, not sold. GitHub reserves all rights not +expressly granted in these Terms. + +## Open Source Software + +The Software may include components licensed under open source +software licenses. Any such licenses are included in the "Open Source +Notices" documentation that is included with the Software. Such +documentation also includes copies of all applicable open source +licenses. + +To the extent the terms of the licenses applicable to open source +components require GitHub to make an offer to provide source code in +connection with the Software, such offer is hereby made, and you may +exercise it by contacting GitHub: https://github.com/contact. + +Unless otherwise agreed to in writing with GitHub, your agreement with +GitHub will always include, at a minimum, these Terms. Open source +software licenses for the Software's source code constitute separate +written agreements. To the limited extent that any open source +software license expressly supersedes these Terms, such open source +license governs your use of the applicable component(s) of the +Software subject to such license. + +## GitHub Trademarks + +These Terms do not grant any right or license to use any of GitHub's +trademarks or logos, including, without limitation, the names GitHub +and CodeQL and any Software logo designs in the "logos" folder of the +Software. You agree not to display or use any of these trademarks or +logos in any manner without GitHub's prior written permission, except +as allowed by GitHub's Logos and Usage Policy located at +https://github.com/logos. GitHub reserves all right, title and +interest in and to all GitHub trademarks and logos. + +## Additional Services + +Auto-Updates: The Software may include an auto-update service. If the +Software automatically enables such service (or, if it is not +automatically enabled and you choose to use it), GitHub will +automatically update the Software when a new version is available. + +## Support + +Because the Software is "as-is," GitHub may not provide support for it. + +## Export Control + +Customer will comply with all applicable export and import laws and +regulations that apply to the Software. + +## Disclaimer; Limitations of Liability + +THE SOFTWARE, INCLUDING ANY ADDITIONAL SERVICES, IS PROVIDED ON AN +"AS-IS" BASIS, AND GITHUB GIVES NO EXPRESS WARRANTIES, GUARANTEES OR +CONDITIONS. TO THE EXTENT PERMITTED BY APPLICABLE LAW, GITHUB +DISCLAIMS THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NON-INFRINGEMENT. YOUR USE OF THE SOFTWARE IS +AT YOUR SOLE RISK. + +TO THE EXTENT PERMITTED BY APPLICABLE LAW, YOU EXPRESSLY UNDERSTAND +AND AGREE THAT (1) YOU CAN RECOVER DIRECT DAMAGES RELATING TO THE +SOFTWARE, INCLUDING ANY ADDITIONAL SERVICES, UP TO U.S. $5.00 FROM +GITHUB AND ITS SUPPLIERS, AND (2) GITHUB WILL NOT BE LIABLE FOR ANY +INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES, +INCLUDING, WITHOUT LIMITATION, ANY DAMAGES FOR LOSS OF PROFITS, +GOODWILL, USE, OR DATA OR OTHER INTANGIBLE LOSSES (EVEN IF GITHUB HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES) RELATING TO THE +SOFTWARE, INCLUDING ANY ADDITIONAL SERVICES. + +## Miscellaneous + +_No Waiver._ The failure of GitHub to exercise or enforce any right or +provision of these Terms will not constitute a waiver of such right or +provision. + +_Entire Agreement._ These Terms, together with any open source +software licenses referenced above, constitute the entire agreement +between you and GitHub regarding your use of the Software, superseding +any prior agreements between you and GitHub (including, but not +limited to, any prior versions of these Terms) regarding such use. + +_Governing Law._ You agree that these Terms and your use of the +Software are governed by the laws of the State of California and any +dispute relating to the Software or your use thereof must be brought +in a tribunal of competent jurisdiction located in or near San +Francisco, California. + +_Modifications._ These Terms may only be modified by a written +amendment signed by an authorized representative of GitHub, or by the +posting by GitHub of a revised version. + +_Contact Us._ Questions about these Terms? Contact us at +https://support.github.com/contact. diff --git a/server/README.md b/server/README.md index 9af4dd2c..1b838ab8 100644 --- a/server/README.md +++ b/server/README.md @@ -14,24 +14,25 @@ The server can run in two modes: **STDIO Mode (recommended for VS Code):** ```bash -node dist/ql-mcp-server.js +node dist/codeql-development-mcp-server.js ``` **HTTP Mode (for debugging):** ```bash -TRANSPORT_MODE=http node dist/ql-mcp-server.js +TRANSPORT_MODE=http node dist/codeql-development-mcp-server.js ``` ### Configuration Configure the server using environment variables: -| Variable | Description | Default | -| ---------------- | -------------------------------- | ------- | -| `TRANSPORT_MODE` | `stdio` or `http` | `stdio` | -| `PORT` | HTTP port (when using HTTP mode) | `3000` | -| `DEBUG` | Enable debug logging | `false` | +| Variable | Description | Default | +| ---------------- | -------------------------------------- | -------- | +| `CODEQL_PATH` | Absolute path to the CodeQL CLI binary | `codeql` | +| `TRANSPORT_MODE` | `stdio` or `http` | `stdio` | +| `HTTP_PORT` | HTTP port (when using HTTP mode) | `3000` | +| `DEBUG` | Enable debug logging | `false` | ## Subproject Structure @@ -40,30 +41,28 @@ The `server` subproject is structured as follows: ```text server/ ├── dist/ # Base directory for compiled output -│ ├── ql-mcp-server.js # Compiled, bundled MCP server entry point -│ └── ql-mcp-server.js.map # Source map for the bundled MCP server +│ ├── codeql-development-mcp-server.js # Compiled, bundled MCP server entry point +│ └── codeql-development-mcp-server.js.map # Source map for the bundled MCP server ├── src/ # TypeScript source library code -│ ├── ql-mcp-server.ts # MCP server entry point +│ ├── codeql-development-mcp-server.ts # MCP server entry point │ ├── lib/ # Core library code │ ├── tools/ # Implementation of MCP tools ├── test/ # Base directory for tests │ ├── src/ # Base directory for test source files │ │ ├── lib/ # Test files for core library code │ │ ├── tools/ # Test files for MCP tools -├── .eslintrc.json # ESLint configuration -├── .prettierrc # Prettier configuration -├── esbuild.config.mjs # esbuild configuration for bundling +├── eslint.config.mjs # ESLint configuration +├── esbuild.config.js # esbuild configuration for bundling ├── package.json # NPM package configuration ├── tsconfig.json # TypeScript configuration -├── README.md # This README file -└── QL-MCP-SERVER.md # Documentation of MCP server primitives +└── README.md # This README file ``` ## Troubleshooting ### Server Won't Start -1. **Check Node.js version**: The server requires Node.js v25.2.1 or later +1. **Check Node.js version**: The server requires Node.js v22.0.0 or later ```bash node --version @@ -72,7 +71,7 @@ server/ 2. **Verify the entry point exists**: ```bash - ls dist/ql-mcp-server.js + ls dist/codeql-development-mcp-server.js ``` 3. **Check for missing dependencies**: If using the distributed package, ensure `node_modules` is present @@ -85,7 +84,7 @@ server/ codeql --version ``` -2. **Check CodeQL is in PATH**: The server expects `codeql` to be available in the system PATH +2. **Check CodeQL is in PATH**: The server expects `codeql` to be available in the system PATH, or set `CODEQL_PATH` to the absolute path of the CodeQL CLI binary 3. **Ensure you have a valid database**: Most query tools require a CodeQL database @@ -100,7 +99,7 @@ server/ 2. **Try a different port**: ```bash - TRANSPORT_MODE=http PORT=8080 node dist/ql-mcp-server.js + TRANSPORT_MODE=http HTTP_PORT=8080 node dist/codeql-development-mcp-server.js ``` ### VS Code Integration Issues diff --git a/server/dist/ql-mcp-server.js b/server/dist/codeql-development-mcp-server.js similarity index 97% rename from server/dist/ql-mcp-server.js rename to server/dist/codeql-development-mcp-server.js index da6e336a..e5105bd7 100755 --- a/server/dist/ql-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -16,17 +16,17 @@ var init_logger = __esm({ "use strict"; logger = { info: (message, ...args) => { - console.log(`[INFO] ${(/* @__PURE__ */ new Date()).toISOString()} ${message}`, ...args); + console.error(`[INFO] ${(/* @__PURE__ */ new Date()).toISOString()} ${message}`, ...args); }, error: (message, ...args) => { console.error(`[ERROR] ${(/* @__PURE__ */ new Date()).toISOString()} ${message}`, ...args); }, warn: (message, ...args) => { - console.warn(`[WARN] ${(/* @__PURE__ */ new Date()).toISOString()} ${message}`, ...args); + console.error(`[WARN] ${(/* @__PURE__ */ new Date()).toISOString()} ${message}`, ...args); }, debug: (message, ...args) => { if (process.env.DEBUG) { - console.debug(`[DEBUG] ${(/* @__PURE__ */ new Date()).toISOString()} ${message}`, ...args); + console.error(`[DEBUG] ${(/* @__PURE__ */ new Date()).toISOString()} ${message}`, ...args); } } }; @@ -44,11 +44,16 @@ __export(cli_executor_exports, { executeCodeQLCommand: () => executeCodeQLCommand, executeQLTCommand: () => executeQLTCommand, getCommandHelp: () => getCommandHelp, + getResolvedCodeQLDir: () => getResolvedCodeQLDir, + resetResolvedCodeQLBinary: () => resetResolvedCodeQLBinary, + resolveCodeQLBinary: () => resolveCodeQLBinary, sanitizeCLIArgument: () => sanitizeCLIArgument, sanitizeCLIArguments: () => sanitizeCLIArguments, validateCommandExists: () => validateCommandExists }); import { execFile } from "child_process"; +import { existsSync } from "fs"; +import { basename, delimiter, dirname, isAbsolute } from "path"; import { promisify } from "util"; function enableTestCommands() { testCommands = /* @__PURE__ */ new Set([ @@ -65,6 +70,39 @@ function disableTestCommands() { function isCommandAllowed(command) { return ALLOWED_COMMANDS.has(command) || testCommands !== null && testCommands.has(command); } +function resolveCodeQLBinary() { + const envPath = process.env.CODEQL_PATH; + if (!envPath) { + resolvedCodeQLDir = null; + return "codeql"; + } + const base = basename(envPath).toLowerCase(); + const validBaseNames = ["codeql", "codeql.exe", "codeql.cmd"]; + if (!validBaseNames.includes(base)) { + throw new Error( + `CODEQL_PATH must point to a CodeQL CLI binary (expected basename: codeql), got: ${base}` + ); + } + if (!isAbsolute(envPath)) { + throw new Error( + `CODEQL_PATH must be an absolute path, got: ${envPath}` + ); + } + if (!existsSync(envPath)) { + throw new Error( + `CODEQL_PATH points to a file that does not exist: ${envPath}` + ); + } + resolvedCodeQLDir = dirname(envPath); + logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`); + return envPath; +} +function getResolvedCodeQLDir() { + return resolvedCodeQLDir; +} +function resetResolvedCodeQLBinary() { + resolvedCodeQLDir = null; +} function sanitizeCLIArgument(arg) { if (arg.includes("\0")) { throw new Error(`CLI argument contains null byte: argument rejected for security`); @@ -89,6 +127,11 @@ function getSafeEnvironment(additionalEnv) { safeEnv[key] = value; } } + if (resolvedCodeQLDir && safeEnv.PATH) { + safeEnv.PATH = `${resolvedCodeQLDir}${delimiter}${safeEnv.PATH}`; + } else if (resolvedCodeQLDir) { + safeEnv.PATH = resolvedCodeQLDir; + } if (additionalEnv) { Object.assign(safeEnv, additionalEnv); } @@ -217,7 +260,7 @@ async function validateCommandExists(command) { return false; } } -var execFileAsync, ALLOWED_COMMANDS, testCommands, SAFE_ENV_VARS, SAFE_ENV_PREFIXES, DANGEROUS_CONTROL_CHARS; +var execFileAsync, ALLOWED_COMMANDS, testCommands, SAFE_ENV_VARS, SAFE_ENV_PREFIXES, DANGEROUS_CONTROL_CHARS, resolvedCodeQLDir; var init_cli_executor = __esm({ "src/lib/cli-executor.ts"() { "use strict"; @@ -265,10 +308,60 @@ var init_cli_executor = __esm({ // Node.js-specific variables (for npm, etc.) ]; DANGEROUS_CONTROL_CHARS = /[\x01-\x08\x0B\x0C\x0E-\x1F]/; + resolvedCodeQLDir = null; } }); -// src/ql-mcp-server.ts +// src/utils/package-paths.ts +var package_paths_exports = {}; +__export(package_paths_exports, { + getPackageRootDir: () => getPackageRootDir, + getWorkspaceRootDir: () => getWorkspaceRootDir, + packageRootDir: () => packageRootDir, + resolveToolQueryPackPath: () => resolveToolQueryPackPath, + workspaceRootDir: () => workspaceRootDir +}); +import { dirname as dirname3, resolve } from "path"; +import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs"; +import { fileURLToPath } from "url"; +function isRunningFromSource(dir) { + const normalized = dir.replace(/\\/g, "/"); + return normalized.includes("/src/"); +} +function getPackageRootDir(currentDir = __dirname) { + return isRunningFromSource(currentDir) ? resolve(currentDir, "..", "..") : resolve(currentDir, ".."); +} +function getWorkspaceRootDir(packageRoot) { + const pkgRoot = packageRoot ?? getPackageRootDir(); + const parentDir = resolve(pkgRoot, ".."); + try { + const parentPkgPath = resolve(parentDir, "package.json"); + if (existsSync2(parentPkgPath)) { + const parentPkg = JSON.parse(readFileSync2(parentPkgPath, "utf8")); + if (parentPkg.workspaces) { + return parentDir; + } + } + } catch { + } + return pkgRoot; +} +function resolveToolQueryPackPath(language, packageRoot) { + const pkgRoot = packageRoot ?? getPackageRootDir(); + return resolve(pkgRoot, "ql", language, "tools", "src"); +} +var __filename, __dirname, packageRootDir, workspaceRootDir; +var init_package_paths = __esm({ + "src/utils/package-paths.ts"() { + "use strict"; + __filename = fileURLToPath(import.meta.url); + __dirname = dirname3(__filename); + packageRootDir = getPackageRootDir(); + workspaceRootDir = getWorkspaceRootDir(packageRootDir); + } +}); + +// src/codeql-development-mcp-server.ts import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; @@ -290,7 +383,7 @@ import { z } from "zod"; init_cli_executor(); init_logger(); import { writeFileSync, readFileSync } from "fs"; -import { dirname, isAbsolute } from "path"; +import { dirname as dirname2, isAbsolute as isAbsolute2 } from "path"; import { mkdirSync } from "fs"; var BUILT_IN_EVALUATORS = { "json-decode": "JSON format decoder for query results", @@ -333,7 +426,7 @@ async function evaluateWithJsonDecoder(bqrsPath, outputPath) { }; } const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".json"); - mkdirSync(dirname(defaultOutputPath), { recursive: true }); + mkdirSync(dirname2(defaultOutputPath), { recursive: true }); writeFileSync(defaultOutputPath, result.stdout); return { success: true, @@ -361,7 +454,7 @@ async function evaluateWithCsvDecoder(bqrsPath, outputPath) { }; } const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".csv"); - mkdirSync(dirname(defaultOutputPath), { recursive: true }); + mkdirSync(dirname2(defaultOutputPath), { recursive: true }); writeFileSync(defaultOutputPath, result.stdout); return { success: true, @@ -407,7 +500,7 @@ async function evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath) { } const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata); const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".md"); - mkdirSync(dirname(defaultOutputPath), { recursive: true }); + mkdirSync(dirname2(defaultOutputPath), { recursive: true }); writeFileSync(defaultOutputPath, mermaidContent); return { success: true, @@ -523,7 +616,7 @@ async function evaluateQueryResults(bqrsPath, queryPath, evaluationFunction, out case "mermaid-graph": return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath); default: - if (isAbsolute(evalFunc)) { + if (isAbsolute2(evalFunc)) { return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath); } else { return { @@ -547,19 +640,15 @@ async function evaluateWithCustomScript(_bqrsPath, _queryPath, _scriptPath, _out } // src/lib/log-directory-manager.ts -import { mkdirSync as mkdirSync3, existsSync } from "fs"; +import { mkdirSync as mkdirSync3, existsSync as existsSync3 } from "fs"; import { join as join2, resolve as resolve2 } from "path"; import { randomBytes } from "crypto"; // src/utils/temp-dir.ts +init_package_paths(); import { mkdirSync as mkdirSync2, mkdtempSync } from "fs"; -import { dirname as dirname2, join, resolve } from "path"; -import { fileURLToPath } from "url"; -var __filename = fileURLToPath(import.meta.url); -var __dirname = dirname2(__filename); -var normalizedDir = __dirname.split(/[\\/]/).join("/"); -var repoRoot = normalizedDir.includes("src/utils") ? resolve(__dirname, "..", "..", "..") : resolve(__dirname, "..", ".."); -var PROJECT_TMP_BASE = join(repoRoot, ".tmp"); +import { join } from "path"; +var PROJECT_TMP_BASE = join(getPackageRootDir(), ".tmp"); function getProjectTmpBase() { mkdirSync2(PROJECT_TMP_BASE, { recursive: true }); return PROJECT_TMP_BASE; @@ -587,12 +676,12 @@ function getOrCreateLogDirectory(logDir) { const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir("query-logs"); if (logDir) { const absLogDir = ensurePathWithinBase(baseLogDir, logDir); - if (!existsSync(absLogDir)) { + if (!existsSync3(absLogDir)) { mkdirSync3(absLogDir, { recursive: true }); } return absLogDir; } - if (!existsSync(baseLogDir)) { + if (!existsSync3(baseLogDir)) { mkdirSync3(baseLogDir, { recursive: true }); } const timestamp2 = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-"); @@ -603,13 +692,9 @@ function getOrCreateLogDirectory(logDir) { } // src/lib/cli-tool-registry.ts -import { writeFileSync as writeFileSync2, rmSync, existsSync as existsSync2, mkdirSync as mkdirSync4 } from "fs"; -import { basename, dirname as dirname3, join as join3, resolve as resolve3 } from "path"; -import { fileURLToPath as fileURLToPath2 } from "url"; -var __filename2 = fileURLToPath2(import.meta.url); -var __dirname2 = dirname3(__filename2); -var normalizedDir2 = __dirname2.replace(/\\/g, "/"); -var repoRootDir = normalizedDir2.includes("src/lib") ? resolve3(__dirname2, "..", "..", "..") : resolve3(__dirname2, "..", ".."); +init_package_paths(); +import { writeFileSync as writeFileSync2, rmSync, existsSync as existsSync4, mkdirSync as mkdirSync4 } from "fs"; +import { basename as basename2, dirname as dirname4, isAbsolute as isAbsolute3, join as join3, resolve as resolve3 } from "path"; var defaultCLIResultProcessor = (result, _params) => { if (!result.success) { return `Command failed (exit code ${result.exitCode || "unknown"}): @@ -754,12 +839,14 @@ function registerCLITool(server, definition) { case "codeql_test_run": case "codeql_resolve_tests": if (tests && Array.isArray(tests)) { - positionalArgs = [...positionalArgs, ...tests]; + positionalArgs = [...positionalArgs, ...tests.map( + (t) => isAbsolute3(t) ? t : resolve3(workspaceRootDir, t) + )]; } break; case "codeql_query_run": { if (options.database && typeof options.database === "string" && !options.database.startsWith("/")) { - options.database = resolve3(repoRootDir, options.database); + options.database = resolve3(workspaceRootDir, options.database); logger.info(`Resolved database path to: ${options.database}`); } const resolvedQuery = await resolveQueryPath(params, logger); @@ -867,9 +954,10 @@ function registerCLITool(server, definition) { if (command === "codeql") { let cwd; if ((name === "codeql_pack_install" || name === "codeql_pack_ls") && (dir || packDir)) { - cwd = dir || packDir; + const rawCwd = dir || packDir; + cwd = isAbsolute3(rawCwd) ? rawCwd : resolve3(workspaceRootDir, rawCwd); } - const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || "server/ql/javascript/examples/"; + const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || resolve3(packageRootDir, "ql", "javascript", "examples"); if (name === "codeql_test_run" || name === "codeql_query_run" || name === "codeql_query_compile") { options["additional-packs"] = additionalPacksPath; } @@ -885,7 +973,7 @@ function registerCLITool(server, definition) { if (name === "codeql_query_run" && result.success && queryLogDir) { const bqrsPath = options.output; const sarifPath = join3(queryLogDir, "results.sarif"); - if (existsSync2(bqrsPath)) { + if (existsSync4(bqrsPath)) { try { const sarifResult = await executeCodeQLCommand( "bqrs interpret", @@ -1001,7 +1089,7 @@ async function resolveQueryPath(params, logger2) { throw new Error("queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift"); } try { - const defaultPackPath = resolve3(repoRootDir, "server", "ql", queryLanguage, "tools", "src"); + const defaultPackPath = resolveToolQueryPackPath(queryLanguage); const packPath = queryPack || defaultPackPath; logger2.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`); const { executeCodeQLCommand: executeCodeQLCommand2 } = await Promise.resolve().then(() => (init_cli_executor(), cli_executor_exports)); @@ -1022,11 +1110,11 @@ async function resolveQueryPath(params, logger2) { throw new Error("Failed to parse resolve queries output"); } const matchingQuery = resolvedQueries.find((queryPath) => { - const fileName = basename(queryPath); + const fileName = basename2(queryPath); return fileName === `${queryName}.ql`; }); if (!matchingQuery) { - logger2.error(`Query "${queryName}.ql" not found in pack "${packPath}". Available queries:`, resolvedQueries.map((q) => basename(q))); + logger2.error(`Query "${queryName}.ql" not found in pack "${packPath}". Available queries:`, resolvedQueries.map((q) => basename2(q))); throw new Error(`Query "${queryName}.ql" not found in pack "${packPath}"`); } logger2.info(`Resolved query "${queryName}" to: ${matchingQuery}`); @@ -1063,7 +1151,7 @@ async function interpretBQRSFile(bqrsPath, queryPath, format, outputPath, logger error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}` }; } - mkdirSync4(dirname3(outputPath), { recursive: true }); + mkdirSync4(dirname4(outputPath), { recursive: true }); const params = { format, output: outputPath, @@ -4406,7 +4494,8 @@ import { spawn } from "child_process"; import { EventEmitter } from "events"; import { setTimeout as setTimeout2, clearTimeout } from "timers"; import { pathToFileURL } from "url"; -import { join as join5 } from "path"; +import { delimiter as delimiter2, join as join5 } from "path"; +init_cli_executor(); var CodeQLLanguageServer = class extends EventEmitter { constructor(_options = {}) { super(); @@ -4442,8 +4531,16 @@ var CodeQLLanguageServer = class extends EventEmitter { if (this._options.verbosity) { args.push(`--verbosity=${this._options.verbosity}`); } + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter2}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; + } this.server = spawn("codeql", args, { - stdio: ["pipe", "pipe", "pipe"] + stdio: ["pipe", "pipe", "pipe"], + env: spawnEnv }); this.server.stderr?.on("data", (data) => { logger.debug("CodeQL LS stderr:", data.toString()); @@ -4557,8 +4654,8 @@ var CodeQLLanguageServer = class extends EventEmitter { const initParams = { processId: process.pid, clientInfo: { - name: "codeql-mcp-server", - version: "1.0.0" + name: "codeql-development-mcp-server", + version: "2.23.9" }, capabilities: { textDocument: { @@ -4704,15 +4801,16 @@ async function getLanguageServer(options = {}) { if (globalLanguageServer && globalLanguageServer.isRunning()) { return globalLanguageServer; } + const { packageRootDir: pkgRoot } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); const defaultOptions = { - searchPath: resolve5(process.cwd(), "ql"), + searchPath: resolve5(pkgRoot, "ql"), loglevel: "WARN", ...options }; globalLanguageServer = new CodeQLLanguageServer(defaultOptions); try { await globalLanguageServer.start(); - const workspaceUri = pathToFileURL2(resolve5(process.cwd(), "ql")).href; + const workspaceUri = pathToFileURL2(resolve5(pkgRoot, "ql")).href; await globalLanguageServer.initialize(workspaceUri); logger.info("CodeQL Language Server started and initialized successfully"); return globalLanguageServer; @@ -4875,11 +4973,11 @@ var codeqlPackLsTool = { init_cli_executor(); init_logger(); import { z as z15 } from "zod"; -import { writeFileSync as writeFileSync3, readFileSync as readFileSync3, existsSync as existsSync4 } from "fs"; -import { join as join7, dirname as dirname5, basename as basename3 } from "path"; +import { writeFileSync as writeFileSync3, readFileSync as readFileSync4, existsSync as existsSync6 } from "fs"; +import { join as join7, dirname as dirname6, basename as basename4 } from "path"; import { mkdirSync as mkdirSync5 } from "fs"; function parseEvaluatorLog(logPath) { - const logContent = readFileSync3(logPath, "utf-8"); + const logContent = readFileSync4(logPath, "utf-8"); const jsonObjects = logContent.split("\n\n").filter((s) => s.trim()); const events = jsonObjects.map((obj) => { try { @@ -4965,7 +5063,7 @@ function formatAsMermaid(profile) { lines.push("```mermaid"); lines.push("graph TD"); lines.push(""); - lines.push(` QUERY["${basename3(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms"]`); + lines.push(` QUERY["${basename4(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms"]`); lines.push(""); profile.pipelines.forEach((pipeline) => { const nodeId = `P${pipeline.eventId}`; @@ -5013,7 +5111,7 @@ function registerProfileCodeQLQueryTool(server) { let sarifPath; if (!logPath) { logger.info("No evaluator log provided, running query to generate one"); - const defaultOutputDir = outputDir || join7(dirname5(query), "profile-output"); + const defaultOutputDir = outputDir || join7(dirname6(query), "profile-output"); mkdirSync5(defaultOutputDir, { recursive: true }); logPath = join7(defaultOutputDir, "evaluator-log.jsonl"); bqrsPath = join7(defaultOutputDir, "query-results.bqrs"); @@ -5040,7 +5138,7 @@ function registerProfileCodeQLQueryTool(server) { isError: true }; } - if (existsSync4(bqrsPath)) { + if (existsSync6(bqrsPath)) { try { const sarifResult = await executeCodeQLCommand( "bqrs interpret", @@ -5055,7 +5153,7 @@ function registerProfileCodeQLQueryTool(server) { } } } - if (!existsSync4(logPath)) { + if (!existsSync6(logPath)) { return { content: [ { @@ -5068,7 +5166,7 @@ function registerProfileCodeQLQueryTool(server) { } logger.info(`Parsing evaluator log from: ${logPath}`); const profile = parseEvaluatorLog(logPath); - const profileOutputDir = outputDir || dirname5(logPath); + const profileOutputDir = outputDir || dirname6(logPath); mkdirSync5(profileOutputDir, { recursive: true }); const jsonPath = join7(profileOutputDir, "query-evaluation-profile.json"); const jsonContent = formatAsJson(profile); @@ -5086,7 +5184,7 @@ function registerProfileCodeQLQueryTool(server) { if (bqrsPath) { outputFiles.push(`Query Results (BQRS): ${bqrsPath}`); } - if (sarifPath && existsSync4(sarifPath)) { + if (sarifPath && existsSync6(sarifPath)) { outputFiles.push(`Query Results (SARIF): ${sarifPath}`); } const responseText = [ @@ -5096,7 +5194,7 @@ function registerProfileCodeQLQueryTool(server) { ...outputFiles.map((f) => ` - ${f}`), "", "Profile Summary:", - ` - Query: ${basename3(profile.queryName)}`, + ` - Query: ${basename4(profile.queryName)}`, ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`, ` - Total Pipelines: ${profile.pipelines.length}`, ` - Total Events: ${profile.totalEvents}`, @@ -5828,35 +5926,35 @@ function registerCodeQLTools(server) { } // src/lib/resources.ts -import { readFileSync as readFileSync4 } from "fs"; -import { join as join10, dirname as dirname6 } from "path"; -import { fileURLToPath as fileURLToPath3 } from "url"; -var __filename3 = fileURLToPath3(import.meta.url); -var __dirname3 = dirname6(__filename3); +import { readFileSync as readFileSync5 } from "fs"; +import { join as join10, dirname as dirname7 } from "path"; +import { fileURLToPath as fileURLToPath2 } from "url"; +var __filename2 = fileURLToPath2(import.meta.url); +var __dirname2 = dirname7(__filename2); function getGettingStartedGuide() { try { - return readFileSync4(join10(__dirname3, "../resources/getting-started.md"), "utf-8"); + return readFileSync5(join10(__dirname2, "../resources/getting-started.md"), "utf-8"); } catch { return "Getting started guide not available"; } } function getQueryBasicsGuide() { try { - return readFileSync4(join10(__dirname3, "../resources/query-basics.md"), "utf-8"); + return readFileSync5(join10(__dirname2, "../resources/query-basics.md"), "utf-8"); } catch { return "Query basics guide not available"; } } function getSecurityTemplates() { try { - return readFileSync4(join10(__dirname3, "../resources/security-templates.md"), "utf-8"); + return readFileSync5(join10(__dirname2, "../resources/security-templates.md"), "utf-8"); } catch { return "Security templates not available"; } } function getPerformancePatterns() { try { - return readFileSync4(join10(__dirname3, "../resources/performance-patterns.md"), "utf-8"); + return readFileSync5(join10(__dirname2, "../resources/performance-patterns.md"), "utf-8"); } catch { return "Performance patterns not available"; } @@ -5943,7 +6041,7 @@ function registerCodeQLResources(server) { } // src/resources/language-resources.ts -import { readFileSync as readFileSync5, existsSync as existsSync5 } from "fs"; +import { readFileSync as readFileSync6, existsSync as existsSync7 } from "fs"; import { join as join11 } from "path"; // src/types/language-types.ts @@ -5997,18 +6095,19 @@ var LANGUAGE_RESOURCES = [ ]; // src/resources/language-resources.ts +init_package_paths(); init_logger(); function getQLBasePath() { - return join11(process.cwd(), ".."); + return workspaceRootDir; } function loadResourceContent(relativePath) { try { const fullPath = join11(getQLBasePath(), relativePath); - if (!existsSync5(fullPath)) { + if (!existsSync7(fullPath)) { logger.warn(`Resource file not found: ${fullPath}`); return null; } - return readFileSync5(fullPath, "utf-8"); + return readFileSync6(fullPath, "utf-8"); } catch (error) { logger.error(`Error loading resource file ${relativePath}:`, error); return null; @@ -6131,18 +6230,18 @@ function registerLanguageResources(server) { // src/prompts/workflow-prompts.ts import { z as z32 } from "zod"; -import { basename as basename4 } from "path"; +import { basename as basename5 } from "path"; // src/prompts/prompt-loader.ts -import { readFileSync as readFileSync6 } from "fs"; -import { join as join12, dirname as dirname7 } from "path"; -import { fileURLToPath as fileURLToPath4 } from "url"; -var __filename4 = fileURLToPath4(import.meta.url); -var __dirname4 = dirname7(__filename4); +import { readFileSync as readFileSync7 } from "fs"; +import { join as join12, dirname as dirname8 } from "path"; +import { fileURLToPath as fileURLToPath3 } from "url"; +var __filename3 = fileURLToPath3(import.meta.url); +var __dirname3 = dirname8(__filename3); function loadPromptTemplate(promptFileName) { try { - const promptPath = join12(__dirname4, promptFileName); - return readFileSync6(promptPath, "utf-8"); + const promptPath = join12(__dirname3, promptFileName); + return readFileSync7(promptPath, "utf-8"); } catch (error) { return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : "Unknown error"}`; } @@ -6264,7 +6363,7 @@ ${content}` workshopCreationWorkflowSchema.shape, async ({ queryPath, language, workshopName, numStages }) => { const template = loadPromptTemplate("workshop-creation-workflow.prompt.md"); - const derivedName = workshopName || basename4(queryPath).replace(/\.(ql|qlref)$/, "").toLowerCase().replace(/[^a-z0-9]+/g, "-") || "codeql-workshop"; + const derivedName = workshopName || basename5(queryPath).replace(/\.(ql|qlref)$/, "").toLowerCase().replace(/[^a-z0-9]+/g, "-") || "codeql-workshop"; const contextSection = buildWorkshopContext( queryPath, language, @@ -6585,7 +6684,7 @@ var Low = class { }; // ../node_modules/lowdb/lib/adapters/node/TextFile.js -import { readFileSync as readFileSync7, renameSync, writeFileSync as writeFileSync5 } from "node:fs"; +import { readFileSync as readFileSync8, renameSync, writeFileSync as writeFileSync5 } from "node:fs"; import path3 from "node:path"; var TextFileSync = class { #tempFilename; @@ -6598,7 +6697,7 @@ var TextFileSync = class { read() { let data; try { - data = readFileSync7(this.#filename, "utf-8"); + data = readFileSync8(this.#filename, "utf-8"); } catch (e) { if (e.code === "ENOENT") { return null; @@ -6647,6 +6746,7 @@ var JSONFileSync = class extends DataFileSync { }; // src/lib/session-data-manager.ts +init_package_paths(); import { mkdirSync as mkdirSync7, writeFileSync as writeFileSync6 } from "fs"; import { join as join13 } from "path"; import { randomUUID } from "crypto"; @@ -7070,7 +7170,7 @@ function parseBoolEnv(envVar, defaultValue) { return envVar.toLowerCase() === "true" || envVar === "1"; } var sessionDataManager = new SessionDataManager({ - storageLocation: process.env.MONITORING_STORAGE_LOCATION || ".ql-mcp-tracking/", + storageLocation: process.env.MONITORING_STORAGE_LOCATION || join13(getPackageRootDir(), ".ql-mcp-tracking"), enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false) }); @@ -7939,13 +8039,17 @@ function generateListRecommendations(sessions) { return recommendations; } -// src/ql-mcp-server.ts +// src/codeql-development-mcp-server.ts +init_cli_executor(); +init_package_paths(); init_logger(); -dotenv.config(); +dotenv.config({ path: resolve9(packageRootDir, ".env") }); var PACKAGE_NAME = "codeql-development-mcp-server"; -var VERSION = "1.0.0"; +var VERSION = "2.23.9"; async function startServer(mode = "stdio") { logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`); + const codeqlBinary = resolveCodeQLBinary(); + logger.info(`CodeQL CLI binary: ${codeqlBinary}`); const server = new McpServer({ name: PACKAGE_NAME, version: VERSION @@ -8037,4 +8141,4 @@ export { js-yaml/dist/js-yaml.mjs: (*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT *) */ -//# sourceMappingURL=ql-mcp-server.js.map +//# sourceMappingURL=codeql-development-mcp-server.js.map diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map new file mode 100644 index 00000000..4c7c5343 --- /dev/null +++ b/server/dist/codeql-development-mcp-server.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/utils/logger.ts", "../src/lib/cli-executor.ts", "../src/utils/package-paths.ts", "../src/codeql-development-mcp-server.ts", "../src/tools/codeql/bqrs-decode.ts", "../src/lib/cli-tool-registry.ts", "../src/lib/query-results-evaluator.ts", "../src/lib/log-directory-manager.ts", "../src/utils/temp-dir.ts", "../src/tools/codeql/bqrs-info.ts", "../src/tools/codeql/bqrs-interpret.ts", "../src/tools/codeql/database-analyze.ts", "../src/tools/codeql/database-create.ts", "../src/tools/codeql/find-class-position.ts", "../src/tools/codeql/find-predicate-position.ts", "../src/tools/codeql/find-query-files.ts", "../src/lib/query-file-finder.ts", "../../node_modules/js-yaml/dist/js-yaml.mjs", "../src/lib/metadata-resolver.ts", "../src/tools/codeql/generate-log-summary.ts", "../src/tools/codeql/generate-query-help.ts", "../src/tools/codeql/language-server-eval.ts", "../src/lib/language-server.ts", "../src/tools/codeql/pack-install.ts", "../src/tools/codeql/pack-ls.ts", "../src/tools/codeql/profile-codeql-query.ts", "../src/tools/codeql/query-compile.ts", "../src/tools/codeql/query-format.ts", "../src/tools/codeql/query-run.ts", "../src/tools/codeql/quick-evaluate.ts", "../src/tools/codeql/register-database.ts", "../src/tools/codeql/resolve-database.ts", "../src/tools/codeql/resolve-languages.ts", "../src/tools/codeql/resolve-library-path.ts", "../src/tools/codeql/resolve-metadata.ts", "../src/tools/codeql/resolve-qlref.ts", "../src/tools/codeql/resolve-queries.ts", "../src/tools/codeql/resolve-tests.ts", "../src/tools/codeql/test-accept.ts", "../src/tools/codeql/test-extract.ts", "../src/tools/codeql/test-run.ts", "../src/tools/codeql-tools.ts", "../src/lib/validation.ts", "../src/lib/query-scaffolding.ts", "../src/lib/resources.ts", "../src/tools/codeql-resources.ts", "../src/resources/language-resources.ts", "../src/types/language-types.ts", "../src/prompts/workflow-prompts.ts", "../src/prompts/prompt-loader.ts", "../src/tools/monitoring-tools.ts", "../../node_modules/lowdb/lib/core/Low.js", "../../node_modules/lowdb/lib/adapters/node/TextFile.js", "../../node_modules/lowdb/lib/adapters/node/DataFile.js", "../../node_modules/lowdb/lib/adapters/node/JSONFile.js", "../src/lib/session-data-manager.ts", "../src/types/monitoring.ts"], + "sourcesContent": ["/**\n * Simple logger utility.\n *\n * All log output is written to stderr. In stdio transport mode, stdout is\n * reserved exclusively for the MCP JSON-RPC protocol \u2014 any non-protocol\n * bytes on stdout would corrupt the message stream.\n */\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.error(`[INFO] ${new Date().toISOString()} ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[ERROR] ${new Date().toISOString()} ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n console.error(`[WARN] ${new Date().toISOString()} ${message}`, ...args);\n },\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.error(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args);\n }\n },\n};\n", "/**\n * Generic CLI command execution utilities for CodeQL and QLT commands\n */\n\nimport { execFile } from 'child_process';\nimport { existsSync } from 'fs';\nimport { basename, delimiter, dirname, isAbsolute } from 'path';\nimport { promisify } from 'util';\nimport { logger } from '../utils/logger';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CLIExecutionResult {\n stdout: string;\n stderr: string;\n success: boolean;\n error?: string;\n exitCode?: number;\n}\n\nexport interface CLIExecutionOptions {\n command: string;\n args: string[];\n cwd?: string;\n timeout?: number;\n env?: Record;\n}\n\n// Whitelist of allowed commands to prevent arbitrary command execution\nconst ALLOWED_COMMANDS = new Set([\n 'codeql',\n 'git',\n 'node',\n 'npm',\n 'qlt',\n 'which'\n]);\n\n// Additional commands allowed in test environments\nlet testCommands: Set | null = null;\n\n// Whitelist of safe environment variables to pass to child processes\n// This prevents potentially malicious environment variables from being passed through\nconst SAFE_ENV_VARS = [\n 'HOME', // User home directory\n 'LANG', // Locale setting\n 'LC_ALL', // Locale setting\n 'LC_CTYPE', // Locale setting\n 'PATH', // Required to find executables\n 'SHELL', // User's shell (Unix)\n 'TEMP', // Temporary directory (Windows)\n 'TERM', // Terminal type (Unix)\n 'TMP', // Temporary directory (Windows)\n 'TMPDIR', // Temporary directory (Unix)\n 'USER', // Current user (Unix)\n 'USERNAME', // Current user (Windows)\n] as const;\n\n// Whitelist of safe environment variable prefixes\n// These are needed for CodeQL and Node.js functionality\nconst SAFE_ENV_PREFIXES = [\n 'CODEQL_', // CodeQL-specific variables\n 'NODE_', // Node.js-specific variables (for npm, etc.)\n] as const;\n\n// Pattern for dangerous control characters in CLI arguments\n// Rejected characters:\n// \\x01-\\x08: SOH through BS (start of heading, text, null control chars, backspace)\n// \\x0B: Vertical tab - rarely used legitimately, can cause display issues\n// \\x0C: Form feed - can cause unexpected page breaks in output\n// \\x0E-\\x1F: SO through US (shift out/in, device controls, separators)\n// Allowed characters:\n// \\x00: Null byte - handled separately for clearer error messaging\n// \\x09: Horizontal tab - commonly used in file paths and arguments\n// \\x0A: Newline (LF) - may appear in multi-line arguments\n// \\x0D: Carriage return (CR) - may appear with newlines on Windows\n// eslint-disable-next-line no-control-regex\nconst DANGEROUS_CONTROL_CHARS = /[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Enable test-specific commands for testing purposes\n * This should only be called in test environments\n */\nexport function enableTestCommands(): void {\n testCommands = new Set([\n 'cat',\n 'echo',\n 'ls',\n 'sh',\n 'sleep'\n ]);\n}\n\n/**\n * Disable test-specific commands\n */\nexport function disableTestCommands(): void {\n testCommands = null;\n}\n\n/**\n * Check if a command is allowed\n */\nfunction isCommandAllowed(command: string): boolean {\n return ALLOWED_COMMANDS.has(command) || (testCommands !== null && testCommands.has(command));\n}\n\n// Resolved CodeQL binary directory from CODEQL_PATH.\n// When set, this directory is prepended to PATH for all child processes\n// so that `execFile('codeql', ...)` finds the correct binary via execvp().\n// Using PATH lookup (rather than an absolute path) is essential because\n// execvp() handles shell-script shebangs correctly, whereas passing an\n// absolute path to execFile() can fail with ENOENT for shell scripts.\nlet resolvedCodeQLDir: string | null = null;\n\n/**\n * Resolve the CodeQL CLI binary path.\n *\n * Resolution order:\n * 1. `CODEQL_PATH` environment variable \u2014 must point to an existing file whose\n * basename is `codeql` (or `codeql.exe` / `codeql.cmd` on Windows).\n * The parent directory is prepended to PATH for child processes.\n * 2. Falls back to the bare `codeql` command (resolved via PATH at exec time).\n *\n * The resolved value is cached for the lifetime of the process. Call this once\n * at startup; subsequent calls are a no-op and return the cached value.\n */\nexport function resolveCodeQLBinary(): string {\n const envPath = process.env.CODEQL_PATH;\n\n if (!envPath) {\n resolvedCodeQLDir = null;\n return 'codeql';\n }\n\n // Validate the path points to a plausible CodeQL binary\n const base = basename(envPath).toLowerCase();\n const validBaseNames = ['codeql', 'codeql.exe', 'codeql.cmd'];\n if (!validBaseNames.includes(base)) {\n throw new Error(\n `CODEQL_PATH must point to a CodeQL CLI binary (expected basename: codeql), got: ${base}`\n );\n }\n\n // Require an absolute path to avoid ambiguity\n if (!isAbsolute(envPath)) {\n throw new Error(\n `CODEQL_PATH must be an absolute path, got: ${envPath}`\n );\n }\n\n // Verify the file exists\n if (!existsSync(envPath)) {\n throw new Error(\n `CODEQL_PATH points to a file that does not exist: ${envPath}`\n );\n }\n\n resolvedCodeQLDir = dirname(envPath);\n logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`);\n return envPath;\n}\n\n/**\n * Get the currently resolved CodeQL binary directory, or null if using PATH.\n */\nexport function getResolvedCodeQLDir(): string | null {\n return resolvedCodeQLDir;\n}\n\n/**\n * Reset the resolved CodeQL binary to the default (for testing only).\n */\nexport function resetResolvedCodeQLBinary(): void {\n resolvedCodeQLDir = null;\n}\n\n/**\n * Sanitize a CLI argument to prevent potential issues with special characters.\n * \n * While execFile() does not spawn a shell (preventing shell injection), we still\n * validate arguments to:\n * 1. Reject null bytes that could truncate strings in C-based commands\n * 2. Reject control characters that could cause unexpected behavior\n * 3. Provide defense-in-depth against potential issues\n * \n * @param arg - The argument to sanitize\n * @returns The sanitized argument\n * @throws Error if the argument contains dangerous characters\n */\nexport function sanitizeCLIArgument(arg: string): string {\n // Reject null bytes - these can truncate strings in C-based commands\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n if (arg.includes('\\0')) {\n throw new Error(`CLI argument contains null byte: argument rejected for security`);\n }\n \n // Reject control characters using the module-level constant pattern\n if (DANGEROUS_CONTROL_CHARS.test(arg)) {\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n throw new Error(`CLI argument contains control characters: argument rejected for security`);\n }\n \n return arg;\n}\n\n/**\n * Sanitize an array of CLI arguments\n * @param args - The arguments to sanitize\n * @returns The sanitized arguments\n * @throws Error if any argument contains dangerous characters\n */\nexport function sanitizeCLIArguments(args: string[]): string[] {\n return args.map(sanitizeCLIArgument);\n}\n\n/**\n * Filter environment variables to only include safe ones\n * This prevents potentially malicious environment variables from being passed to child processes\n */\nfunction getSafeEnvironment(additionalEnv?: Record): Record {\n const safeEnv: Record = {};\n \n // Copy whitelisted environment variables from process.env\n for (const key of SAFE_ENV_VARS) {\n if (process.env[key] !== undefined) {\n safeEnv[key] = process.env[key]!;\n }\n }\n \n // Copy environment variables with whitelisted prefixes\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && SAFE_ENV_PREFIXES.some(prefix => key.startsWith(prefix))) {\n safeEnv[key] = value;\n }\n }\n \n // When CODEQL_PATH was set, prepend the resolved directory to PATH so that\n // `execFile('codeql', ...)` finds the user-specified binary via execvp().\n // This approach (PATH manipulation + bare command name) is essential because\n // execvp() handles shell-script shebangs correctly, whereas passing an\n // absolute path to execFile() fails with ENOENT for shell-script launchers.\n if (resolvedCodeQLDir && safeEnv.PATH) {\n safeEnv.PATH = `${resolvedCodeQLDir}${delimiter}${safeEnv.PATH}`;\n } else if (resolvedCodeQLDir) {\n safeEnv.PATH = resolvedCodeQLDir;\n }\n \n // Merge with explicitly provided environment variables\n // These are trusted as they come from the application code, not external sources\n if (additionalEnv) {\n Object.assign(safeEnv, additionalEnv);\n }\n \n return safeEnv;\n}\n\n/**\n * Execute a CLI command and return the result.\n * \n * Security: This function uses execFile() instead of exec() to avoid shell interpretation.\n * Arguments are passed directly to the executable as an array, preventing shell injection.\n * Additional security measures include:\n * - Command whitelist validation\n * - Shell metacharacter detection in command names\n * - CLI argument sanitization (null bytes, control characters)\n * - Environment variable filtering\n */\nexport async function executeCLICommand(options: CLIExecutionOptions): Promise {\n try {\n const { command, args, cwd, timeout = 300000, env } = options; // 5 minute default timeout\n \n // Validate command is in the whitelist to prevent arbitrary command execution\n if (!isCommandAllowed(command)) {\n throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`);\n }\n \n // Validate command to ensure it doesn't contain shell metacharacters\n if (command.includes(';') || command.includes('|') || command.includes('&') || \n command.includes('$') || command.includes('`') || command.includes('\\n') ||\n command.includes('\\r')) {\n throw new Error(`Invalid command: contains shell metacharacters: ${command}`);\n }\n \n // Sanitize CLI arguments to prevent issues with special characters\n // This provides defense-in-depth even though execFile() doesn't use a shell\n const sanitizedArgs = sanitizeCLIArguments(args);\n \n logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout });\n \n const execOptions = {\n cwd,\n timeout,\n env: getSafeEnvironment(env),\n };\n \n // execFile() is used instead of exec() to avoid shell interpretation\n // Arguments are passed as an array, not interpolated into a command string\n const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions);\n\n return {\n stdout,\n stderr,\n success: true,\n exitCode: 0\n };\n\n } catch (error: unknown) {\n logger.error('CLI command execution failed:', error);\n \n const err = error as Error & { code?: number; stdout?: string; stderr?: string };\n const errorMessage = err instanceof Error ? err.message : String(error);\n const exitCode = err.code || 1;\n \n return {\n stdout: err.stdout || '',\n stderr: err.stderr || errorMessage,\n success: false,\n error: errorMessage,\n exitCode\n };\n }\n}\n\n/**\n * Build CodeQL command arguments with proper escaping\n */\nexport function buildCodeQLArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n // Single-letter parameters that should use -key=value format (with equals sign)\n // Note: CodeQL CLI uses -t=key=value format for metadata, not -t key=value\n const singleLetterParams = new Set(['t', 'o', 'v', 'q', 'h', 'J']);\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n const isSingleLetter = key.length === 1 && singleLetterParams.has(key);\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(isSingleLetter ? `-${key}` : `--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values (e.g., multiple -t flags for metadata)\n for (const item of value) {\n if (isSingleLetter) {\n // For single-letter params like -t, use -key=value format\n args.push(`-${key}=${String(item)}`);\n } else {\n // For long params, use --key=value format\n args.push(`--${key}=${String(item)}`);\n }\n }\n } else {\n // Handle string, number, and other values\n if (isSingleLetter) {\n // For single-letter params, use -key=value format\n args.push(`-${key}=${String(value)}`);\n } else {\n args.push(`--${key}=${String(value)}`);\n }\n }\n }\n \n return args;\n}\n\n/**\n * Build QLT command arguments with proper escaping\n */\nexport function buildQLTArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values\n for (const item of value) {\n args.push(`--${key}`, String(item));\n }\n } else {\n // Handle string, number, and other values\n args.push(`--${key}`, String(value));\n }\n }\n \n return args;\n}\n\n/**\n * Execute a CodeQL command.\n * Always uses the bare `codeql` command name so that execvp() PATH lookup\n * handles shell-script shebangs correctly. When CODEQL_PATH is set, the\n * resolved directory is prepended to PATH via getSafeEnvironment().\n */\nexport async function executeCodeQLCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = [],\n cwd?: string\n): Promise {\n const args = buildCodeQLArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'codeql',\n args,\n cwd\n });\n}\n\n/**\n * Execute a QLT command\n */\nexport async function executeQLTCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = []\n): Promise {\n const args = buildQLTArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'qlt',\n args\n });\n}\n\n/**\n * Get help text for a CLI command\n */\nexport async function getCommandHelp(command: string, subcommand?: string): Promise {\n const args = subcommand ? [subcommand, '--help'] : ['--help'];\n \n const result = await executeCLICommand({\n command,\n args\n });\n \n return result.stdout || result.stderr || 'No help available';\n}\n\n/**\n * Validate that a command exists on the system.\n */\nexport async function validateCommandExists(command: string): Promise {\n try {\n const result = await executeCLICommand({\n command: 'which',\n args: [command]\n });\n return result.success;\n } catch {\n return false;\n }\n}", "/**\n * Utilities for resolving filesystem paths relative to the server package root.\n *\n * The server can run from three different directory layouts:\n *\n * 1. **Source** (dev): `server/src/lib/` \u2192 packageRoot = `server/`\n * 2. **Bundle in monorepo** (dev/CI): `server/dist/` \u2192 packageRoot = `server/`\n * 3. **Bundle via npm** (production): `/dist/` \u2192 packageRoot = `/`\n *\n * In all three cases, the bundled QL tool query packs live at\n * `/ql//tools/src/`.\n *\n * The \"workspace root\" (monorepo root) is one level above packageRoot when\n * running from the monorepo checkout, and the packageRoot itself when running\n * from an npm install (no parent monorepo).\n */\n\nimport { dirname, resolve } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect whether the current __dirname looks like source code (`src/lib` or\n * `src/utils`) vs a bundled flat output directory (`dist/`).\n */\nfunction isRunningFromSource(dir: string): boolean {\n const normalized = dir.replace(/\\\\/g, '/');\n return normalized.includes('/src/');\n}\n\n/**\n * Get the server package root directory.\n *\n * - From source (`server/src/utils/`): up 2 levels \u2192 `server/`\n * - From bundle (`server/dist/` or `/dist/`): up 1 level \u2192 package root\n */\nexport function getPackageRootDir(currentDir: string = __dirname): string {\n return isRunningFromSource(currentDir)\n ? resolve(currentDir, '..', '..') // src/utils \u2192 server/\n : resolve(currentDir, '..'); // dist/ \u2192 package root\n}\n\n/**\n * Get the workspace root directory (monorepo root when applicable).\n *\n * If a `package.json` with `workspaces` exists one level above the package\n * root, we're in a monorepo and that parent is the workspace root. Otherwise,\n * the packageRoot itself is the workspace root (npm install scenario).\n */\nexport function getWorkspaceRootDir(packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n const parentDir = resolve(pkgRoot, '..');\n\n // In the monorepo, the parent directory contains a package.json with workspaces\n try {\n const parentPkgPath = resolve(parentDir, 'package.json');\n if (existsSync(parentPkgPath)) {\n const parentPkg = JSON.parse(readFileSync(parentPkgPath, 'utf8'));\n if (parentPkg.workspaces) {\n return parentDir;\n }\n }\n } catch {\n // Not in a monorepo \u2014 fall through\n }\n\n return pkgRoot;\n}\n\n/**\n * Resolve the path to a tool query pack's source directory.\n *\n * @param language - CodeQL language identifier (e.g., \"javascript\", \"cpp\")\n * @param packageRoot - Override the package root (for testing)\n * @returns Absolute path to `ql//tools/src/`\n */\nexport function resolveToolQueryPackPath(language: string, packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n return resolve(pkgRoot, 'ql', language, 'tools', 'src');\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\n", "/**\n * CodeQL Development MCP McpServer\n * Main entry point for the server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport express from 'express';\nimport cors from 'cors';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport { registerCodeQLTools, registerCodeQLResources } from './tools';\nimport { registerLanguageResources } from './resources/language-resources';\nimport { registerWorkflowPrompts } from './prompts/workflow-prompts';\nimport { registerMonitoringTools } from './tools/monitoring-tools';\nimport { sessionDataManager } from './lib/session-data-manager';\nimport { resolveCodeQLBinary } from './lib/cli-executor';\nimport { packageRootDir } from './utils/package-paths';\nimport { logger } from './utils/logger';\n\n// Load environment variables from a .env file co-located with the package root.\n// Uses the package directory (not CWD) so that npm-installed users don't\n// accidentally inherit a .env from their project.\ndotenv.config({ path: resolve(packageRootDir, '.env') });\n\nconst PACKAGE_NAME = 'codeql-development-mcp-server';\nconst VERSION = '2.23.9';\n\n/**\n * Start the MCP server\n */\nexport async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise {\n logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`);\n\n // Resolve the CodeQL CLI binary path (honors CODEQL_PATH env var).\n // This must happen before any tool registration so that all CodeQL commands\n // use the user-specified binary.\n const codeqlBinary = resolveCodeQLBinary();\n logger.info(`CodeQL CLI binary: ${codeqlBinary}`);\n\n const server = new McpServer({\n name: PACKAGE_NAME,\n version: VERSION,\n });\n\n // Register CodeQL tools (legacy high-level helpers)\n registerCodeQLTools(server);\n\n // Register CodeQL resources (static guides)\n registerCodeQLResources(server);\n\n // Register language-specific resources (AST references, security patterns)\n registerLanguageResources(server);\n\n // Register high-level workflow prompts (complete development workflows)\n registerWorkflowPrompts(server);\n\n // Register monitoring and reporting tools\n registerMonitoringTools(server);\n\n // Initialize session data manager\n await sessionDataManager.initialize();\n\n if (mode === 'stdio') {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info('McpServer started successfully on STDIO transport');\n } else {\n // HTTP mode\n const app = express();\n app.use(cors());\n app.use(express.json());\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => Math.random().toString(36).substring(7),\n });\n await server.connect(transport);\n\n app.all('/mcp', (req, res) => {\n transport.handleRequest(req, res, req.body).catch((err) => {\n logger.error('Error handling MCP request:', err);\n if (!res.headersSent) {\n res.status(500).json({ error: 'Internal McpServer Error' });\n }\n });\n });\n\n app.get('/', (_req, res) => {\n res.json({\n name: PACKAGE_NAME,\n version: VERSION,\n description: 'CodeQL Development MCP McpServer',\n status: 'running',\n });\n });\n\n const host = process.env.HTTP_HOST || 'localhost';\n const port = Number(process.env.HTTP_PORT || process.env.PORT) || 3000;\n \n // Return a promise that keeps the process alive\n return new Promise((resolve, reject) => {\n const httpServer = app.listen(port, host, () => {\n logger.info(`HTTP server listening on http://${host}:${port}/mcp`);\n resolve();\n });\n \n httpServer.on('error', (error) => {\n logger.error('HTTP server error:', error);\n reject(error);\n });\n });\n }\n\n setupGracefulShutdown(server);\n return server;\n}\n\n/**\n * Set up graceful shutdown handling\n */\nfunction setupGracefulShutdown(server: McpServer): void {\n const shutdown = async () => {\n logger.info('Shutting down server...');\n try {\n await server.close();\n logger.info('McpServer closed gracefully');\n process.exit(0);\n } catch (error) {\n logger.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\n/**\n * Main function to start the server\n */\nasync function main(): Promise {\n try {\n const transportMode = (process.env.TRANSPORT_MODE || 'stdio').toLowerCase();\n const mode: 'stdio' | 'http' = transportMode === 'http' ? 'http' : 'stdio';\n await startServer(mode);\n } catch (error) {\n logger.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\n// Start the server if this file is run directly\nconst scriptPath = process.argv[1] ? resolve(process.argv[1]) : undefined;\nif (scriptPath && import.meta.url === pathToFileURL(scriptPath).href) {\n main();\n}\n", "/**\n * CodeQL BQRS decode tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsDecodeTool: CLIToolDefinition = {\n name: 'codeql_bqrs_decode',\n description: 'Decode BQRS result files to human-readable formats',\n command: 'codeql',\n subcommand: 'bqrs decode',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to decode'),\n output: createCodeQLSchemas.output(),\n format: z.enum(['csv', 'json']).optional().describe('Output format'),\n 'max-paths': z.number().optional().describe('Maximum number of paths to output'),\n 'start-at': z.number().optional().describe('Start output at result number'),\n 'max-results': z.number().optional().describe('Maximum number of results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs decode --format=csv --output=results.csv results.bqrs',\n 'codeql bqrs decode --format=json --max-results=100 results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * Generic tool registry for creating MCP tools from CLI command definitions\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator';\nimport { getOrCreateLogDirectory } from './log-directory-manager';\nimport { packageRootDir, resolveToolQueryPackPath, workspaceRootDir } from '../utils/package-paths';\nimport { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs';\nimport { basename, dirname, isAbsolute, join, resolve } from 'path';\nimport { createProjectTempDir } from '../utils/temp-dir';\n\nexport type { CLIExecutionResult } from './cli-executor';\n\nexport interface CLIToolDefinition {\n name: string;\n description: string;\n command: 'codeql' | 'qlt';\n subcommand: string;\n inputSchema: Record;\n examples?: string[];\n resultProcessor?: (_result: CLIExecutionResult, _params: Record) => string;\n}\n\n/**\n * Default result processor that formats CLI output appropriately\n */\nexport const defaultCLIResultProcessor = (\n result: CLIExecutionResult, \n _params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n \n let output = '';\n \n if (result.stdout) {\n output += result.stdout;\n }\n \n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n \n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n \n return output;\n};\n\n/**\n * Register a CLI tool with the MCP server\n */\nexport function registerCLITool(server: McpServer, definition: CLIToolDefinition): void {\n const {\n name,\n description,\n command,\n subcommand,\n inputSchema,\n resultProcessor = defaultCLIResultProcessor\n } = definition;\n\n server.tool(\n name,\n description,\n inputSchema,\n async (params: Record) => {\n // Track temporary directories for cleanup\n const tempDirsToCleanup: string[] = [];\n \n try {\n logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params });\n\n // Separate positional arguments from named options\n // Extract tool-specific parameters that should not be passed to CLI\n // Note: format is extracted for tools that use it internally but not on CLI\n // For codeql_bqrs_interpret, codeql_bqrs_decode, codeql_generate_query-help, and codeql_database_analyze, format should be passed to CLI\n const formatShouldBePassedToCLI = name === 'codeql_bqrs_interpret' || name === 'codeql_bqrs_decode' || name === 'codeql_generate_query-help' || name === 'codeql_database_analyze';\n \n const extractedParams = formatShouldBePassedToCLI\n ? {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack,\n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n }\n : {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack, \n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n format: params.format,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n };\n\n const {\n _positional = [],\n files,\n file,\n dir,\n packDir,\n tests,\n query,\n queryName,\n queryLanguage: _queryLanguage,\n queryPack: _queryPack,\n sourceFiles,\n sourceFunction,\n targetFunction,\n format: _format,\n interpretedOutput: _interpretedOutput,\n evaluationFunction: _evaluationFunction,\n evaluationOutput: _evaluationOutput,\n directory,\n logDir: customLogDir,\n qlref,\n } = extractedParams;\n\n // Get remaining options (everything not extracted above)\n const options = {...params};\n Object.keys(extractedParams).forEach(key => delete options[key]);\n let positionalArgs = Array.isArray(_positional) ? _positional as string[] : [_positional as string];\n\n // Handle files parameter as positional arguments for certain tools\n if (files && Array.isArray(files)) {\n positionalArgs = [...positionalArgs, ...files as string[]];\n }\n\n // Handle file parameter as positional argument for BQRS tools\n if (file && name.startsWith('codeql_bqrs_')) {\n positionalArgs = [...positionalArgs, file as string];\n }\n\n // Handle qlref parameter as positional argument for resolve qlref tool\n if (qlref && name === 'codeql_resolve_qlref') {\n positionalArgs = [...positionalArgs, qlref as string];\n }\n\n // Handle database parameter as positional argument for resolve database tool\n if (options.database && name === 'codeql_resolve_database') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database parameter as positional argument for database create tool\n if (options.database && name === 'codeql_database_create') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database and queries parameters as positional arguments for database analyze tool\n if (name === 'codeql_database_analyze') {\n if (options.database) {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n if (options.queries) {\n positionalArgs = [...positionalArgs, options.queries as string];\n delete options.queries;\n }\n }\n\n // Handle query parameter as positional argument for generate query-help tool\n if (query && name === 'codeql_generate_query-help') {\n positionalArgs = [...positionalArgs, query as string];\n }\n\n // Handle dir parameter as positional argument for pack tools\n if (dir && (name === 'codeql_pack_ls')) {\n positionalArgs = [...positionalArgs, dir as string];\n }\n \n // Handle tool-specific parameters using switch pattern for better maintainability\n switch (name) {\n case 'codeql_test_accept':\n case 'codeql_test_extract':\n case 'codeql_test_run':\n case 'codeql_resolve_tests':\n // Handle tests parameter as positional arguments for test tools.\n // Resolve relative paths against workspaceRootDir since the MCP\n // server's cwd may not be the repo root.\n if (tests && Array.isArray(tests)) {\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(workspaceRootDir, t)\n )];\n }\n break;\n \n case 'codeql_query_run': {\n // Resolve database path to absolute path if it's relative\n if (options.database && typeof options.database === 'string' && !options.database.startsWith('/')) {\n options.database = resolve(workspaceRootDir, options.database);\n logger.info(`Resolved database path to: ${options.database}`);\n }\n \n // Implement query resolution logic with enhanced results processing\n const resolvedQuery = await resolveQueryPath(params, logger);\n if (resolvedQuery) {\n positionalArgs = [...positionalArgs, resolvedQuery];\n } else if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n \n // Handle external predicates for tool queries\n if (queryName === 'PrintAST' && sourceFiles) {\n // Create a CSV file with the source file paths for the external predicate\n // The external predicate expects a CSV file with one column containing file paths\n const filePaths = (sourceFiles as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir); // Track for cleanup\n csvPath = join(tempDir, 'selectedSourceFiles.csv');\n\n // Create CSV content\n const csvContent = filePaths.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`selectedSourceFiles=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphFrom queries\n if (queryName === 'CallGraphFrom' && sourceFunction) {\n const functionNames = (sourceFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'sourceFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`sourceFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphTo queries\n if (queryName === 'CallGraphTo' && targetFunction) {\n const functionNames = (targetFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'targetFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`targetFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n break;\n }\n \n case 'codeql_query_compile':\n case 'codeql_resolve_metadata':\n // Handle query parameter as positional argument for query compilation and metadata tools\n if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n break;\n \n case 'codeql_resolve_queries':\n // Handle directory parameter as positional argument\n if (directory) {\n positionalArgs = [...positionalArgs, directory as string];\n }\n break;\n \n default:\n // No special parameter handling needed for other tools\n break;\n }\n\n // Set up logging directory for query/test runs\n let queryLogDir: string | undefined;\n if (name === 'codeql_query_run' || name === 'codeql_test_run') {\n queryLogDir = getOrCreateLogDirectory(customLogDir as string | undefined);\n logger.info(`Using log directory for ${name}: ${queryLogDir}`);\n \n // Create timestamp file to track when query/test run started\n const timestampPath = join(queryLogDir, 'timestamp');\n writeFileSync(timestampPath, Date.now().toString(), 'utf8');\n \n // Set the --logdir option for CodeQL CLI\n options.logdir = queryLogDir;\n \n // Set verbosity to progress+ to generate detailed query.log/test.log\n if (!options.verbosity) {\n options.verbosity = 'progress+';\n }\n \n // For query run, also handle the deprecated evaluator-log parameter and default output\n if (name === 'codeql_query_run') {\n // If evaluator-log was explicitly provided (deprecated), use it\n // Otherwise, set it to the log directory\n if (!options['evaluator-log']) {\n options['evaluator-log'] = join(queryLogDir, 'evaluator-log.jsonl');\n }\n \n // If output was not explicitly provided, set it to the log directory\n if (!options.output) {\n options.output = join(queryLogDir, 'results.bqrs');\n }\n }\n }\n\n let result: CLIExecutionResult;\n \n if (command === 'codeql') {\n // For pack commands, set the working directory to where qlpack.yml is located.\n // Resolve to absolute path since the MCP server's cwd may differ from\n // the workspace root (especially when launched by VS Code).\n let cwd: string | undefined;\n if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) {\n const rawCwd = (dir || packDir) as string;\n // Resolve relative paths against the workspace root, not process.cwd(),\n // since the MCP server's cwd may differ (especially in VS Code).\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd);\n }\n \n // Add --additional-packs for commands that need to access local test packs\n const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || resolve(packageRootDir, 'ql', 'javascript', 'examples');\n if (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile') {\n options['additional-packs'] = additionalPacksPath;\n }\n \n // Keep test databases for codeql_test_run to allow subsequent query runs\n if (name === 'codeql_test_run') {\n options['keep-databases'] = true;\n }\n \n result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd);\n } else if (command === 'qlt') {\n result = await executeQLTCommand(subcommand, options, positionalArgs);\n } else {\n throw new Error(`Unsupported command: ${command}`);\n }\n\n // Post-execution processing for codeql_query_run\n if (name === 'codeql_query_run' && result.success && queryLogDir) {\n // Generate SARIF interpretation if results.bqrs exists\n const bqrsPath = options.output as string;\n const sarifPath = join(queryLogDir, 'results.sarif');\n \n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n \n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n \n // Process evaluation results\n result = await processQueryRunResults(result, params, logger);\n }\n\n // Process the result\n const processedResult = resultProcessor(result, params);\n\n return {\n content: [{\n type: 'text' as const,\n text: processedResult\n }],\n isError: !result.success\n };\n\n } catch (error) {\n logger.error(`Error in CLI tool ${name}:`, error);\n \n return {\n content: [{\n type: 'text' as const,\n text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}`\n }],\n isError: true\n };\n } finally {\n // Clean up temporary directories\n for (const tempDir of tempDirsToCleanup) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n logger.info(`Cleaned up temporary directory: ${tempDir}`);\n } catch (cleanupError) {\n logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError);\n }\n }\n }\n }\n );\n}\n\n/**\n * Helper function to create common CodeQL input schemas\n */\nexport const createCodeQLSchemas = {\n database: () => z.string().describe('Path to the CodeQL database'),\n \n query: () => z.string().describe('Path to the CodeQL query file (.ql)'),\n \n output: () => z.string().optional().describe('Output file path'),\n \n outputFormat: () => z.enum(['csv', 'json', 'bqrs', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n \n language: () => z.string().optional().describe('Programming language'),\n \n threads: () => z.number().optional().describe('Number of threads to use'),\n \n ram: () => z.number().optional().describe('Amount of RAM to use (MB)'),\n \n timeout: () => z.number().optional().describe('Timeout in seconds'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments'),\n \n positionalArgs: () => z.array(z.string()).optional().describe('Positional arguments')\n .transform((val) => ({ _positional: val }))\n};\n\n/**\n * Helper function to create common QLT input schemas\n */\nexport const createQLTSchemas = {\n language: () => z.string().describe('Programming language'),\n \n output: () => z.string().optional().describe('Output directory or file path'),\n \n template: () => z.string().optional().describe('Template to use'),\n \n name: () => z.string().optional().describe('Name for generated query'),\n \n description: () => z.string().optional().describe('Description for generated query'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n force: () => z.boolean().optional().describe('Force overwrite existing files'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments')\n};\n\n/**\n * Create a result processor that formats BQRS output specially\n */\nexport const createBQRSResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n // For BQRS commands, provide more context about the output\n let output = result.stdout;\n \n if (params.output) {\n output += `\\n\\nResults saved to: ${params.output}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Create a result processor that formats database creation output\n */\nexport const createDatabaseResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n let output = 'Database creation completed successfully';\n \n if (params.database || params._positional) {\n const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional);\n output += `\\n\\nDatabase location: ${dbPath}`;\n }\n \n if (result.stdout) {\n output += `\\n\\nOutput:\\n${result.stdout}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Resolve query path for codeql_query_run tool\n * If queryName and queryLanguage are provided, resolve using codeql resolve queries\n */\nasync function resolveQueryPath(\n params: Record, \n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n const { queryName, queryLanguage, queryPack, query } = params;\n \n // Validate parameter usage - queryName and query are mutually exclusive\n if (queryName && query) {\n logger.error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n throw new Error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n }\n \n // If no queryName provided, fall back to direct query parameter\n if (!queryName) {\n return query as string || null;\n }\n \n // If queryName provided but no language, we can't resolve\n if (!queryLanguage) {\n logger.error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n throw new Error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n }\n \n try {\n // Determine the query pack path - use absolute path to ensure it works regardless of cwd\n const defaultPackPath = resolveToolQueryPackPath(queryLanguage as string);\n const packPath = queryPack as string || defaultPackPath;\n \n logger.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`);\n \n // Execute codeql resolve queries to get available queries\n const { executeCodeQLCommand } = await import('./cli-executor');\n const resolveResult = await executeCodeQLCommand(\n 'resolve queries',\n { format: 'json' },\n [packPath]\n );\n \n if (!resolveResult.success) {\n logger.error('Failed to resolve queries:', resolveResult.stderr || resolveResult.error);\n throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`);\n }\n \n // Parse the JSON output to find matching queries\n let resolvedQueries: string[];\n try {\n resolvedQueries = JSON.parse(resolveResult.stdout);\n } catch (parseError) {\n logger.error('Failed to parse resolve queries output:', parseError);\n throw new Error('Failed to parse resolve queries output');\n }\n \n // Find the query that matches the requested name exactly\n const matchingQuery = resolvedQueries.find(queryPath => {\n const fileName = basename(queryPath);\n // Match exact query name: \"PrintAST\" should match \"PrintAST.ql\" only\n return fileName === `${queryName}.ql`;\n });\n\n if (!matchingQuery) {\n logger.error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\". Available queries:`, resolvedQueries.map(q => basename(q)));\n throw new Error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\"`);\n }\n \n logger.info(`Resolved query \"${queryName}\" to: ${matchingQuery}`);\n return matchingQuery;\n \n } catch (error) {\n logger.error('Error resolving query path:', error);\n throw error;\n }\n}\n\n/**\n * Interpret BQRS file using codeql bqrs interpret\n */\nasync function interpretBQRSFile(\n bqrsPath: string,\n queryPath: string,\n format: string,\n outputPath: string,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n // Extract query metadata to get id and kind\n const metadata = await extractQueryMetadata(queryPath);\n \n // Validate required metadata fields\n const missingFields = [];\n if (!metadata.id) missingFields.push('id');\n if (!metadata.kind) missingFields.push('kind');\n \n if (missingFields.length > 0) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(', ')}. Ensure the query file contains @id and @kind metadata.`\n };\n }\n \n // Sanitize metadata values to prevent command injection\n const sanitizedKind = (metadata.kind || '').replace(/[^a-zA-Z0-9_-]/g, '');\n const sanitizedId = (metadata.id || '').replace(/[^a-zA-Z0-9_/:-]/g, '');\n \n // Validate format for query kind\n const graphFormats = ['graphtext', 'dgml', 'dot'];\n if (graphFormats.includes(format) && metadata.kind !== 'graph') {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}`\n };\n }\n \n // Ensure output directory exists\n mkdirSync(dirname(outputPath), { recursive: true });\n \n // Build the codeql bqrs interpret command\n const params: Record = {\n format: format,\n output: outputPath,\n t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`]\n };\n \n logger.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`);\n \n // Execute codeql bqrs interpret\n const result = await executeCodeQLCommand(\n 'bqrs interpret',\n params,\n [bqrsPath]\n );\n \n return result;\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Failed to interpret BQRS file: ${error}`\n };\n }\n}\n\n/**\n * Get default output extension based on format\n */\nfunction getDefaultExtension(format: string): string {\n switch (format) {\n case 'sarif-latest':\n case 'sarifv2.1.0':\n return '.sarif';\n case 'csv':\n return '.csv';\n case 'graphtext':\n return '.txt';\n case 'dgml':\n return '.dgml';\n case 'dot':\n return '.dot';\n default:\n return '.txt';\n }\n}\n\n/**\n * Process query run results with optional interpretation or evaluation\n */\nasync function processQueryRunResults(\n result: CLIExecutionResult,\n params: Record,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params;\n \n // If no format or evaluationFunction specified, return as-is\n if (!format && !evaluationFunction) {\n return result;\n }\n \n // Ensure output (bqrs file) was generated\n if (!output) {\n return result;\n }\n \n const bqrsPath = output as string;\n \n // Determine the query path for metadata extraction\n let queryPath: string | null = null;\n \n if (query) {\n queryPath = query as string;\n } else if (queryName && queryLanguage) {\n // Try to resolve the query path again for evaluation\n queryPath = await resolveQueryPath(params, logger);\n }\n \n if (!queryPath) {\n logger.error('Cannot determine query path for interpretation/evaluation');\n return {\n ...result,\n stdout: result.stdout + '\\n\\nWarning: Query interpretation skipped - could not determine query path'\n };\n }\n \n // Handle new format parameter (preferred approach)\n if (format) {\n const outputFormat = format as string;\n \n // Determine output path\n let outputFilePath = interpretedOutput as string | undefined;\n if (!outputFilePath) {\n const ext = getDefaultExtension(outputFormat);\n outputFilePath = bqrsPath.replace('.bqrs', ext);\n }\n \n logger.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`);\n \n // Interpret the BQRS file\n const interpretResult = await interpretBQRSFile(\n bqrsPath,\n queryPath,\n outputFormat,\n outputFilePath,\n logger\n );\n \n if (interpretResult.success) {\n let enhancedOutput = result.stdout;\n enhancedOutput += `\\n\\nQuery results interpreted successfully with format: ${outputFormat}`;\n enhancedOutput += `\\nInterpreted output saved to: ${outputFilePath}`;\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n logger.error('Query interpretation failed:', interpretResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}`\n };\n }\n }\n \n // Handle legacy evaluationFunction parameter (deprecated)\n if (evaluationFunction) {\n logger.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`);\n logger.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`);\n \n // Perform the evaluation\n const evaluationResult: QueryEvaluationResult = await evaluateQueryResults(\n bqrsPath,\n queryPath,\n evaluationFunction as string,\n evaluationOutput as string | undefined\n );\n \n if (evaluationResult.success) {\n // Append evaluation results to the command output\n let enhancedOutput = result.stdout;\n \n if (evaluationResult.outputPath) {\n enhancedOutput += `\\n\\nQuery evaluation completed successfully.`;\n enhancedOutput += `\\nEvaluation output saved to: ${evaluationResult.outputPath}`;\n }\n \n if (evaluationResult.content) {\n enhancedOutput += `\\n\\n=== Query Results Evaluation ===\\n`;\n enhancedOutput += evaluationResult.content;\n }\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n // Evaluation failed, but don't fail the whole operation\n logger.error('Query evaluation failed:', evaluationResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query evaluation failed - ${evaluationResult.error}`\n };\n }\n }\n \n return result;\n } catch (error) {\n logger.error('Error in query results processing:', error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query processing error - ${error}`\n };\n }\n}", "/**\n * Query results evaluation functions for processing .bqrs files\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { writeFileSync, readFileSync } from 'fs';\nimport { dirname, isAbsolute } from 'path';\nimport { mkdirSync } from 'fs';\n\nexport interface QueryEvaluationResult {\n success: boolean;\n outputPath?: string;\n content?: string;\n error?: string;\n}\n\nexport interface QueryMetadata {\n kind?: string;\n name?: string;\n description?: string;\n id?: string;\n tags?: string[];\n}\n\n/**\n * Built-in evaluation functions\n */\nexport const BUILT_IN_EVALUATORS = {\n 'json-decode': 'JSON format decoder for query results',\n 'csv-decode': 'CSV format decoder for query results', \n 'mermaid-graph': 'Mermaid diagram generator for @kind graph queries (like PrintAST)',\n} as const;\n\nexport type BuiltInEvaluator = keyof typeof BUILT_IN_EVALUATORS;\n\n/**\n * Extract metadata from a CodeQL query file\n */\nexport async function extractQueryMetadata(queryPath: string): Promise {\n try {\n const queryContent = readFileSync(queryPath, 'utf-8');\n const metadata: QueryMetadata = {};\n \n // Extract metadata from comments using regex patterns\n const kindMatch = queryContent.match(/@kind\\s+([^\\s]+)/);\n if (kindMatch) metadata.kind = kindMatch[1];\n \n const nameMatch = queryContent.match(/@name\\s+(.+)/);\n if (nameMatch) metadata.name = nameMatch[1].trim();\n \n const descMatch = queryContent.match(/@description\\s+(.+)/);\n if (descMatch) metadata.description = descMatch[1].trim();\n \n const idMatch = queryContent.match(/@id\\s+(.+)/);\n if (idMatch) metadata.id = idMatch[1].trim();\n \n const tagsMatch = queryContent.match(/@tags\\s+(.+)/);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(/\\s+/).filter(t => t.length > 0);\n }\n \n return metadata;\n } catch (error) {\n logger.error('Failed to extract query metadata:', error);\n return {};\n }\n}\n\n/**\n * JSON decoder - converts .bqrs to JSON format\n */\nexport async function evaluateWithJsonDecoder(\n bqrsPath: string, \n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.json');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write JSON results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `JSON evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * CSV decoder - converts .bqrs to CSV format\n */\nexport async function evaluateWithCsvDecoder(\n bqrsPath: string,\n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'csv' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.csv');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write CSV results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `CSV evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Mermaid graph generator - converts @kind graph query results to mermaid diagrams\n */\nexport async function evaluateWithMermaidGraph(\n bqrsPath: string,\n queryPath: string,\n outputPath?: string\n): Promise {\n try {\n // First extract query metadata to confirm this is a graph query\n const metadata = await extractQueryMetadata(queryPath);\n \n if (metadata.kind !== 'graph') {\n logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`);\n return {\n success: false,\n error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`\n };\n }\n \n // Decode the BQRS file to JSON first\n const jsonResult = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!jsonResult.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}`\n };\n }\n \n // Parse the JSON results\n let queryResults;\n try {\n queryResults = JSON.parse(jsonResult.stdout);\n } catch (parseError) {\n return {\n success: false,\n error: `Failed to parse query results JSON: ${parseError}`\n };\n }\n \n // Generate mermaid diagram from graph results\n const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata);\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.md');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write markdown file with mermaid diagram\n writeFileSync(defaultOutputPath, mermaidContent);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: mermaidContent\n };\n } catch (error) {\n return {\n success: false,\n error: `Mermaid graph evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Generate mermaid diagram from CodeQL graph query results\n */\nfunction generateMermaidFromGraphResults(queryResults: unknown, metadata: QueryMetadata): string {\n const queryName = sanitizeMarkdown(metadata.name || 'CodeQL Query Results');\n const queryDesc = sanitizeMarkdown(metadata.description || 'Graph visualization of CodeQL query results');\n \n let mermaidContent = `# ${queryName}\\n\\n${queryDesc}\\n\\n`;\n \n // Handle different result structures that CodeQL graph queries can produce\n if (!queryResults || typeof queryResults !== 'object') {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Results]\\n```\\n';\n return mermaidContent;\n }\n \n // Check if results have the expected structure for graph queries\n const tuples = queryResults.tuples || queryResults;\n \n if (!Array.isArray(tuples) || tuples.length === 0) {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Graph Data]\\n```\\n';\n return mermaidContent;\n }\n \n mermaidContent += '```mermaid\\ngraph TD\\n';\n \n // Track nodes and edges to avoid duplicates\n const nodes = new Set();\n const edges = new Set();\n \n // Process each tuple in the results\n tuples.forEach((tuple: unknown, index: number) => {\n if (Array.isArray(tuple) && tuple.length >= 2) {\n // Extract source and target from tuple\n const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`);\n const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`);\n const label = tuple[2]?.toString() || '';\n \n // Add nodes\n nodes.add(source);\n nodes.add(target);\n \n // Add edge\n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n } else if (typeof tuple === 'object' && tuple !== null) {\n // Handle object-based results\n const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`);\n const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`);\n const label = tuple.label?.toString() || tuple.relation?.toString() || '';\n \n nodes.add(source);\n nodes.add(target);\n \n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n }\n });\n \n // If no edges were created, create a simple diagram showing the first few nodes\n if (edges.size === 0 && nodes.size > 0) {\n const nodeArray = Array.from(nodes).slice(0, 10); // Limit to avoid clutter\n nodeArray.forEach((node, index) => {\n if (index === 0) {\n mermaidContent += ` ${node}[${sanitizeLabel(node)}]\\n`;\n } else {\n mermaidContent += ` ${nodeArray[0]} --> ${node}\\n`;\n }\n });\n }\n \n mermaidContent += '```\\n\\n';\n \n // Add statistics\n mermaidContent += `## Query Statistics\\n\\n`;\n mermaidContent += `- Total nodes: ${nodes.size}\\n`;\n mermaidContent += `- Total edges: ${edges.size}\\n`;\n mermaidContent += `- Total tuples processed: ${tuples.length}\\n`;\n \n return mermaidContent;\n}\n\n/**\n * Sanitize node IDs for mermaid compatibility\n */\nfunction sanitizeNodeId(id: string): string {\n return id\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^(\\d)/, 'n$1') // Prefix with 'n' if starts with number\n .substring(0, 50); // Limit length\n}\n\n/**\n * Sanitize labels for mermaid compatibility\n */\nfunction sanitizeLabel(label: string): string {\n return label\n .replace(/[|\"`<>\\n\\r\\t]/g, '') // Remove problematic characters including backticks, newlines, angle brackets\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 30); // Limit length for readability\n}\n\n/**\n * Sanitize markdown content to prevent injection\n */\nfunction sanitizeMarkdown(content: string): string {\n return content\n .replace(/[<>\"`]/g, '') // Remove potentially dangerous characters\n .replace(/\\n/g, ' ') // Convert newlines to spaces\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 100); // Limit length\n}\n\n/**\n * Main evaluation function that determines which evaluator to use\n */\nexport async function evaluateQueryResults(\n bqrsPath: string,\n queryPath: string,\n evaluationFunction?: string,\n outputPath?: string\n): Promise {\n try {\n // If no evaluation function specified, default to json-decode\n const evalFunc = evaluationFunction || 'json-decode';\n \n logger.info(`Evaluating query results with function: ${evalFunc}`);\n \n // Handle built-in evaluation functions\n switch (evalFunc) {\n case 'json-decode':\n return await evaluateWithJsonDecoder(bqrsPath, outputPath);\n \n case 'csv-decode':\n return await evaluateWithCsvDecoder(bqrsPath, outputPath);\n \n case 'mermaid-graph':\n return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath);\n \n default:\n // Check if it's a path to a custom evaluation script\n if (isAbsolute(evalFunc)) {\n return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath);\n } else {\n return {\n success: false,\n error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(', ')}`\n };\n }\n }\n } catch (error) {\n return {\n success: false,\n error: `Query evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Execute custom evaluation script\n */\nasync function evaluateWithCustomScript(\n _bqrsPath: string,\n _queryPath: string,\n _scriptPath: string,\n _outputPath?: string\n): Promise {\n // TODO: Implement custom script execution\n // This would need to execute the script with bqrsPath and queryPath as arguments\n // and capture the output\n return {\n success: false,\n error: 'Custom evaluation scripts are not yet implemented'\n };\n}", "/**\n * Log directory management utilities for CodeQL query and test runs\n */\n\nimport { mkdirSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { randomBytes } from 'crypto';\nimport { getProjectTmpDir } from '../utils/temp-dir';\n\n/**\n * Ensure that a given path is within a base directory.\n * Throws an error if the path is outside the base directory.\n */\nfunction ensurePathWithinBase(baseDir: string, targetPath: string): string {\n const absBase = resolve(baseDir);\n const absTarget = resolve(targetPath);\n if (!absTarget.startsWith(absBase + '/') && absTarget !== absBase) {\n throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`);\n }\n return absTarget;\n}\n\n/**\n * Get or create a unique log directory for query/test runs\n * \n * @param logDir - Optional custom log directory from parameters\n * @returns Absolute path to the log directory\n */\nexport function getOrCreateLogDirectory(logDir?: string): string {\n // Use CODEQL_QUERY_LOG_DIR env var or default base\n const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir('query-logs');\n\n // If logDir is explicitly provided, validate it is within baseLogDir\n if (logDir) {\n const absLogDir = ensurePathWithinBase(baseLogDir, logDir);\n if (!existsSync(absLogDir)) {\n mkdirSync(absLogDir, { recursive: true });\n }\n return absLogDir;\n }\n \n // Otherwise, use baseLogDir and create a unique subdirectory\n \n // Create base directory if it doesn't exist\n if (!existsSync(baseLogDir)) {\n mkdirSync(baseLogDir, { recursive: true });\n }\n \n // Generate unique subdirectory with timestamp and random ID\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const uniqueId = randomBytes(4).toString('hex');\n const uniqueLogDir = join(baseLogDir, `query-run-${timestamp}-${uniqueId}`);\n \n mkdirSync(uniqueLogDir, { recursive: true });\n \n return uniqueLogDir;\n}\n", "/**\n * Secure project-local temporary directory utilities.\n *\n * All temporary files are created under `/.tmp/` which is\n * `.gitignore`d. This avoids writing to the OS temp directory\n * (`os.tmpdir()` / `/tmp`), which is world-readable and triggers\n * CWE-377 / CWE-378 (js/insecure-temporary-file).\n */\n\nimport { mkdirSync, mkdtempSync } from 'fs';\nimport { join } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n * Stored under `/.tmp` and excluded from version control.\n */\nconst PROJECT_TMP_BASE = join(getPackageRootDir(), '.tmp');\n\n/**\n * Return the project-local `.tmp` base directory, creating it if needed.\n */\nexport function getProjectTmpBase(): string {\n mkdirSync(PROJECT_TMP_BASE, { recursive: true });\n return PROJECT_TMP_BASE;\n}\n\n/**\n * Create a unique temporary directory under the project `.tmp` root.\n *\n * Works identically to `fs.mkdtempSync(os.tmpdir(), prefix)` but is\n * scoped to the repository.\n *\n * @param prefix - Directory name prefix (e.g. `'codeql-external-'`).\n * @returns Absolute path to the newly created directory.\n */\nexport function createProjectTempDir(prefix: string): string {\n const base = getProjectTmpBase();\n return mkdtempSync(join(base, prefix));\n}\n\n/**\n * Return a deterministic subdirectory under `.tmp/`, creating it\n * if it does not already exist.\n *\n * Useful for well-known scratch areas such as `query-logs` or `quickeval`.\n *\n * @param name - Subdirectory name (e.g. `'query-logs'`).\n * @returns Absolute path to the subdirectory.\n */\nexport function getProjectTmpDir(name: string): string {\n const dir = join(getProjectTmpBase(), name);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n", "/**\n * CodeQL BQRS info tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInfoTool: CLIToolDefinition = {\n name: 'codeql_bqrs_info',\n description: 'Get metadata and information about BQRS result files',\n command: 'codeql',\n subcommand: 'bqrs info',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to examine'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs info results.bqrs',\n 'codeql bqrs info --verbose results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * CodeQL BQRS interpret tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInterpretTool: CLIToolDefinition = {\n name: 'codeql_bqrs_interpret',\n description: 'Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)',\n command: 'codeql',\n subcommand: 'bqrs interpret',\n inputSchema: {\n file: z.string().describe('The BQRS file to interpret'),\n format: z.enum(['csv', 'sarif-latest', 'sarifv2.1.0', 'graphtext', 'dgml', 'dot'])\n .describe('Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)'),\n output: createCodeQLSchemas.output(),\n t: z.array(z.string())\n .describe('Query metadata key=value pairs. At least \"kind\" and \"id\" must be specified (e.g., [\"kind=graph\", \"id=js/print-ast\"])'),\n 'max-paths': z.number().optional()\n .describe('Maximum number of paths to produce for each alert with paths (default: 4)'),\n 'sarif-add-file-contents': z.boolean().optional()\n .describe('[SARIF only] Include full file contents for all files referenced in results'),\n 'sarif-add-snippets': z.boolean().optional()\n .describe('[SARIF only] Include code snippets for each location with context'),\n 'sarif-group-rules-by-pack': z.boolean().optional()\n .describe('[SARIF only] Place rule objects under their QL pack in tool.extensions property'),\n 'sarif-multicause-markdown': z.boolean().optional()\n .describe('[SARIF only] Include multi-cause alerts as Markdown-formatted lists'),\n 'sarif-category': z.string().optional()\n .describe('[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)'),\n 'csv-location-format': z.enum(['uri', 'line-column', 'offset-length']).optional()\n .describe('[CSV only] Format for locations in CSV output (default: line-column)'),\n 'dot-location-url-format': z.string().optional()\n .describe('[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})'),\n threads: z.number().optional()\n .describe('Number of threads for computing paths (0 = one per core, -N = leave N cores unused)'),\n 'column-kind': z.enum(['utf8', 'utf16', 'utf32', 'bytes']).optional()\n .describe('[SARIF only] Column kind for interpreting location columns'),\n 'unicode-new-lines': z.boolean().optional()\n .describe('[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs',\n 'codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs',\n 'codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs',\n 'codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs',\n 'codeql bqrs interpret --format=sarif-latest --sarif-add-snippets --sarif-category=security --output=results.sarif -t kind=path-problem -t id=go/path-injection results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};\n", "/**\n * CodeQL database analyze tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseAnalyzeTool: CLIToolDefinition = {\n name: 'codeql_database_analyze',\n description: 'Run queries or query suites against CodeQL databases',\n command: 'codeql',\n subcommand: 'database analyze',\n inputSchema: {\n database: z.string().describe('Path to the CodeQL database'),\n queries: z.string().describe('Queries or query suite to run'),\n output: z.string().optional().describe('Output file path'),\n format: z.enum(['csv', 'json', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n 'download-location': z.string().optional()\n .describe('Location to download missing dependencies'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n timeout: z.number().optional().describe('Timeout in seconds'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif',\n 'codeql database analyze mydb codeql/java-queries --format=csv'\n ]\n};", "/**\n * CodeQL database create tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createDatabaseResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseCreateTool: CLIToolDefinition = {\n name: 'codeql_database_create',\n description: 'Create a CodeQL database from source code',\n command: 'codeql',\n subcommand: 'database create',\n inputSchema: {\n database: z.string().describe('Database path/name to create'),\n language: z.string().optional().describe('Programming language(s) to extract'),\n 'source-root': z.string().optional().describe('Root directory of source code'),\n command: z.string().optional().describe('Build command for compiled languages'),\n 'build-mode': z.enum(['none', 'autobuild', 'manual']).optional()\n .describe('Build mode: none (interpreted langs), autobuild, or manual'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n overwrite: z.boolean().optional().describe('Overwrite existing database if it exists'),\n 'no-cleanup': z.boolean().optional().describe('Skip database cleanup after finalization'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database create --language=java --source-root=/path/to/project mydb',\n 'codeql database create --language=cpp --command=\"make all\" mydb',\n 'codeql database create --language=python,javascript mydb'\n ],\n resultProcessor: createDatabaseResultProcessor()\n};", "/**\n * CodeQL find class position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface ClassPosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a class name identifier in a QL file.\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findClassPosition(filepath: string, className: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Match class definition with the specific class name\n const classNameRegex = new RegExp(`\\\\bclass\\\\s+(${className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})\\\\b`);\n const match = classNameRegex.exec(line);\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The class name is in capture group 1\n const classNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = classNameStart + 1; // 1-based column numbering\n const end_col = start_col + className.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Class name '${className}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find class position tool with the MCP server\n */\nexport function registerFindClassPositionTool(server: McpServer): void {\n server.tool(\n 'find_class_position',\n 'Finds startline, startcol, endline endcol of a class for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the class to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findClassPosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding class position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find predicate position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface PredicatePosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a predicate name in a QL file.\n * Supports: \n * - predicate name(...) - predicates with no return type\n * - Type name(...) - predicates with return type (e.g., string foo())\n * - name(...) (inside class) - member predicates\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findPredicatePosition(filepath: string, predicateName: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n const escapedName = predicateName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Match predicate definition with the specific predicate name\n // Pattern 1: predicate name(...)\n const predicateKeywordRegex = new RegExp(`\\\\bpredicate\\\\s+(${escapedName})\\\\s*\\\\(`);\n let match = predicateKeywordRegex.exec(line);\n \n // Pattern 2: Type name(...) - predicates with return type\n // Matches: string foo(), int bar(), MyClass baz(), etc.\n // Must start at beginning of line (with optional whitespace) or after certain keywords\n if (!match) {\n const returnTypeRegex = new RegExp(`(?:^|\\\\s)(?:abstract\\\\s+)?(?:cached\\\\s+)?(?:private\\\\s+)?(?:deprecated\\\\s+)?(?:\\\\w+)\\\\s+(${escapedName})\\\\s*\\\\(`);\n match = returnTypeRegex.exec(line);\n }\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The predicate name is in capture group 1\n const predicateNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = predicateNameStart + 1; // 1-based column numbering\n const end_col = start_col + predicateName.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find predicate position tool with the MCP server\n */\nexport function registerFindPredicatePositionTool(server: McpServer): void {\n server.tool(\n 'find_predicate_position',\n 'Finds startline, startcol, endline endcol of a predicate for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the predicate to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findPredicatePosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding predicate position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find query files tool\n * Discovers and tracks all files related to a CodeQL query\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { findCodeQLQueryFiles } from '../../lib/query-file-finder';\nimport { logger } from '../../utils/logger';\n\n/**\n * Register the find_codeql_query_files tool\n */\nexport function registerFindCodeQLQueryFilesTool(server: McpServer): void {\n server.tool(\n 'find_codeql_query_files',\n 'Find and track all files and directories related to a CodeQL query, including resolved metadata',\n {\n queryPath: z.string().describe('Path to the CodeQL query file (.ql)'),\n language: z.string().optional().describe('Programming language (optional, will be inferred if not provided)'),\n resolveMetadata: z.boolean().optional().describe('Whether to resolve query metadata (default: true)')\n },\n async ({ queryPath, language, resolveMetadata }) => {\n try {\n const result = await findCodeQLQueryFiles(\n queryPath,\n language,\n resolveMetadata !== false // Default to true if not specified\n );\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]\n };\n } catch (error) {\n logger.error('Error finding CodeQL query files:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }\n ],\n isError: true\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query file finder utilities\n * Handles discovery and tracking of query-related files and directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { QueryFileInfo, QueryFilesResult } from '../types/codeql';\nimport { resolveQueryMetadata } from './metadata-resolver';\n\n// Supported CodeQL languages and their file extensions (alphabetically ordered)\nconst LANGUAGE_EXTENSIONS: Record = {\n actions: 'yml',\n cpp: 'cpp',\n csharp: 'cs',\n go: 'go',\n java: 'java',\n javascript: 'js',\n python: 'py',\n ruby: 'rb',\n swift: 'swift',\n typescript: 'ts'\n};\n\nconst KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS);\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n return LANGUAGE_EXTENSIONS[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Infer the language from the query file's directory structure\n */\nfunction inferLanguageFromPath(queryPath: string): string {\n const parts = queryPath.split(path.sep);\n\n for (const part of parts) {\n if (KNOWN_LANGUAGES.includes(part.toLowerCase())) {\n return part.toLowerCase();\n }\n }\n\n // Default fallback\n return 'unknown';\n}\n\n/**\n * Find the nearest qlpack.yml or codeql-pack.yml file by walking up the directory tree\n */\nfunction findNearestQlpack(startPath: string): string | null {\n let currentPath = startPath;\n const root = path.parse(currentPath).root;\n\n while (currentPath !== root) {\n // Check for codeql-pack.yml first (newer format), then qlpack.yml\n for (const packFile of ['codeql-pack.yml', 'qlpack.yml']) {\n const packPath = path.join(currentPath, packFile);\n if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) {\n return packPath;\n }\n }\n currentPath = path.dirname(currentPath);\n }\n\n return null;\n}\n\n/**\n * Read and parse qlpack.yml file\n */\nfunction readQlpackMetadata(qlpackPath: string): Record | null {\n try {\n const content = fs.readFileSync(qlpackPath, 'utf-8');\n const parsed = yaml.load(content) as Record;\n return parsed;\n } catch (_error) {\n // If we can't parse it, return null rather than failing\n return null;\n }\n}\n\n/**\n * Check if a file exists and return QueryFileInfo\n */\nfunction checkFile(filePath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n return {\n exists,\n path: filePath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: filePath // Return the path even on error\n };\n }\n}\n\n/**\n * Check if a directory exists and return QueryFileInfo\n */\nfunction checkDirectory(dirPath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n return {\n exists,\n path: dirPath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: dirPath // Return the path even on error\n };\n }\n}\n\n/**\n * Find all test code files in the test directory\n */\nfunction findTestCodeFiles(testDir: string, queryName: string, language: string): string[] {\n if (!fs.existsSync(testDir)) {\n return [];\n }\n\n try {\n const files = fs.readdirSync(testDir);\n const languageExt = getLanguageExtension(language);\n const testFiles: string[] = [];\n\n // Look for files matching the query name or other test code files\n const allValidExtensions = [...new Set([...Object.values(LANGUAGE_EXTENSIONS), 'yaml'])]; // Include yaml as alias for yml\n\n for (const file of files) {\n const filePath = path.join(testDir, file);\n const stat = fs.statSync(filePath);\n\n if (stat.isFile()) {\n // Include the primary test file matching query name\n if (file === `${queryName}.${languageExt}`) {\n testFiles.push(filePath);\n }\n // Include other code files (but not .qlref, .expected, .actual files)\n else if (!file.endsWith('.qlref') && !file.endsWith('.expected') && !file.endsWith('.actual')) {\n const ext = path.extname(file).slice(1);\n if (ext === languageExt || allValidExtensions.includes(ext)) {\n testFiles.push(filePath);\n }\n }\n }\n }\n\n return testFiles;\n } catch {\n return [];\n }\n}\n\n/**\n * Find CodeQL query files and directories based on a query file path\n * Optionally resolves metadata if the query file exists\n */\nexport async function findCodeQLQueryFiles(\n queryFilePath: string,\n language?: string,\n resolveMetadata: boolean = true\n): Promise {\n // Resolve absolute path\n const absoluteQueryPath = path.resolve(queryFilePath);\n\n // Extract query name and directory\n const queryName = path.basename(absoluteQueryPath, '.ql');\n const queryDir = path.dirname(absoluteQueryPath);\n\n // Infer language if not provided\n const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath);\n\n // Check query file itself\n const queryPath = checkFile(absoluteQueryPath);\n const queryDirectory = checkDirectory(queryDir);\n\n // Check for documentation files\n const mdPath = path.join(queryDir, `${queryName}.md`);\n const qhelpPath = path.join(queryDir, `${queryName}.qhelp`);\n const mdInfo = checkFile(mdPath);\n const qhelpInfo = checkFile(qhelpPath);\n\n const documentationPath: QueryFileInfo = mdInfo.exists ? mdInfo : (qhelpInfo.exists ? qhelpInfo : {\n exists: false,\n path: mdPath // Suggest .md as the default\n });\n\n // Check for specification file\n const qspecPath = path.join(queryDir, `${queryName}.qspec`);\n const specificationPath = checkFile(qspecPath);\n\n // Determine test directory\n // Pattern: if query is in .../src/QueryName/, test should be in .../test/QueryName/\n let testDir: string;\n if (queryDir.includes(`${path.sep}src${path.sep}`)) {\n // Find the last occurrence of /src/ and replace it with /test/\n const parts = queryDir.split(path.sep);\n const srcIndex = parts.lastIndexOf('src');\n if (srcIndex !== -1) {\n parts[srcIndex] = 'test';\n testDir = parts.join(path.sep);\n } else {\n // Fallback in case split didn't find it\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n } else {\n // Fallback: if not in src directory, construct test dir based on parent\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n const testDirectory = checkDirectory(testDir);\n\n // Check for .qlref file\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const qlrefInfo = checkFile(qlrefPath);\n\n // Find test code files\n const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage);\n\n // Check for expected results\n const expectedPath = path.join(testDir, `${queryName}.expected`);\n const expectedResultsPath = checkFile(expectedPath);\n\n // Check for actual results\n const actualPath = path.join(testDir, `${queryName}.actual`);\n const actualResultsPath = checkFile(actualPath);\n\n // Check for test database\n const testprojPath = path.join(testDir, `${queryName}.testproj`);\n const testDatabasePath = checkDirectory(testprojPath);\n\n // Determine missing files\n const missingFiles: string[] = [];\n if (!queryPath.exists) missingFiles.push(queryPath.path);\n if (!documentationPath.exists) missingFiles.push(documentationPath.path);\n if (!specificationPath.exists) missingFiles.push(specificationPath.path);\n if (!testDirectory.exists) missingFiles.push(testDirectory.path);\n if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path);\n if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`));\n if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path);\n\n const allFilesExist = missingFiles.length === 0;\n\n // Resolve metadata if requested and query file exists\n let metadata: { [key: string]: string | string[] } | undefined;\n if (resolveMetadata && queryPath.exists) {\n const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath);\n if (resolvedMetadata) {\n metadata = resolvedMetadata;\n }\n }\n\n // Resolve pack metadata and directories by finding the nearest qlpack.yml files\n let packMetadata: Record | undefined;\n const queryPackPath = findNearestQlpack(queryDir);\n const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir;\n if (queryPackPath) {\n const parsed = readQlpackMetadata(queryPackPath);\n if (parsed) {\n packMetadata = parsed;\n }\n }\n\n // Find pack directory for test files\n const testPackPath = findNearestQlpack(testDir);\n const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir;\n\n return {\n queryName,\n language: detectedLanguage,\n\n allFilesExist,\n\n files: {\n query: {\n dir: queryDirectory.path,\n doc: path.basename(documentationPath.path),\n packDir: queryPackDir,\n query: path.basename(queryPath.path),\n spec: path.basename(specificationPath.path)\n },\n test: {\n actual: path.basename(actualResultsPath.path),\n dir: testDirectory.path,\n expected: path.basename(expectedResultsPath.path),\n packDir: testPackDir,\n qlref: path.basename(qlrefInfo.path),\n testCode: testCodePaths,\n testDatabaseDir: testDatabasePath.path\n }\n },\n\n metadata,\n\n missingFiles,\n\n packMetadata,\n\n status: {\n actualResultsExist: actualResultsPath.exists,\n documentationExists: documentationPath.exists,\n expectedResultsExist: expectedResultsPath.exists,\n hasTestCode: testCodePaths.length > 0,\n qlrefExists: qlrefInfo.exists,\n queryExists: queryPath.exists,\n specificationExists: specificationPath.exists,\n testDatabaseDirExists: testDatabasePath.exists,\n testDirectoryExists: testDirectory.exists\n }\n };\n}\n", "\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n", "/**\n * CodeQL metadata resolver utilities\n * Handles resolution of query metadata using the CodeQL CLI\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * Query metadata structure returned by codeql resolve metadata\n */\nexport interface QueryMetadata {\n [key: string]: string | string[];\n}\n\n/**\n * Resolve metadata for a CodeQL query file\n * @param queryPath - Absolute or relative path to the .ql query file\n * @returns Parsed metadata object or null if resolution fails\n */\nexport async function resolveQueryMetadata(queryPath: string): Promise {\n try {\n logger.info(`Resolving metadata for query: ${queryPath}`);\n\n const result = await executeCodeQLCommand(\n 'resolve metadata',\n { format: 'json' },\n [queryPath]\n );\n\n if (!result.success) {\n logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error);\n return null;\n }\n\n // Parse the JSON output\n try {\n const metadata = JSON.parse(result.stdout);\n return metadata;\n } catch (parseError) {\n logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError);\n return null;\n }\n } catch (error) {\n logger.error(`Error resolving metadata for ${queryPath}:`, error);\n return null;\n }\n}\n", "/**\n * CodeQL generate log-summary tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateLogSummaryTool: CLIToolDefinition = {\n name: 'codeql_generate_log-summary',\n description: 'Create a summary of a structured JSON evaluator event log file',\n command: 'codeql',\n subcommand: 'generate log-summary',\n inputSchema: {\n inputLog: z.string().describe('Path to the evaluator log file to summarize'),\n outputFile: z.string().optional().describe('Path to write the summary (optional, defaults to stdout)'),\n format: z.enum(['text', 'predicates', 'overall']).optional()\n .describe('Output format: text (human-readable), predicates (JSON), or overall (stats)'),\n 'minify-output': z.boolean().optional().describe('Minify JSON output'),\n utc: z.boolean().optional().describe('Force UTC timestamps'),\n 'deduplicate-stage-summaries': z.boolean().optional().describe('Deduplicate stage summaries'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt',\n 'codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt',\n 'codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL generate query-help tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateQueryHelpTool: CLIToolDefinition = {\n name: 'codeql_generate_query-help',\n description: 'Generate query help documentation from QLDoc comments',\n command: 'codeql',\n subcommand: 'generate query-help',\n inputSchema: {\n query: z.string().describe('Path to the query file to generate help for'),\n outputFile: z.string().optional().describe('Path to write the help documentation'),\n format: z.enum(['markdown', 'text', 'html']).optional()\n .describe('Output format for the help documentation'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate query-help -- MyQuery.ql',\n 'codeql generate query-help --format=markdown -- MyQuery.ql help.md',\n 'codeql generate query-help --format=html -- MyQuery.ql help.html'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL Language Server Eval tool for MCP server\n * Provides real-time QL code validation through LSP communication\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { CodeQLLanguageServer, Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\n// Global language server instance for reuse across evaluations\nlet globalLanguageServer: CodeQLLanguageServer | null = null;\n\nexport interface LanguageServerEvalParams {\n qlCode: string;\n workspaceUri?: string;\n serverOptions?: LanguageServerOptions;\n}\n\nexport interface LanguageServerEvalResult {\n isValid: boolean;\n diagnostics: Diagnostic[];\n summary: {\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n };\n formattedOutput: string;\n}\n\n/**\n * Format diagnostics for human-readable output\n */\nfunction formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '\u2705 No issues found in QL code';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${diagnostics.length} issue(s):\\n`);\n\n diagnostics.forEach((diagnostic, index) => {\n const severityIcon = getSeverityIcon(diagnostic.severity);\n const severityName = getSeverityName(diagnostic.severity);\n const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`;\n \n lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`);\n lines.push(` ${diagnostic.message}`);\n if (diagnostic.source) {\n lines.push(` Source: ${diagnostic.source}`);\n }\n if (diagnostic.code) {\n lines.push(` Code: ${diagnostic.code}`);\n }\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n\nfunction getSeverityIcon(severity: number): string {\n switch (severity) {\n case 1: return '\u274C'; // Error\n case 2: return '\u26A0\uFE0F'; // Warning\n case 3: return '\u2139\uFE0F'; // Information\n case 4: return '\uD83D\uDCA1'; // Hint\n default: return '\u2753';\n }\n}\n\nfunction getSeverityName(severity: number): string {\n switch (severity) {\n case 1: return 'Error';\n case 2: return 'Warning';\n case 3: return 'Information';\n case 4: return 'Hint';\n default: return 'Unknown';\n }\n}\n\n/**\n * Initialize or get existing language server instance\n */\nasync function getLanguageServer(options: LanguageServerOptions = {}): Promise {\n if (globalLanguageServer && globalLanguageServer.isRunning()) {\n return globalLanguageServer;\n }\n\n // Set default options \u2014 use packageRootDir instead of process.cwd()\n // so the QL search path works regardless of where the server is launched.\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n const defaultOptions: LanguageServerOptions = {\n searchPath: resolve(pkgRoot, 'ql'),\n loglevel: 'WARN',\n ...options\n };\n\n globalLanguageServer = new CodeQLLanguageServer(defaultOptions);\n \n try {\n await globalLanguageServer.start();\n \n // Use provided workspace URI or default to ql directory under package root\n const workspaceUri = pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await globalLanguageServer.initialize(workspaceUri);\n \n logger.info('CodeQL Language Server started and initialized successfully');\n return globalLanguageServer;\n } catch (error) {\n logger.error('Failed to start language server:', error);\n globalLanguageServer = null;\n throw error;\n }\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server\n */\nexport async function evaluateQLCode({\n qlCode,\n workspaceUri: _workspaceUri,\n serverOptions = {}\n}: LanguageServerEvalParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n \n const languageServer = await getLanguageServer(serverOptions);\n \n // Generate unique URI for this evaluation\n const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href;\n \n const diagnostics = await languageServer.evaluateQL(qlCode, evalUri);\n \n // Count diagnostics by severity\n const summary = {\n errorCount: diagnostics.filter(d => d.severity === 1).length,\n warningCount: diagnostics.filter(d => d.severity === 2).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n hintCount: diagnostics.filter(d => d.severity === 4).length\n };\n \n const isValid = summary.errorCount === 0;\n const formattedOutput = formatDiagnostics(diagnostics);\n \n logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`);\n \n return {\n isValid,\n diagnostics,\n summary,\n formattedOutput\n };\n \n } catch (error) {\n logger.error('Error evaluating QL code:', error);\n throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Shutdown the global language server\n */\nexport async function shutdownLanguageServer(): Promise {\n if (globalLanguageServer) {\n logger.info('Shutting down CodeQL Language Server...');\n await globalLanguageServer.shutdown();\n globalLanguageServer = null;\n }\n}\n\n/**\n * Register the language server eval tool with the MCP server\n */\nexport function registerLanguageServerEvalTool(server: McpServer): void {\n server.tool(\n 'codeql_language_server_eval',\n 'Authoritative syntax and semantic validation of CodeQL (QL) code via the CodeQL Language Server. Compiles the query and provides real-time diagnostics with precise error locations. Use this for accurate validation; for quick heuristic checks without compilation, use validate_codeql_query instead.',\n {\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level')\n },\n async ({ ql_code, workspace_uri, search_path, log_level }) => {\n try {\n const serverOptions: LanguageServerOptions = {};\n \n if (search_path) {\n serverOptions.searchPath = search_path;\n }\n if (log_level) {\n serverOptions.loglevel = log_level;\n }\n \n const result = await evaluateQLCode({\n qlCode: ql_code,\n workspaceUri: workspace_uri,\n serverOptions\n });\n \n // Return structured result\n const responseContent = {\n isValid: result.isValid,\n summary: result.summary,\n formattedOutput: result.formattedOutput,\n diagnostics: result.diagnostics.map(d => ({\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n severity: getSeverityName(d.severity),\n message: d.message,\n code: d.code,\n source: d.source\n }))\n };\n \n return {\n content: [\n { \n type: 'text', \n text: JSON.stringify(responseContent, null, 2) \n }\n ],\n };\n \n } catch (error) {\n logger.error('Error in language server eval tool:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n \n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownLanguageServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownLanguageServer();\n });\n}", "/**\n * CodeQL Language Server manager for LSP communication\n * Manages the lifecycle and communication with the CodeQL language server process\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { setTimeout, clearTimeout } from 'timers';\nimport { pathToFileURL } from 'url';\nimport { delimiter, join } from 'path';\nimport { logger } from '../utils/logger';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\n\nexport interface LSPMessage {\n jsonrpc: '2.0';\n id?: number | string;\n method: string;\n params?: unknown;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport interface Diagnostic {\n range: {\n start: { line: number; character: number };\n end: { line: number; character: number };\n };\n severity: number; // 1=Error, 2=Warning, 3=Information, 4=Hint\n source?: string;\n message: string;\n code?: string | number;\n}\n\nexport interface PublishDiagnosticsParams {\n uri: string;\n diagnostics: Diagnostic[];\n}\n\nexport interface LanguageServerOptions {\n searchPath?: string;\n logdir?: string;\n loglevel?: 'OFF' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'ALL';\n synchronous?: boolean;\n verbosity?: 'errors' | 'warnings' | 'progress' | 'progress+' | 'progress++' | 'progress+++';\n}\n\nexport class CodeQLLanguageServer extends EventEmitter {\n private server: ChildProcess | null = null;\n private messageId = 1;\n private pendingResponses = new Map void; reject: (_error: Error) => void }>();\n private isInitialized = false;\n private messageBuffer = '';\n\n constructor(private _options: LanguageServerOptions = {}) {\n super();\n }\n\n async start(): Promise {\n if (this.server) {\n throw new Error('Language server is already running');\n }\n\n logger.info('Starting CodeQL Language Server...');\n\n const args = [\n 'execute', 'language-server',\n '--check-errors=ON_CHANGE'\n ];\n\n // Add optional arguments\n if (this._options.searchPath) {\n args.push(`--search-path=${this._options.searchPath}`);\n }\n if (this._options.logdir) {\n args.push(`--logdir=${this._options.logdir}`);\n }\n if (this._options.loglevel) {\n args.push(`--loglevel=${this._options.loglevel}`);\n }\n if (this._options.synchronous) {\n args.push('--synchronous');\n }\n if (this._options.verbosity) {\n args.push(`--verbosity=${this._options.verbosity}`);\n }\n\n // Build environment with CODEQL_PATH directory prepended to PATH\n // (mirrors the approach in cli-executor.ts getSafeEnvironment).\n const spawnEnv = { ...process.env };\n const codeqlDir = getResolvedCodeQLDir();\n if (codeqlDir && spawnEnv.PATH) {\n spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`;\n } else if (codeqlDir) {\n spawnEnv.PATH = codeqlDir;\n }\n\n this.server = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv\n });\n\n this.server.stderr?.on('data', (data) => {\n logger.debug('CodeQL LS stderr:', data.toString());\n });\n\n this.server.stdout?.on('data', (data) => {\n this.handleStdout(data);\n });\n\n this.server.on('error', (error) => {\n logger.error('CodeQL Language Server error:', error);\n this.emit('error', error);\n });\n\n this.server.on('exit', (code) => {\n logger.info('CodeQL Language Server exited with code:', code);\n this.server = null;\n this.isInitialized = false;\n this.emit('exit', code);\n });\n\n // Wait for server to be ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n private handleStdout(data: Buffer): void {\n this.messageBuffer += data.toString();\n \n let headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n while (headerEnd !== -1) {\n const header = this.messageBuffer.substring(0, headerEnd);\n const contentLengthMatch = header.match(/Content-Length: (\\d+)/);\n \n if (contentLengthMatch) {\n const contentLength = parseInt(contentLengthMatch[1]);\n const messageStart = headerEnd + 4;\n const messageEnd = messageStart + contentLength;\n \n if (this.messageBuffer.length >= messageEnd) {\n const messageContent = this.messageBuffer.substring(messageStart, messageEnd);\n this.messageBuffer = this.messageBuffer.substring(messageEnd);\n \n try {\n const message: LSPMessage = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse LSP message:', error, messageContent);\n }\n \n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid LSP header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: LSPMessage): void {\n logger.debug('Received LSP message:', message);\n\n // Handle responses to our requests\n if (message.id !== undefined && this.pendingResponses.has(Number(message.id))) {\n const pending = this.pendingResponses.get(Number(message.id))!;\n this.pendingResponses.delete(Number(message.id));\n \n if (message.error) {\n pending.reject(new Error(`LSP Error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications from server\n if (message.method === 'textDocument/publishDiagnostics') {\n this.emit('diagnostics', message.params as PublishDiagnosticsParams);\n }\n }\n\n private sendMessage(message: LSPMessage): void {\n if (!this.server?.stdin) {\n throw new Error('Language server is not running');\n }\n\n const messageStr = JSON.stringify(message);\n const contentLength = Buffer.byteLength(messageStr, 'utf8');\n const header = `Content-Length: ${contentLength}\\r\\n\\r\\n`;\n const fullMessage = header + messageStr;\n\n logger.debug('Sending LSP message:', fullMessage);\n this.server.stdin.write(fullMessage);\n }\n\n private sendRequest(method: string, params?: unknown): Promise {\n const id = this.messageId++;\n const message: LSPMessage = {\n jsonrpc: '2.0',\n id,\n method,\n params\n };\n\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n this.sendMessage(message);\n \n // Add timeout\n setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 10000); // 10 second timeout\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n const message: LSPMessage = {\n jsonrpc: '2.0',\n method,\n params\n };\n this.sendMessage(message);\n }\n\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n return;\n }\n\n logger.info('Initializing CodeQL Language Server...');\n\n const initParams = {\n processId: process.pid,\n clientInfo: {\n name: 'codeql-development-mcp-server',\n version: '2.23.9'\n },\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n didClose: true\n },\n publishDiagnostics: {}\n }\n }\n };\n\n if (workspaceUri) {\n (initParams as unknown as { workspaceFolders: unknown[] }).workspaceFolders = [{\n uri: workspaceUri,\n name: 'codeql-workspace'\n }];\n }\n\n await this.sendRequest('initialize', initParams);\n this.sendNotification('initialized', {});\n \n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n async evaluateQL(qlCode: string, uri?: string): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n\n // Default to a project-local virtual URI rather than /tmp\n const documentUri = uri || pathToFileURL(join(getProjectTmpDir('lsp-eval'), 'eval.ql')).href;\n\n return new Promise((resolve, reject) => {\n let diagnosticsReceived = false;\n const timeout = setTimeout(() => {\n if (!diagnosticsReceived) {\n this.removeAllListeners('diagnostics');\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 5000);\n\n // Listen for diagnostics\n const diagnosticsHandler = (params: PublishDiagnosticsParams) => {\n if (params.uri === documentUri) {\n diagnosticsReceived = true;\n clearTimeout(timeout);\n this.removeListener('diagnostics', diagnosticsHandler);\n\n // Close the document\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri: documentUri }\n });\n\n resolve(params.diagnostics);\n }\n };\n\n this.on('diagnostics', diagnosticsHandler);\n\n // Open the document with the QL code\n this.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri: documentUri,\n languageId: 'ql',\n version: 1,\n text: qlCode\n }\n });\n });\n }\n\n async shutdown(): Promise {\n if (!this.server) {\n return;\n }\n\n logger.info('Shutting down CodeQL Language Server...');\n\n try {\n await this.sendRequest('shutdown', {});\n this.sendNotification('exit', {});\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n }, 1000);\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL pack install tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackInstallTool: CLIToolDefinition = {\n name: 'codeql_pack_install',\n description: 'Install CodeQL pack dependencies',\n command: 'codeql',\n subcommand: 'pack install',\n inputSchema: {\n packDir: z.string().optional().describe('Directory containing qlpack.yml (default: current)'),\n force: z.boolean().optional().describe('Force reinstall of dependencies'),\n 'no-strict-mode': z.boolean().optional()\n .describe('Allow non-strict dependency resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack install',\n 'codeql pack install --force /path/to/pack',\n 'codeql pack install --no-strict-mode'\n ]\n};", "/**\n * CodeQL pack ls tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackLsTool: CLIToolDefinition = {\n name: 'codeql_pack_ls',\n description: 'List CodeQL packs under some local directory path',\n command: 'codeql',\n subcommand: 'pack ls',\n inputSchema: {\n dir: z.string().optional().describe('The root directory of the package or workspace, defaults to the current working directory'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format: text (default) or json'),\n groups: z.string().optional()\n .describe('List of CodeQL pack groups to include or exclude'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack ls -- .',\n 'codeql pack ls --format=json -- /path/to/pack-directory',\n 'codeql pack ls --format=json --groups=queries,tests -- .'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL query profiling tool\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand } from '../../lib/cli-executor';\nimport { logger } from '../../utils/logger';\nimport { writeFileSync, readFileSync, existsSync } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { mkdirSync } from 'fs';\n\ninterface EvaluatorLogEvent {\n time: string;\n type: string;\n eventId: number;\n nanoTime: number;\n [key: string]: unknown;\n}\n\ninterface PipelineNode {\n eventId: number;\n name: string;\n position?: string;\n type?: string;\n startTime: number;\n endTime: number;\n duration: number;\n resultSize?: number;\n tupleCount?: number;\n dependencies: string[];\n dependencyEventIds: number[];\n}\n\ninterface ProfileData {\n queryName: string;\n totalDuration: number;\n totalEvents: number;\n pipelines: PipelineNode[];\n}\n\n/**\n * Parse evaluator log and create profile data\n */\nfunction parseEvaluatorLog(logPath: string): ProfileData {\n const logContent = readFileSync(logPath, 'utf-8');\n \n // Split by empty lines to get each JSON object (handles both JSONL and pretty-printed JSON)\n const jsonObjects = logContent.split('\\n\\n').filter((s) => s.trim());\n const events: EvaluatorLogEvent[] = jsonObjects\n .map((obj) => {\n try {\n return JSON.parse(obj);\n } catch (_error) {\n logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`);\n return null;\n }\n })\n .filter((event): event is EvaluatorLogEvent => event !== null);\n\n // Map to track pipeline nodes by their start event ID\n const pipelineMap = new Map>();\n // Map to track dependency event IDs by predicate name\n const predicateNameToEventId = new Map();\n \n let queryName = '';\n let queryStartTime = 0;\n let queryEndTime = 0;\n\n for (const event of events) {\n switch (event.type) {\n case 'QUERY_STARTED':\n queryName = (event.queryName as string) || '';\n queryStartTime = event.nanoTime;\n break;\n\n case 'QUERY_COMPLETED':\n queryEndTime = event.nanoTime;\n break;\n\n case 'PREDICATE_STARTED': {\n const predicateName = event.predicateName as string;\n const position = event.position as string | undefined;\n const predicateType = event.predicateType as string | undefined;\n const dependencies = event.dependencies as Record | undefined;\n \n // Track this predicate's event ID by name for dependency resolution\n predicateNameToEventId.set(predicateName, event.eventId);\n \n // Get dependency event IDs\n const dependencyEventIds: number[] = [];\n const dependencyNames: string[] = [];\n if (dependencies) {\n for (const depName of Object.keys(dependencies)) {\n dependencyNames.push(depName);\n const depEventId = predicateNameToEventId.get(depName);\n if (depEventId !== undefined) {\n dependencyEventIds.push(depEventId);\n }\n }\n }\n\n pipelineMap.set(event.eventId, {\n eventId: event.eventId,\n name: predicateName,\n position,\n type: predicateType,\n startTime: event.nanoTime,\n dependencies: dependencyNames,\n dependencyEventIds,\n });\n break;\n }\n\n case 'PREDICATE_COMPLETED': {\n const startEventId = event.startEvent as number;\n const pipelineInfo = pipelineMap.get(startEventId);\n if (pipelineInfo) {\n const startEvent = events.find((e) => e.eventId === startEventId);\n if (startEvent) {\n const duration = (event.nanoTime - startEvent.nanoTime) / 1_000_000; // Convert to ms\n pipelineInfo.endTime = event.nanoTime;\n pipelineInfo.duration = duration;\n pipelineInfo.resultSize = event.resultSize as number | undefined;\n pipelineInfo.tupleCount = event.tupleCount as number | undefined;\n }\n }\n break;\n }\n }\n }\n\n // Convert to array and maintain original evaluation order (by eventId)\n const pipelines: PipelineNode[] = Array.from(pipelineMap.values())\n .filter((p): p is PipelineNode => p.duration !== undefined)\n .sort((a, b) => a.eventId - b.eventId);\n\n const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1_000_000 : 0;\n\n return {\n queryName,\n totalDuration,\n totalEvents: events.length,\n pipelines,\n };\n}\n\n/**\n * Format profile data as JSON\n */\nfunction formatAsJson(profile: ProfileData): string {\n return JSON.stringify(profile, null, 2);\n}\n\n/**\n * Format profile data as Mermaid diagram\n * Creates a graph showing the query evaluation pipelines in order of execution\n * with dependencies as edges, annotated with duration and result sizes\n */\nfunction formatAsMermaid(profile: ProfileData): string {\n const lines: string[] = [];\n\n lines.push('```mermaid');\n lines.push('graph TD');\n lines.push('');\n \n // Add query root node\n lines.push(` QUERY[\"${basename(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms\"]`);\n lines.push('');\n \n // Create nodes for each pipeline in evaluation order (already sorted by eventId)\n profile.pipelines.forEach((pipeline) => {\n const nodeId = `P${pipeline.eventId}`;\n const duration = pipeline.duration.toFixed(2);\n const resultSize = pipeline.resultSize !== undefined ? pipeline.resultSize : '?';\n // Sanitize predicate name for Mermaid\n const name = pipeline.name.replace(/[<>]/g, '').substring(0, 40);\n lines.push(` ${nodeId}[\"${name}
${duration}ms | ${resultSize} results\"]`);\n });\n \n lines.push('');\n \n // Add edges from QUERY to root pipelines (those with no dependencies)\n const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0);\n \n rootPipelines.forEach((pipeline) => {\n lines.push(` QUERY --> P${pipeline.eventId}`);\n });\n \n lines.push('');\n \n // Add edges between pipelines based on dependencies (using eventIds to preserve links)\n profile.pipelines.forEach((pipeline) => {\n pipeline.dependencyEventIds.forEach((depEventId) => {\n const duration = pipeline.duration.toFixed(2);\n lines.push(` P${depEventId} -->|\"${duration}ms\"| P${pipeline.eventId}`);\n });\n });\n \n lines.push('');\n lines.push(' classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px');\n lines.push(' classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px');\n lines.push(' class QUERY query');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Register the profile_codeql_query tool\n */\nexport function registerProfileCodeQLQueryTool(server: McpServer): void {\n server.tool(\n 'profile_codeql_query',\n 'Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file',\n {\n query: z.string().describe('Path to the .ql query file'),\n database: z.string().describe('Path to the CodeQL database directory'),\n evaluatorLog: z\n .string()\n .optional()\n .describe(\n 'Path to an existing structured JSON log (e.g., evaluator-log.jsonl) file. If not provided, the tool will run the query to generate one.'\n ),\n outputDir: z\n .string()\n .optional()\n .describe('Directory to write profiling data files (defaults to same directory as evaluator log)'),\n },\n async (params) => {\n try {\n const { query, database, evaluatorLog, outputDir } = params;\n let logPath = evaluatorLog;\n let bqrsPath: string | undefined;\n let sarifPath: string | undefined;\n\n // If evaluator log not provided, run the query to generate one\n if (!logPath) {\n logger.info('No evaluator log provided, running query to generate one');\n\n // Determine output directory\n const defaultOutputDir = outputDir || join(dirname(query as string), 'profile-output');\n mkdirSync(defaultOutputDir, { recursive: true });\n\n logPath = join(defaultOutputDir, 'evaluator-log.jsonl');\n bqrsPath = join(defaultOutputDir, 'query-results.bqrs');\n sarifPath = join(defaultOutputDir, 'query-results.sarif');\n\n // Run query with evaluator logging and tuple counting\n const queryResult = await executeCodeQLCommand(\n 'query run',\n {\n database: database as string,\n output: bqrsPath,\n 'evaluator-log': logPath,\n 'tuple-counting': true,\n 'evaluator-log-level': 5,\n },\n [query as string]\n );\n\n if (!queryResult.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to run query: ${queryResult.stderr || queryResult.error}`,\n },\n ],\n isError: true,\n };\n }\n\n // Generate SARIF interpretation\n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n\n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n }\n\n // Verify evaluator log exists\n if (!existsSync(logPath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Evaluator log not found at: ${logPath}`,\n },\n ],\n isError: true,\n };\n }\n\n // Parse the evaluator log\n logger.info(`Parsing evaluator log from: ${logPath}`);\n const profile = parseEvaluatorLog(logPath);\n\n // Determine output directory for profile\n const profileOutputDir = outputDir || dirname(logPath);\n mkdirSync(profileOutputDir, { recursive: true });\n\n // Write profile JSON file\n const jsonPath = join(profileOutputDir, 'query-evaluation-profile.json');\n const jsonContent = formatAsJson(profile);\n writeFileSync(jsonPath, jsonContent);\n logger.info(`Profile JSON written to: ${jsonPath}`);\n\n // Write profile Mermaid diagram file\n const mdPath = join(profileOutputDir, 'query-evaluation-profile.md');\n const mdContent = formatAsMermaid(profile);\n writeFileSync(mdPath, mdContent);\n logger.info(`Profile Mermaid diagram written to: ${mdPath}`);\n\n // Build response message\n const outputFiles: string[] = [\n `Profile JSON: ${jsonPath}`,\n `Profile Mermaid: ${mdPath}`,\n `Evaluator Log: ${logPath}`,\n ];\n\n if (bqrsPath) {\n outputFiles.push(`Query Results (BQRS): ${bqrsPath}`);\n }\n\n if (sarifPath && existsSync(sarifPath)) {\n outputFiles.push(`Query Results (SARIF): ${sarifPath}`);\n }\n\n const responseText = [\n 'Query profiling completed successfully!',\n '',\n 'Output Files:',\n ...outputFiles.map((f) => ` - ${f}`),\n '',\n 'Profile Summary:',\n ` - Query: ${basename(profile.queryName)}`,\n ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`,\n ` - Total Pipelines: ${profile.pipelines.length}`,\n ` - Total Events: ${profile.totalEvents}`,\n '',\n 'First 5 Pipeline Nodes (in evaluation order):',\n ...profile.pipelines.slice(0, 5).map((p, idx) => {\n return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || '?'} results)`;\n }),\n ].join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n };\n } catch (error) {\n logger.error('Error profiling CodeQL query:', error);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query compile tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryCompileTool: CLIToolDefinition = {\n name: 'codeql_query_compile',\n description: 'Compile and validate CodeQL queries',\n command: 'codeql',\n subcommand: 'query compile',\n inputSchema: {\n query: z.string().describe('Path to the CodeQL query file (.ql)'),\n database: z.string().optional().describe('Path to the CodeQL database'),\n library: z.string().optional().describe('Path to query library'),\n output: z.string().optional().describe('Output file path'),\n warnings: z.enum(['hide', 'show', 'error']).optional()\n .describe('How to handle compilation warnings'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql query compile --database=/path/to/db MyQuery.ql',\n 'codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql'\n ]\n};", "/**\n * CodeQL query format tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Custom result processor for codeql query format tool\n * Exit code 1 with --check-only means \"file would change\" - this is success for format checking\n */\nfunction formatResultProcessor(result: CLIExecutionResult, params: Record): string {\n const isCheckOnly = params['check-only'];\n const hasFormatChanges = result.exitCode === 1;\n \n if (isCheckOnly && hasFormatChanges) {\n // Mark as success for the CLI tool registry since detecting format changes is the intended behavior\n result.success = true;\n return result.stdout || result.stderr || 'File would change by autoformatting.';\n }\n \n return defaultCLIResultProcessor(result, params);\n}\n\nexport const codeqlQueryFormatTool: CLIToolDefinition = {\n name: 'codeql_query_format',\n description: 'Automatically format CodeQL source code files',\n command: 'codeql',\n subcommand: 'query format',\n inputSchema: {\n files: z.array(z.string()).describe('One or more .ql or .qll source files to format'),\n output: z.string().optional().describe('Write formatted code to this file instead of stdout'),\n 'in-place': z.boolean().optional().describe('Overwrite each input file with formatted version'),\n 'check-only': z.boolean().optional().describe('Check formatting without writing output'),\n backup: z.string().optional().describe('Backup extension when overwriting existing files'),\n 'no-syntax-errors': z.boolean().optional().describe('Ignore syntax errors and pretend file is formatted'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query format -i -- ExampleQuery.ql',\n 'codeql query format --in-place -- queries/*.ql',\n 'codeql query format --check-only -- queries/*.ql'\n ],\n resultProcessor: formatResultProcessor\n};", "/**\n * CodeQL query run tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryRunTool: CLIToolDefinition = {\n name: 'codeql_query_run',\n description: 'Execute a CodeQL query against a database. Use either \"query\" parameter for direct file path OR \"queryName\" + \"queryLanguage\" for pre-defined tool queries.',\n command: 'codeql',\n subcommand: 'query run',\n inputSchema: {\n query: z.string().optional().describe('Path to the CodeQL query file (.ql) - cannot be used with queryName'),\n queryName: z.string().optional().describe('Name of pre-defined query to run (e.g., \"PrintAST\", \"CallGraphFrom\", \"CallGraphTo\") - requires queryLanguage'),\n queryLanguage: z.string().optional().describe('Programming language for tools queries (e.g., \"javascript\", \"java\", \"python\") - required when using queryName'),\n queryPack: z.string().optional().describe('Query pack path (defaults to server/ql//tools/src/ for tool queries)'),\n sourceFiles: z.string().optional().describe('Comma-separated list of source file paths for PrintAST queries (e.g., \"src/main.js,src/utils.js\" or just \"main.js\")'),\n sourceFunction: z.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., \"main,processData\")'),\n targetFunction: z.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., \"helper,validateInput\")'),\n database: createCodeQLSchemas.database(),\n output: createCodeQLSchemas.output(),\n external: z.array(z.string()).optional()\n .describe('External predicate data: predicate=file.csv'),\n timeout: createCodeQLSchemas.timeout(),\n logDir: z.string().optional()\n .describe('Custom directory for query execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n 'evaluator-log': z.string().optional().describe('Path to save evaluator log (deprecated: use logDir instead)'),\n 'evaluator-log-minify': z.boolean().optional()\n .describe('Minimize evaluator log for smaller size'),\n 'evaluator-log-level': z.number().min(1).max(5).optional()\n .describe('Evaluator log verbosity level (1-5, default 5)'),\n 'tuple-counting': z.boolean().optional()\n .describe('Display tuple counts for each evaluation step in evaluator logs'),\n format: z.enum(['sarif-latest', 'sarifv2.1.0', 'csv', 'graphtext', 'dgml', 'dot']).optional()\n .describe('Output format for query results via codeql bqrs interpret. Defaults to sarif-latest for @kind problem/path-problem queries, graphtext for @kind graph queries. Graph formats (graphtext, dgml, dot) only work with @kind graph queries.'),\n interpretedOutput: z.string().optional()\n .describe('Output file for interpreted results (e.g., results.sarif, results.txt). If not provided, defaults based on format: .sarif for SARIF, .txt for graphtext/csv, .dgml for dgml, .dot for dot'),\n evaluationFunction: z.string().optional()\n .describe('[DEPRECATED - use format parameter instead] Built-in function for query results evaluation (e.g., \"mermaid-graph\", \"json-decode\", \"csv-decode\") or path to custom evaluation script'),\n evaluationOutput: z.string().optional()\n .describe('[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query run --database=mydb --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=src/index.js --output=results.bqrs --format=graphtext --interpreted-output=results.txt',\n 'codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif',\n 'codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=\"main.js,utils.js\" --format=graphtext',\n 'codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql'\n ]\n};", "/**\n * CodeQL quick evaluate tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { join, resolve } from 'path';\nimport { findClassPosition } from './find-class-position';\nimport { findPredicatePosition } from './find-predicate-position';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\n\nexport interface QuickEvaluateParams {\n file: string;\n db: string;\n symbol: string;\n output_path?: string;\n}\n\n/**\n * Quick evaluate either a class or a predicate in a CodeQL query.\n * This allows debugging a select portion of QL code without running the whole query.\n */\nexport async function quickEvaluate({\n file,\n db: _db,\n symbol,\n output_path\n}: QuickEvaluateParams): Promise {\n try {\n // Try to find as a class first, then as a predicate\n try {\n await findClassPosition(file, symbol);\n } catch {\n try {\n await findPredicatePosition(file, symbol);\n } catch {\n throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`);\n }\n }\n \n const resolvedOutput = resolve(output_path || join(getProjectTmpDir('quickeval'), 'quickeval.bqrs'));\n \n // For now, return the resolved output path\n // In a full implementation, this would use the CodeQL CLI or query server\n // to perform the actual quick evaluation with the position parameters\n return resolvedOutput;\n } catch (error) {\n throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the quick evaluate tool with the MCP server\n */\nexport function registerQuickEvaluateTool(server: McpServer): void {\n server.tool(\n 'quick_evaluate',\n 'Quick evaluate either a class or a predicate in a CodeQL query for debugging',\n {\n file: z.string().describe('Path to the .ql file containing the symbol'),\n db: z.string().describe('Path to the CodeQL database'),\n symbol: z.string().describe('Name of the class or predicate to evaluate'),\n output_path: z.string().optional().describe('Output path for results (defaults to project-local .tmp/quickeval/)'),\n },\n async ({ file, db, symbol, output_path }) => {\n try {\n const result = await quickEvaluate({ file, db, symbol, output_path });\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error in quick evaluate:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL register database tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { access, constants } from 'fs/promises';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger';\n\nexport interface DatabaseRegistration {\n uri: string;\n content: {\n sourceArchiveZip: string;\n dbDir: string;\n };\n}\n\n/**\n * Register a CodeQL database given a local path to the database directory.\n * Validates that the database exists and has required structure.\n * Supports both full databases (with src.zip) and test databases (with src/ folder).\n */\nexport async function registerDatabase(dbPath: string): Promise {\n try {\n const resolvedPath = resolve(dbPath);\n \n // Check if database directory exists\n await access(resolvedPath, constants.F_OK);\n \n // Check for codeql-database.yml (required for all CodeQL databases)\n const dbYmlPath = resolve(resolvedPath, 'codeql-database.yml');\n await access(dbYmlPath, constants.F_OK);\n \n // Check if src.zip exists (for full databases) OR src/ directory exists (for test databases)\n const srcZipPath = resolve(resolvedPath, 'src.zip');\n const srcDirPath = resolve(resolvedPath, 'src');\n \n let hasSrcZip = false;\n let hasSrcDir = false;\n \n try {\n await access(srcZipPath, constants.F_OK);\n hasSrcZip = true;\n } catch {\n // src.zip not found, check for src/ directory\n }\n \n if (!hasSrcZip) {\n try {\n await access(srcDirPath, constants.F_OK);\n hasSrcDir = true;\n } catch {\n // src directory not found either\n }\n }\n \n if (!hasSrcZip && !hasSrcDir) {\n throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`);\n }\n \n // For now, we just validate and return success message\n // In a full implementation, this would register with a query server\n const sourceType = hasSrcZip ? 'src.zip' : 'src/';\n return `Database registered: ${dbPath} (source: ${sourceType})`;\n } catch (error) {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === 'ENOENT') {\n if (error.message.includes('codeql-database.yml')) {\n throw new Error(`Missing required codeql-database.yml in: ${dbPath}`);\n }\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n if (errorCode === 'EACCES') {\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n }\n throw new Error(`Failed to register database: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the register database tool with the MCP server\n */\nexport function registerRegisterDatabaseTool(server: McpServer): void {\n server.tool(\n 'register_database',\n 'Register a CodeQL database given a local path to the database directory',\n {\n db_path: z.string().describe('Path to the CodeQL database directory'),\n },\n async ({ db_path }) => {\n try {\n const result = await registerDatabase(db_path);\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error registering database:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL resolve database tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveDatabaseTool: CLIToolDefinition = {\n name: 'codeql_resolve_database',\n description: 'Resolve database path and validate database structure',\n command: 'codeql',\n subcommand: 'resolve database',\n inputSchema: {\n database: z.string().describe('Database path to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for database information'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve database -- /path/to/database',\n 'codeql resolve database --format=json -- my-database',\n 'codeql resolve database --format=betterjson -- database-dir'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve languages tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLanguagesTool: CLIToolDefinition = {\n name: 'codeql_resolve_languages',\n description: 'List installed CodeQL extractor packs',\n command: 'codeql',\n subcommand: 'resolve languages',\n inputSchema: {\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for language information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve languages --format=text',\n 'codeql resolve languages --format=json',\n 'codeql resolve languages --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve library-path tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLibraryPathTool: CLIToolDefinition = {\n name: 'codeql_resolve_library-path',\n description: 'Resolve library path for CodeQL queries and libraries',\n command: 'codeql',\n subcommand: 'resolve library-path',\n inputSchema: {\n language: z.string().optional().describe('Programming language to resolve library path for'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for library path information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve library-path --language=java',\n 'codeql resolve library-path --format=json --language=python',\n 'codeql resolve library-path --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve metadata tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveMetadataTool: CLIToolDefinition = {\n name: 'codeql_resolve_metadata',\n description: 'Resolve and return the key-value metadata pairs from a CodeQL query source file.',\n command: 'codeql',\n subcommand: 'resolve metadata',\n inputSchema: {\n query: z.string().describe('Query file to resolve metadata for'),\n format: z.enum(['json']).optional()\n .describe('Output format for metadata information (always JSON, optional for future compatibility)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve metadata -- relative-path/2/MyQuery.ql',\n 'codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve qlref tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveQlrefTool: CLIToolDefinition = {\n name: 'codeql_resolve_qlref',\n description: 'Resolve qlref files to their corresponding query files',\n command: 'codeql',\n subcommand: 'resolve qlref',\n inputSchema: {\n qlref: z.string().describe('Path to the .qlref file to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for qlref resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve qlref -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=json -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=betterjson -- test/MyQuery.qlref'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve queries tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Result processor that only returns stdout for JSON formats\n * This prevents warnings/info from stderr from corrupting JSON output\n */\nconst jsonOnlyResultProcessor = (\n result: CLIExecutionResult,\n params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n\n // For JSON formats (including bylanguage), only return stdout to avoid mixing warnings with JSON\n if (params.format === 'json' || params.format === 'betterjson' || params.format === 'bylanguage') {\n return result.stdout || '[]';\n }\n\n // For text format, include warnings\n let output = '';\n\n if (result.stdout) {\n output += result.stdout;\n }\n\n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n\n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n\n return output;\n};\n\nexport const codeqlResolveQueriesTool: CLIToolDefinition = {\n name: 'codeql_resolve_queries',\n description: 'List available CodeQL queries found on the local filesystem',\n command: 'codeql',\n subcommand: 'resolve queries',\n inputSchema: {\n directory: z.string().optional().describe('Directory to search for queries'),\n language: z.string().optional().describe('Filter queries by programming language'),\n format: z.enum(['text', 'json', 'betterjson', 'bylanguage']).optional()\n .describe('Output format for query list'),\n 'additional-packs': z.union([z.string(), z.array(z.string())]).optional()\n .describe('Additional pack directories to search for CodeQL packs'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve queries',\n 'codeql resolve queries --language=java --format=json',\n 'codeql resolve queries --format=betterjson -- /path/to/queries',\n 'codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries'\n ],\n resultProcessor: jsonOnlyResultProcessor\n};", "/**\n * CodeQL resolve tests tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveTestsTool: CLIToolDefinition = {\n name: 'codeql_resolve_tests',\n description: 'Resolve the local filesystem paths of unit tests and/or queries under some base directory',\n command: 'codeql',\n subcommand: 'resolve tests',\n inputSchema: {\n tests: z.array(z.string()).optional().describe('One or more tests (.ql, .qlref files, or test directories)'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format for test list'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve tests',\n 'codeql resolve tests --format=json -- test-directory',\n 'codeql resolve tests --format=json -- test1.ql test2.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test accept tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestAcceptTool: CLIToolDefinition = {\n name: 'codeql_test_accept',\n description: 'Accept new test results as the expected baseline',\n command: 'codeql',\n subcommand: 'test accept',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref',\n 'codeql test accept -- languages/java/test/MyQuery/',\n 'codeql test accept -- languages/java/src/MyQuery/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test extract tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestExtractTool: CLIToolDefinition = {\n name: 'codeql_test_extract',\n description: 'Extract test databases for CodeQL query tests',\n command: 'codeql',\n subcommand: 'test extract',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more test directories or files'),\n language: z.string().optional().describe('Programming language for extraction'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test extract -- languages/java/test/MyQuery/',\n 'codeql test extract --language=java --threads=4 -- test-directory',\n 'codeql test extract --threads=2 --ram=2048 -- multiple/test/directories'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test run tool\n */\n\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\nimport { z } from 'zod';\n\nexport const codeqlTestRunTool: CLIToolDefinition = {\n name: 'codeql_test_run',\n description: 'Run CodeQL query tests',\n command: 'codeql',\n subcommand: 'test run',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n 'show-extractor-output': z.boolean().optional()\n .describe('Show output from extractors during test execution'),\n 'keep-databases': z.boolean().optional()\n .describe('Keep test databases after running tests'),\n 'learn': z.boolean().optional()\n .describe('Accept current output as expected for failing tests'),\n logDir: z.string().optional()\n .describe('Custom directory for test execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test run /path/to/tests',\n 'codeql test run --learn /path/to/failing/tests',\n 'codeql test run --threads=4 --keep-databases /path/to/tests',\n 'codeql test run --log-dir=/custom/log/path /path/to/tests'\n ]\n};", "/**\n * CodeQL tools registration for MCP server\n * Includes both high-level helpers and CLI command wrappers\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { validateCodeQLSyntax } from '../lib/validation';\nimport { createCodeQLQuery } from '../lib/query-scaffolding';\nimport { registerCLITool } from '../lib/cli-tool-registry';\nimport {\n codeqlBqrsDecodeTool,\n codeqlBqrsInfoTool,\n codeqlBqrsInterpretTool,\n codeqlDatabaseAnalyzeTool,\n codeqlDatabaseCreateTool,\n codeqlGenerateLogSummaryTool,\n codeqlGenerateQueryHelpTool,\n codeqlPackInstallTool,\n codeqlPackLsTool,\n codeqlQueryCompileTool,\n codeqlQueryFormatTool,\n codeqlQueryRunTool,\n codeqlResolveDatabaseTool,\n codeqlResolveLanguagesTool,\n codeqlResolveLibraryPathTool,\n codeqlResolveMetadataTool,\n codeqlResolveQlrefTool,\n codeqlResolveQueriesTool,\n codeqlResolveTestsTool,\n codeqlTestAcceptTool,\n codeqlTestExtractTool,\n codeqlTestRunTool,\n registerFindClassPositionTool,\n registerFindCodeQLQueryFilesTool,\n registerFindPredicatePositionTool,\n registerLanguageServerEvalTool,\n registerProfileCodeQLQueryTool,\n registerQuickEvaluateTool,\n registerRegisterDatabaseTool\n} from './codeql';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all CodeQL tools with the MCP server\n */\nexport function registerCodeQLTools(server: McpServer): void {\n // Register high-level helper tools\n \n // Tool: Validate CodeQL Query (heuristic-based)\n server.tool(\n 'validate_codeql_query',\n 'Quick heuristic validation for CodeQL query structure - checks for common patterns like from/where/select clauses and metadata presence. Does NOT compile the query. For authoritative validation with actual compilation, use codeql_language_server_eval instead.',\n {\n query: z.string().describe('The CodeQL query to validate'),\n language: z.string().optional().describe('Target programming language'),\n },\n async ({ query, language }) => {\n try {\n const validation = validateCodeQLSyntax(query, language);\n return {\n content: [{ type: 'text', text: JSON.stringify(validation, null, 2) }],\n };\n } catch (error) {\n logger.error('Error validating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Create CodeQL Query\n server.tool(\n 'create_codeql_query',\n 'Create directory structure and files for a new CodeQL query with tests',\n {\n basePath: z.string().describe('Base path where src/ and test/ directories will be created'),\n queryName: z.string().describe('Name of the query (e.g., MySecurityQuery)'),\n language: z.string().describe('Target programming language (e.g., javascript, python, java)'),\n description: z.string().optional().describe('Description of what the query does'),\n queryId: z.string().optional().describe('Custom query ID (defaults to language/example/queryname)'),\n },\n async ({ basePath, queryName, language, description, queryId }) => {\n try {\n const result = createCodeQLQuery({\n basePath,\n queryName,\n language,\n description,\n queryId\n });\n \n const summary = {\n success: true,\n queryPath: result.queryPath,\n testPath: result.testPath,\n qlrefPath: result.qlrefPath,\n testCodePath: result.testCodePath,\n filesCreated: result.filesCreated,\n nextSteps: [\n 'Review and customize the generated query in: ' + result.queryPath,\n 'Add test cases to: ' + result.testCodePath,\n 'Run codeql_pack_install to install dependencies',\n 'Run codeql_test_extract to create test database',\n 'Run codeql_test_run to execute tests'\n ]\n };\n \n return {\n content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }],\n };\n } catch (error) {\n logger.error('Error creating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register CLI tools (alphabetically by tool name)\n registerCLITool(server, codeqlBqrsDecodeTool);\n registerCLITool(server, codeqlBqrsInfoTool);\n registerCLITool(server, codeqlBqrsInterpretTool);\n registerCLITool(server, codeqlDatabaseAnalyzeTool);\n registerCLITool(server, codeqlDatabaseCreateTool);\n registerCLITool(server, codeqlGenerateLogSummaryTool);\n registerCLITool(server, codeqlGenerateQueryHelpTool);\n registerCLITool(server, codeqlPackInstallTool);\n registerCLITool(server, codeqlPackLsTool);\n registerCLITool(server, codeqlQueryCompileTool);\n registerCLITool(server, codeqlQueryFormatTool);\n registerCLITool(server, codeqlQueryRunTool);\n registerCLITool(server, codeqlResolveDatabaseTool);\n registerCLITool(server, codeqlResolveLanguagesTool);\n registerCLITool(server, codeqlResolveLibraryPathTool);\n registerCLITool(server, codeqlResolveMetadataTool);\n registerCLITool(server, codeqlResolveQlrefTool);\n registerCLITool(server, codeqlResolveQueriesTool);\n registerCLITool(server, codeqlResolveTestsTool);\n registerCLITool(server, codeqlTestAcceptTool);\n registerCLITool(server, codeqlTestExtractTool);\n registerCLITool(server, codeqlTestRunTool);\n\n // Register new MCP tools (inspired by JordyZomer/codeql-mcp repository)\n registerFindClassPositionTool(server);\n registerFindCodeQLQueryFilesTool(server);\n registerFindPredicatePositionTool(server);\n registerLanguageServerEvalTool(server);\n registerProfileCodeQLQueryTool(server);\n registerQuickEvaluateTool(server);\n registerRegisterDatabaseTool(server);\n}\n", "/**\n * CodeQL query validation utilities\n */\n\nimport { resolve, normalize, isAbsolute, relative } from 'path';\n\nexport interface CodeQLValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n suggestions: string[];\n}\n\n/**\n * Validates CodeQL query syntax and structure\n */\nexport function validateCodeQLSyntax(query: string, _language?: string): CodeQLValidationResult {\n const validation: CodeQLValidationResult = {\n isValid: true,\n errors: [],\n warnings: [],\n suggestions: [],\n };\n\n if (!query.trim()) {\n validation.isValid = false;\n validation.errors.push('Query cannot be empty');\n return validation;\n }\n\n if (!query.includes('from') && !query.includes('select')) {\n validation.warnings.push('Query should typically include \"from\" and \"select\" clauses');\n }\n\n if (!query.includes('@name') && !query.includes('@description')) {\n validation.suggestions.push('Consider adding @name and @description metadata');\n }\n\n return validation;\n}\n\n/**\n * Validates a file path to prevent path traversal attacks\n * @param filePath - The file path to validate\n * @param workspaceRoot - Optional workspace root directory. If not provided, allows any absolute path but still blocks traversal attempts\n * @returns The validated absolute path\n * @throws Error if the path contains path traversal sequences\n */\nexport function validateFilePath(filePath: string, workspaceRoot?: string): string {\n // Normalize the path to resolve any . or .. segments\n const normalizedPath = normalize(filePath);\n \n // Check for path traversal attempts in the normalized path\n // This blocks paths like \"../../../etc/passwd\" even after normalization\n if (normalizedPath.includes('..')) {\n throw new Error(`Invalid file path: path traversal detected in \"${filePath}\"`);\n }\n \n // Resolve to absolute path\n const absolutePath = isAbsolute(normalizedPath) \n ? normalizedPath \n : resolve(workspaceRoot || process.cwd(), normalizedPath);\n \n // If workspace root is specified, ensure the resolved path is within it\n if (workspaceRoot) {\n const relativePath = relative(workspaceRoot, absolutePath);\n \n // If relative path starts with .. or is absolute, it's outside workspace\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Invalid file path: \"${filePath}\" is outside the workspace root`);\n }\n }\n \n return absolutePath;\n}", "/**\n * CodeQL query scaffolding utilities\n * Handles creation of query directory structure and files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface QueryScaffoldingOptions {\n basePath: string;\n queryName: string;\n language: string;\n description?: string;\n queryId?: string;\n}\n\nexport interface QueryScaffoldingResult {\n queryPath: string;\n testPath: string;\n qlrefPath: string;\n testCodePath: string;\n filesCreated: string[];\n}\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n const extensions: Record = {\n javascript: 'js',\n typescript: 'ts',\n python: 'py',\n java: 'java',\n csharp: 'cs',\n cpp: 'cpp',\n go: 'go',\n ruby: 'rb',\n actions: 'yml'\n };\n return extensions[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Generate query template content\n */\nfunction generateQueryTemplate(\n queryName: string,\n language: string,\n description?: string,\n queryId?: string\n): string {\n const desc = description || `${queryName} query`;\n const id = queryId || `${language}/example/${queryName.toLowerCase()}`;\n \n return `/**\n * @id ${id}\n * @name ${queryName}\n * @description ${desc}\n * @kind problem\n * @precision medium\n * @problem.severity warning\n */\n\nimport ${language}\n\n// TODO: Implement query logic\nfrom File f\nwhere f.getBaseName() = \"${queryName}.${getLanguageExtension(language)}\"\nselect f, \"TODO: Add query logic\"\n`;\n}\n\n/**\n * Create the directory structure and files for a new CodeQL query\n */\nexport function createCodeQLQuery(options: QueryScaffoldingOptions): QueryScaffoldingResult {\n const { basePath, queryName, language, description, queryId } = options;\n \n // Resolve absolute paths\n const absoluteBasePath = path.resolve(basePath);\n \n // Define paths with intermediate directory\n const srcDir = path.join(absoluteBasePath, 'src', queryName);\n const testDir = path.join(absoluteBasePath, 'test', queryName);\n \n const queryPath = path.join(srcDir, `${queryName}.ql`);\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const testCodePath = path.join(testDir, `${queryName}.${getLanguageExtension(language)}`);\n \n const filesCreated: string[] = [];\n \n try {\n // Create directories (recursive: true is a no-op if they already exist)\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(testDir, { recursive: true });\n \n // Create files atomically using 'wx' flag (exclusive create) to avoid\n // TOCTOU race between existsSync check and writeFileSync (CWE-367).\n // The 'wx' flag fails with EEXIST if the file already exists.\n try {\n const queryContent = generateQueryTemplate(queryName, language, description, queryId);\n fs.writeFileSync(queryPath, queryContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(queryPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const qlrefContent = `${queryName}/${queryName}.ql\\n`;\n fs.writeFileSync(qlrefPath, qlrefContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(qlrefPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const testCodeContent = `// Test code for ${queryName}\\n// TODO: Add test cases\\n`;\n fs.writeFileSync(testCodePath, testCodeContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(testCodePath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n return {\n queryPath,\n testPath: testDir,\n qlrefPath,\n testCodePath,\n filesCreated\n };\n } catch (error) {\n throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n", "/**\n * CodeQL learning resources utilities\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the getting started guide content\n */\nexport function getGettingStartedGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/getting-started.md'), 'utf-8');\n } catch {\n return 'Getting started guide not available';\n }\n}\n\n/**\n * Get the query basics guide content\n */\nexport function getQueryBasicsGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/query-basics.md'), 'utf-8');\n } catch {\n return 'Query basics guide not available';\n }\n}\n\n/**\n * Get the security templates content\n */\nexport function getSecurityTemplates(): string {\n try {\n return readFileSync(join(__dirname, '../resources/security-templates.md'), 'utf-8');\n } catch {\n return 'Security templates not available';\n }\n}\n\n/**\n * Get the performance patterns content\n */\nexport function getPerformancePatterns(): string {\n try {\n return readFileSync(join(__dirname, '../resources/performance-patterns.md'), 'utf-8');\n } catch {\n return 'Performance patterns not available';\n }\n}", "/**\n * CodeQL resources registration for MCP server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getGettingStartedGuide,\n getQueryBasicsGuide,\n getSecurityTemplates,\n getPerformancePatterns,\n} from '../lib/resources';\n\n/**\n * Register all CodeQL resources with the MCP server\n */\nexport function registerCodeQLResources(server: McpServer): void {\n // Getting Started Guide\n server.resource(\n 'CodeQL Getting Started',\n 'codeql://learning/getting-started',\n {\n description: 'Comprehensive introduction to CodeQL for beginners',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/getting-started',\n mimeType: 'text/markdown',\n text: getGettingStartedGuide(),\n },\n ],\n };\n }\n );\n\n // Query Basics Guide\n server.resource(\n 'CodeQL Query Basics',\n 'codeql://learning/query-basics',\n {\n description: 'Learn the fundamentals of writing CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/query-basics',\n mimeType: 'text/markdown',\n text: getQueryBasicsGuide(),\n },\n ],\n };\n }\n );\n\n // Security Templates\n server.resource(\n 'CodeQL Security Templates',\n 'codeql://templates/security',\n {\n description: 'Ready-to-use security query templates',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://templates/security',\n mimeType: 'text/markdown',\n text: getSecurityTemplates(),\n },\n ],\n };\n }\n );\n\n // Performance Patterns\n server.resource(\n 'CodeQL Performance Patterns',\n 'codeql://patterns/performance',\n {\n description: 'Best practices for writing efficient CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://patterns/performance',\n mimeType: 'text/markdown',\n text: getPerformancePatterns(),\n },\n ],\n };\n }\n );\n}\n", "/**\n * Language-specific resources implementation\n * Dynamically loads and serves language-specific AST references and security patterns\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { LANGUAGE_RESOURCES } from '../types/language-types';\nimport { workspaceRootDir } from '../utils/package-paths';\nimport { logger } from '../utils/logger';\n\n/**\n * Get the base path for ql resources.\n * Uses the workspace root (monorepo root or package root) so that\n * resource files are found regardless of the server's process.cwd().\n */\nfunction getQLBasePath(): string {\n return workspaceRootDir;\n}\n\n/**\n * Load content from a resource file\n */\nfunction loadResourceContent(relativePath: string): string | null {\n try {\n const fullPath = join(getQLBasePath(), relativePath);\n \n if (!existsSync(fullPath)) {\n logger.warn(`Resource file not found: ${fullPath}`);\n return null;\n }\n \n return readFileSync(fullPath, 'utf-8');\n } catch (error) {\n logger.error(`Error loading resource file ${relativePath}:`, error);\n return null;\n }\n}\n\n/**\n * Register language-specific AST resources\n */\nexport function registerLanguageASTResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.astFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/ast`;\n \n server.resource(\n `${langResource.language.toUpperCase()} AST Reference`,\n resourceUri,\n {\n description: `CodeQL AST class reference for ${langResource.language} programs`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.astFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} AST Reference\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register language-specific security pattern resources\n */\nexport function registerLanguageSecurityResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.securityFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/security`;\n \n server.resource(\n `${langResource.language.toUpperCase()} Security Patterns`,\n resourceUri,\n {\n description: `CodeQL security query patterns and framework modeling for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.securityFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} Security Patterns\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register additional language-specific resources (like Go's dataflow patterns)\n */\nexport function registerLanguageAdditionalResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.additionalFiles) continue;\n \n for (const [resourceType, filePath] of Object.entries(langResource.additionalFiles)) {\n const resourceUri = `codeql://languages/${langResource.language}/${resourceType}`;\n \n server.resource(\n `${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}`,\n resourceUri,\n {\n description: `CodeQL ${resourceType.replace('-', ' ')} guide for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(filePath);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n }\n}\n\n/**\n * Register all language-specific resources\n */\nexport function registerLanguageResources(server: McpServer): void {\n logger.info('Registering language-specific resources...');\n \n // Register AST references for all languages\n registerLanguageASTResources(server);\n \n // Register security patterns for languages that have them\n registerLanguageSecurityResources(server);\n \n // Register additional resources (like Go's dataflow patterns)\n registerLanguageAdditionalResources(server);\n \n logger.info(`Registered resources for ${LANGUAGE_RESOURCES.length} languages`);\n}", "/**\n * Type definitions and constants for language-specific resources\n */\n\n// Language mappings to resource files\nexport interface LanguageResource {\n language: string;\n astFile?: string;\n securityFile?: string;\n additionalFiles?: Record;\n}\n\nexport const LANGUAGE_RESOURCES: LanguageResource[] = [\n {\n language: 'actions',\n astFile: 'ql/languages/actions/tools/dev/actions_ast.prompt.md'\n },\n {\n language: 'cpp',\n astFile: 'ql/languages/cpp/tools/dev/cpp_ast.prompt.md',\n securityFile: 'ql/languages/cpp/tools/dev/cpp_security_query_guide.prompt.md'\n },\n {\n language: 'csharp',\n astFile: 'ql/languages/csharp/tools/dev/csharp_ast.prompt.md',\n securityFile: 'ql/languages/csharp/tools/dev/csharp_security_query_guide.prompt.md'\n },\n {\n language: 'go',\n astFile: 'ql/languages/go/tools/dev/go_ast.prompt.md',\n securityFile: 'ql/languages/go/tools/dev/go_security_query_guide.prompt.md',\n additionalFiles: {\n 'dataflow': 'ql/languages/go/tools/dev/go_dataflow.prompt.md',\n 'library-modeling': 'ql/languages/go/tools/dev/go_library_modeling.prompt.md',\n 'basic-queries': 'ql/languages/go/tools/dev/go_basic_queries.prompt.md'\n }\n },\n {\n language: 'java',\n astFile: 'ql/languages/java/tools/dev/java_ast.prompt.md'\n },\n {\n language: 'javascript',\n astFile: 'ql/languages/javascript/tools/dev/javascript_ast.prompt.md',\n securityFile: 'ql/languages/javascript/tools/dev/javascript_security_query_guide.prompt.md'\n },\n {\n language: 'python',\n astFile: 'ql/languages/python/tools/dev/python_ast.prompt.md',\n securityFile: 'ql/languages/python/tools/dev/python_security_query_guide.prompt.md'\n },\n {\n language: 'ql',\n astFile: 'ql/languages/ql/tools/dev/ql_ast.prompt.md'\n },\n {\n language: 'ruby',\n astFile: 'ql/languages/ruby/tools/dev/ruby_ast.prompt.md'\n }\n];", "/**\n * MCP Server workflow prompts for CodeQL development\n *\n * All prompt content is loaded from .prompt.md files in this directory.\n * This file only handles prompt registration and parameter processing.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { basename } from 'path';\nimport { loadPromptTemplate, processPromptTemplate } from './prompt-loader';\nimport { logger } from '../utils/logger';\n\n/** Supported CodeQL languages for tools queries */\nexport const SUPPORTED_LANGUAGES = [\n 'actions',\n 'cpp',\n 'csharp',\n 'go',\n 'java',\n 'javascript',\n 'python',\n 'ruby',\n 'swift'\n] as const;\n\n/**\n * Schema for workshop_creation_workflow prompt parameters.\n * Uses z.coerce.number() for numStages to handle string inputs from VSCode slash commands.\n */\nexport const workshopCreationWorkflowSchema = z.object({\n queryPath: z\n .string()\n .describe('Path to the production-grade CodeQL query (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n workshopName: z\n .string()\n .optional()\n .describe('Name for the workshop directory'),\n numStages: z\n .coerce.number()\n .optional()\n .describe('Number of incremental stages (default: 4-8)')\n});\n\n/**\n * Register MCP workflow prompts\n *\n * Each prompt loads its content from a corresponding .prompt.md file\n * and processes any parameter substitutions.\n */\nexport function registerWorkflowPrompts(server: McpServer): void {\n // Test-Driven Development Prompt\n server.prompt(\n 'test_driven_development',\n 'Test-driven development workflow for CodeQL queries using MCP tools',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n queryName: queryName || '[QueryName]'\n });\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `## Context\\n\\n- **Language**: ${language}\\n${queryName ? `- **Query Name**: ${queryName}\\n` : ''}\\n${content}`\n }\n }\n ]\n };\n }\n );\n\n // Tools Query Workflow Prompt\n server.prompt(\n 'tools_query_workflow',\n 'Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n database: z.string().describe('Path to the CodeQL database'),\n sourceFiles: z\n .string()\n .optional()\n .describe(\n 'Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'\n ),\n sourceFunction: z\n .string()\n .optional()\n .describe(\n 'Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'\n ),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")')\n },\n async ({\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n }) => {\n const template = loadPromptTemplate('tools-query-workflow.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n database\n });\n\n const contextSection = buildToolsQueryContext(\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + content\n }\n }\n ]\n };\n }\n );\n\n // Workshop Creation Workflow Prompt\n server.prompt(\n 'workshop_creation_workflow',\n 'Guide for creating CodeQL query development workshops from production-grade queries',\n workshopCreationWorkflowSchema.shape,\n async ({ queryPath, language, workshopName, numStages }) => {\n const template = loadPromptTemplate('workshop-creation-workflow.prompt.md');\n\n // Derive workshop name from query path if not provided\n const derivedName =\n workshopName ||\n basename(queryPath)\n .replace(/\\.(ql|qlref)$/, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') ||\n 'codeql-workshop';\n\n const contextSection = buildWorkshopContext(\n queryPath,\n language,\n derivedName,\n numStages\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Basic Prompt - Test-Driven Development Checklist\n server.prompt(\n 'ql_tdd_basic',\n 'Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (language || queryName) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Advanced Prompt - Advanced Techniques with AST/CFG/CallGraph\n server.prompt(\n 'ql_tdd_advanced',\n 'Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop'),\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis')\n },\n async ({ language, queryName, database }) => {\n const template = loadPromptTemplate('ql-tdd-advanced.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (database) {\n contextSection += `- **Database**: ${database}\\n`;\n }\n if (language || queryName || database) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank False Positives Prompt\n server.prompt(\n 'sarif_rank_false_positives',\n 'Analyze SARIF results to identify likely false positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-false-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank True Positives Prompt\n server.prompt(\n 'sarif_rank_true_positives',\n 'Analyze SARIF results to identify likely true positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-true-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Explain CodeQL Query Prompt (for workshop learning content)\n server.prompt(\n 'explain_codeql_query',\n 'Generate detailed explanation of a CodeQL query for workshop learning content - uses MCP tools to gather context and produces both verbal explanations and mermaid evaluation diagrams',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling')\n },\n async ({ queryPath, language, databasePath }) => {\n const template = loadPromptTemplate('explain-codeql-query.prompt.md');\n\n let contextSection = '## Query to Explain\\n\\n';\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n contextSection += `- **Language**: ${language}\\n`;\n if (databasePath) {\n contextSection += `- **Database Path**: ${databasePath}\\n`;\n }\n contextSection += '\\n';\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Document CodeQL Query Prompt\n server.prompt(\n 'document_codeql_query',\n 'Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query')\n },\n async ({ queryPath, language }) => {\n const template = loadPromptTemplate('document-codeql-query.prompt.md');\n\n const contextSection = `## Query to Document\n\n- **Query Path**: ${queryPath}\n- **Language**: ${language}\n\n`;\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n logger.info('Registered 9 workflow prompts');\n}\n\n/**\n * Build context section for tools query workflow\n */\nexport function buildToolsQueryContext(\n language: string,\n database: string,\n sourceFiles?: string,\n sourceFunction?: string,\n targetFunction?: string\n): string {\n const lines = [\n '## Your Context',\n '',\n `- **Language**: ${language}`,\n `- **Database**: ${database}`\n ];\n\n if (sourceFiles) {\n lines.push(`- **Source Files**: ${sourceFiles}`);\n }\n if (sourceFunction) {\n lines.push(`- **Source Function**: ${sourceFunction}`);\n }\n if (targetFunction) {\n lines.push(`- **Target Function**: ${targetFunction}`);\n }\n\n lines.push('', '## Recommended Next Steps', '');\n\n if (sourceFiles) {\n lines.push(\n `1. Run \\`codeql_query_run\\` with queryName=\"PrintAST\", sourceFiles=\"${sourceFiles}\"`\n );\n } else {\n lines.push('1. Identify source files to analyze with PrintAST');\n }\n\n if (sourceFunction) {\n lines.push(\n `2. Run \\`codeql_query_run\\` with queryName=\"PrintCFG\" or \"CallGraphFrom\", sourceFunction=\"${sourceFunction}\"`\n );\n } else {\n lines.push(\n '2. Identify key functions for CFG or call graph analysis'\n );\n }\n\n if (targetFunction) {\n lines.push(\n `3. Run \\`codeql_query_run\\` with queryName=\"CallGraphTo\", targetFunction=\"${targetFunction}\"`\n );\n } else {\n lines.push('3. Identify target functions to find callers');\n }\n\n lines.push('', '');\n return lines.join('\\n');\n}\n\n/**\n * Build context section for workshop creation workflow\n */\nexport function buildWorkshopContext(\n queryPath: string,\n language: string,\n workshopName: string,\n numStages?: number\n): string {\n return `## Your Workshop Context\n\n- **Target Query**: ${queryPath}\n- **Language**: ${language}\n- **Workshop Name**: ${workshopName}\n- **Suggested Stages**: ${numStages || '4-8 (auto-detect based on query complexity)'}\n\n## Immediate Actions\n\n1. **Locate query files**: Use \\`find_codeql_query_files\\` with queryPath=\"${queryPath}\"\n2. **Understand query for learning content**: Use the \\`explain_codeql_query\\` prompt with queryPath=\"${queryPath}\" and language=\"${language}\"\n3. **Document each workshop stage**: Use the \\`document_codeql_query\\` prompt to create/update documentation for each solution query\n4. **Verify tests pass**: Use \\`codeql_test_run\\` on existing tests\n5. **Run tools queries**: Generate AST/CFG understanding for workshop materials\n\n`;\n}\n", "/**\n * Utility functions for loading prompt template files\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Load a prompt template from a .prompt.md file\n */\nexport function loadPromptTemplate(promptFileName: string): string {\n try {\n const promptPath = join(__dirname, promptFileName);\n return readFileSync(promptPath, 'utf-8');\n } catch (error) {\n return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n}\n\n/**\n * Process prompt template by replacing placeholders with actual values\n */\nexport function processPromptTemplate(template: string, variables: Record): string {\n let processed = template;\n \n // Replace variables in the format {{variable}} or {variable}\n for (const [key, value] of Object.entries(variables)) {\n const patterns = [\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'),\n new RegExp(`\\\\{${key}\\\\}`, 'g')\n ];\n \n for (const pattern of patterns) {\n processed = processed.replace(pattern, value);\n }\n }\n \n return processed;\n}", "/**\n * Monitoring Tools - MCP tool implementations for session management and reporting\n * Provides the MCP Tool APIs specified in the monitoring specification\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport { sessionDataManager } from '../lib/session-data-manager';\nimport {\n QueryDevelopmentSession,\n SessionFilter,\n QualityScoreRecord,\n ComparisonReport,\n AggregateReport,\n ExportResult,\n FunctionalTestResult,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all monitoring and reporting tools with the MCP server\n * Note: These tools are opt-in and disabled by default for end-users.\n * Set enableMonitoringTools: true in monitoring config to enable them.\n */\nexport function registerMonitoringTools(server: McpServer): void {\n const config = sessionDataManager.getConfig();\n \n // Check if monitoring tools are enabled (opt-in, disabled by default)\n if (!config.enableMonitoringTools) {\n logger.info('Monitoring tools are disabled (opt-in). Set enableMonitoringTools: true to enable session_* tools.');\n return;\n }\n\n // Session Management Tools - session_start removed per feedback (auto-creation instead)\n registerSessionEndTool(server);\n registerSessionGetTool(server);\n registerSessionListTool(server);\n registerSessionUpdateStateTool(server);\n\n // Session Analytics Tools\n registerSessionGetCallHistoryTool(server);\n registerSessionGetTestHistoryTool(server);\n registerSessionGetScoreHistoryTool(server);\n registerSessionCalculateCurrentScoreTool(server);\n\n // Batch Operations Tools\n registerSessionsCompareTool(server);\n registerSessionsAggregateTool(server);\n registerSessionsExportTool(server);\n\n // Note: Functional Testing Support Tools are internal only, not exposed as MCP tools\n\n logger.info('Registered monitoring and reporting tools');\n}\n\n/**\n * Session Management Tools\n */\n\n// session_start tool removed - sessions are now auto-created when needed\n// Sessions are automatically created when MCP tools are called with queryPath\n// If explicit session creation is needed, provide sessionId=null and it will auto-create\n\nfunction registerSessionEndTool(server: McpServer): void {\n server.tool(\n 'session_end',\n 'End a query development session with final status',\n {\n sessionId: z.string().describe('ID of the session to end'),\n status: z.enum(['completed', 'failed', 'abandoned']).describe('Final status of the session'),\n },\n async ({ sessionId, status }) => {\n try {\n const session = await sessionDataManager.endSession(sessionId, status);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error ending session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error ending session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTool(server: McpServer): void {\n server.tool(\n 'session_get',\n 'Get complete details of a specific query development session',\n {\n sessionId: z.string().describe('ID of the session to retrieve'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionListTool(server: McpServer): void {\n server.tool(\n 'session_list',\n 'List query development sessions with optional filtering',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const sessionList = {\n totalSessions: sessions.length,\n sessions: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n language: s.language,\n status: s.status,\n startTime: s.startTime,\n endTime: s.endTime,\n mcpCallsCount: s.mcpCalls.length,\n testExecutionsCount: s.testExecutions.length,\n currentScore: s.qualityScores.length > 0 \n ? s.qualityScores[s.qualityScores.length - 1].overallScore \n : null,\n })),\n };\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(sessionList, null, 2),\n },\n ],\n recommendations: generateListRecommendations(sessions),\n };\n } catch (error) {\n logger.error('Error listing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error listing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionUpdateStateTool(server: McpServer): void {\n server.tool(\n 'session_update_state',\n 'Update the current state of a query development session',\n {\n sessionId: z.string().describe('ID of the session to update'),\n filesPresent: z.array(z.string()).optional().describe('List of files present in the query development'),\n compilationStatus: z.enum(['unknown', 'success', 'failed']).optional().describe('Current compilation status'),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']).optional().describe('Current test status'),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']).optional().describe('Documentation status'),\n },\n async ({ sessionId, filesPresent, compilationStatus, testStatus, documentationStatus }) => {\n try {\n const stateUpdate: Record = {};\n if (filesPresent !== undefined) stateUpdate.filesPresent = filesPresent;\n if (compilationStatus !== undefined) stateUpdate.compilationStatus = compilationStatus;\n if (testStatus !== undefined) stateUpdate.testStatus = testStatus;\n if (documentationStatus !== undefined) stateUpdate.documentationStatus = documentationStatus;\n\n const session = await sessionDataManager.updateSessionState(sessionId, stateUpdate);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n recommendations: generateRecommendations(session, 'session_update_state'),\n };\n } catch (error) {\n logger.error('Error updating session state:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error updating session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Session Analytics Tools\n */\n\nfunction registerSessionGetCallHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_call_history',\n 'Get MCP call history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of calls to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let calls = [...session.mcpCalls].reverse(); // Most recent first\n if (limit && limit > 0) {\n calls = calls.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalCalls: session.mcpCalls.length,\n callHistory: calls,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting call history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting call history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTestHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_test_history',\n 'Get test execution history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of test executions to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let tests = [...session.testExecutions].reverse(); // Most recent first\n if (limit && limit > 0) {\n tests = tests.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalTests: session.testExecutions.length,\n testHistory: tests,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting test history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting test history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetScoreHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_score_history',\n 'Get quality score history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of scores to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let scores = [...session.qualityScores].reverse(); // Most recent first\n if (limit && limit > 0) {\n scores = scores.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalScores: session.qualityScores.length,\n scoreHistory: scores,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting score history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting score history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionCalculateCurrentScoreTool(server: McpServer): void {\n server.tool(\n 'session_calculate_current_score',\n 'Calculate current quality score for a session based on its state',\n {\n sessionId: z.string().describe('ID of the session'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n // Calculate quality score based on current state\n const scoreRecord = calculateQualityScore(session);\n \n // Add the score to the session\n await sessionDataManager.addQualityScore(sessionId, scoreRecord);\n \n // Get updated session with new score\n const updatedSession = await sessionDataManager.getSession(sessionId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(scoreRecord, null, 2),\n },\n ],\n recommendations: generateRecommendations(updatedSession, 'session_calculate_current_score'),\n };\n } catch (error) {\n logger.error('Error calculating current score:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error calculating current score: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Batch Operations Tools\n */\n\nfunction registerSessionsCompareTool(server: McpServer): void {\n server.tool(\n 'sessions_compare',\n 'Compare multiple query development sessions across specified dimensions',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to compare'),\n dimensions: z.array(z.string()).optional().describe('Specific dimensions to compare (default: all)'),\n },\n async ({ sessionIds, dimensions }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for comparison',\n },\n ],\n isError: true,\n };\n }\n\n const comparison = await compareSessions(validSessions, dimensions);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(comparison, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error comparing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error comparing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsAggregateTool(server: McpServer): void {\n server.tool(\n 'sessions_aggregate',\n 'Generate aggregate insights from multiple sessions based on filters',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const aggregate = await aggregateSessions(sessions, filters);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(aggregate, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error aggregating sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error aggregating sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsExportTool(server: McpServer): void {\n server.tool(\n 'sessions_export',\n 'Export session data in specified format for external analysis',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to export'),\n format: z.enum(['json', 'html', 'markdown']).optional().default('json').describe('Export format'),\n },\n async ({ sessionIds, format = 'json' }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for export',\n },\n ],\n isError: true,\n };\n }\n\n const exportResult = await exportSessions(validSessions, format);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(exportResult, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error exporting sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error exporting sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Helper Functions\n */\n\n/**\n * Calculate quality score for a session based on current state and history\n */\nfunction calculateQualityScore(session: QueryDevelopmentSession): QualityScoreRecord {\n const timestamp = new Date().toISOString();\n \n // Calculate syntactic correctness (25%)\n const syntacticCorrectness = session.currentState.compilationStatus === 'success' ? 100 :\n session.currentState.compilationStatus === 'failed' ? 0 : 50;\n\n // Calculate test coverage and results (30%)\n const testCoverageResults = session.currentState.testStatus === 'passing' ? 100 :\n session.currentState.testStatus === 'failing' ? 25 :\n session.currentState.testStatus === 'no_tests' ? 0 : 50;\n\n // Calculate documentation quality (20%)\n const documentationQuality = session.currentState.documentationStatus === 'present' ? 100 :\n session.currentState.documentationStatus === 'incomplete' ? 60 :\n session.currentState.documentationStatus === 'missing' ? 0 : 50;\n\n // Calculate functional correctness (25%) - based on successful test runs\n const successfulTests = session.testExecutions.filter(t => t.success && t.type === 'test_run').length;\n const totalTests = session.testExecutions.filter(t => t.type === 'test_run').length;\n const functionalCorrectness = totalTests > 0 ? (successfulTests / totalTests) * 100 : 50;\n\n // Calculate overall score\n const overallScore = Math.round(\n (syntacticCorrectness * 0.25) +\n (testCoverageResults * 0.30) +\n (documentationQuality * 0.20) +\n (functionalCorrectness * 0.25)\n );\n\n // Determine grade\n const grade = overallScore >= 90 ? 'A' :\n overallScore >= 80 ? 'B' :\n overallScore >= 70 ? 'C' :\n overallScore >= 60 ? 'D' : 'F';\n\n // Generate recommendations\n const recommendations: string[] = [];\n if (syntacticCorrectness < 100) {\n recommendations.push('Fix compilation errors to improve syntactic correctness');\n }\n if (testCoverageResults < 70) {\n recommendations.push('Add comprehensive tests and ensure they pass');\n }\n if (documentationQuality < 80) {\n recommendations.push('Add or improve query documentation with examples');\n }\n if (functionalCorrectness < 80) {\n recommendations.push('Improve test pass rate and verify query logic');\n }\n\n return {\n scoreId: randomUUID(),\n timestamp,\n overallScore,\n dimensions: {\n syntacticCorrectness,\n testCoverageResults,\n documentationQuality,\n functionalCorrectness,\n },\n grade,\n recommendations,\n };\n}\n\n/**\n * Compare multiple sessions\n */\nasync function compareSessions(\n sessions: QueryDevelopmentSession[],\n dimensions?: string[]\n): Promise {\n const timestamp = new Date().toISOString();\n const sessionIds = sessions.map(s => s.sessionId);\n \n const results: Record = {\n sessionCount: sessions.length,\n sessionOverview: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n status: s.status,\n mcpCallsCount: s.mcpCalls.length,\n duration: s.endTime ? \n new Date(s.endTime).getTime() - new Date(s.startTime).getTime() : \n new Date().getTime() - new Date(s.startTime).getTime(),\n currentScore: s.qualityScores.length > 0 ? \n s.qualityScores[s.qualityScores.length - 1].overallScore : null,\n })),\n };\n\n if (!dimensions || dimensions.includes('quality')) {\n const qualityScores = sessions.map(s => \n s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1] : null\n );\n results.qualityComparison = {\n averageScore: qualityScores\n .filter(q => q !== null)\n .reduce((sum, q) => sum + q!.overallScore, 0) / qualityScores.filter(q => q !== null).length,\n scoreRange: {\n min: Math.min(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n max: Math.max(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n },\n };\n }\n\n if (!dimensions || dimensions.includes('activity')) {\n results.activityComparison = {\n totalMCPCalls: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0),\n averageCallsPerSession: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length,\n mostActiveTool: getMostUsedTool(sessions),\n };\n }\n\n return {\n sessionIds,\n dimensions: dimensions || ['all'],\n timestamp,\n results,\n };\n}\n\n/**\n * Aggregate insights from multiple sessions\n */\nasync function aggregateSessions(\n sessions: QueryDevelopmentSession[],\n filters: SessionFilter\n): Promise {\n const timestamp = new Date().toISOString();\n \n const completedSessions = sessions.filter(s => s.status === 'completed');\n const successRate = sessions.length > 0 ? completedSessions.length / sessions.length : 0;\n \n const qualityScores = sessions\n .map(s => s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1].overallScore : null)\n .filter(score => score !== null) as number[];\n \n const averageQualityScore = qualityScores.length > 0 ? \n qualityScores.reduce((sum, score) => sum + score, 0) / qualityScores.length : 0;\n\n const commonPatterns = identifyCommonPatterns(sessions);\n const recommendations = generateAggregateRecommendations(sessions);\n\n return {\n filters,\n timestamp,\n totalSessions: sessions.length,\n successRate,\n averageQualityScore,\n commonPatterns,\n recommendations,\n };\n}\n\n/**\n * Export sessions in specified format\n */\nasync function exportSessions(\n sessions: QueryDevelopmentSession[],\n format: 'json' | 'html' | 'markdown'\n): Promise {\n const timestamp = new Date().toISOString();\n const filename = `session-export-${timestamp.replace(/[:.]/g, '-')}.${format}`;\n \n let content: string;\n \n switch (format) {\n case 'json':\n content = JSON.stringify(sessions, null, 2);\n break;\n case 'html':\n content = generateHTMLReport(sessions);\n break;\n case 'markdown':\n content = generateMarkdownReport(sessions);\n break;\n }\n\n return {\n format,\n filename,\n content,\n timestamp,\n };\n}\n\n/**\n * Utility functions\n */\n\nfunction getMostUsedTool(sessions: QueryDevelopmentSession[]): string {\n const toolCounts: Record = {};\n \n sessions.forEach(session => {\n session.mcpCalls.forEach(call => {\n toolCounts[call.toolName] = (toolCounts[call.toolName] || 0) + 1;\n });\n });\n\n return Object.entries(toolCounts)\n .sort(([, a], [, b]) => b - a)[0]?.[0] || 'none';\n}\n\nfunction identifyCommonPatterns(sessions: QueryDevelopmentSession[]): string[] {\n const patterns: string[] = [];\n \n const commonTools = getMostUsedTool(sessions);\n if (commonTools && commonTools !== 'none') {\n patterns.push(`Most commonly used tool: ${commonTools}`);\n }\n\n const completionRate = sessions.filter(s => s.status === 'completed').length / sessions.length;\n if (completionRate > 0.8) {\n patterns.push('High completion rate indicates effective workflow');\n } else if (completionRate < 0.5) {\n patterns.push('Low completion rate suggests workflow issues');\n }\n\n return patterns;\n}\n\nfunction generateAggregateRecommendations(sessions: QueryDevelopmentSession[]): string[] {\n const recommendations: string[] = [];\n \n const failedSessions = sessions.filter(s => s.status === 'failed');\n if (failedSessions.length > sessions.length * 0.3) {\n recommendations.push('High failure rate - consider improving error handling and guidance');\n }\n\n const averageCallsPerSession = sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length;\n if (averageCallsPerSession > 20) {\n recommendations.push('High number of MCP calls per session - consider workflow optimization');\n }\n\n return recommendations;\n}\n\nfunction generateHTMLReport(sessions: QueryDevelopmentSession[]): string {\n const html = `\n\n\n\n Session Export Report\n \n\n\n

Query Development Sessions Report

\n

Generated: ${new Date().toISOString()}

\n

Total Sessions: ${sessions.length}

\n \n ${sessions.map(session => `\n
\n

Session: ${session.sessionId}

\n

Query Path: ${session.queryPath}

\n

Status: ${session.status}

\n

Language: ${session.language}

\n

Start Time: ${session.startTime}

\n

MCP Calls: ${session.mcpCalls.length}

\n

Test Executions: ${session.testExecutions.length}

\n

Quality Scores: ${session.qualityScores.length}

\n
\n `).join('')}\n\n`;\n \n return html;\n}\n\nfunction generateMarkdownReport(sessions: QueryDevelopmentSession[]): string {\n const md = `# Query Development Sessions Report\n\nGenerated: ${new Date().toISOString()}\nTotal Sessions: ${sessions.length}\n\n## Session Summary\n\n| Session ID | Query Path | Status | Language | MCP Calls | Test Executions |\n|------------|-----------|--------|----------|-----------|-----------------|\n${sessions.map(session => \n `| ${session.sessionId} | ${session.queryPath} | ${session.status} | ${session.language} | ${session.mcpCalls.length} | ${session.testExecutions.length} |`\n).join('\\n')}\n\n## Detailed Sessions\n\n${sessions.map(session => `\n### Session: ${session.sessionId}\n\n- **Query Path:** ${session.queryPath}\n- **Status:** ${session.status}\n- **Language:** ${session.language}\n- **Start Time:** ${session.startTime}\n- **End Time:** ${session.endTime || 'N/A'}\n- **MCP Calls:** ${session.mcpCalls.length}\n- **Test Executions:** ${session.testExecutions.length}\n- **Quality Scores:** ${session.qualityScores.length}\n\n${session.recommendations.length > 0 ? `\n**Current Recommendations:**\n${session.recommendations.map(rec => `- ${rec}`).join('\\n')}\n` : ''}\n`).join('\\n')}`;\n\n return md;\n}\n\nfunction _calculateAverageDuration(sessions: QueryDevelopmentSession[]): number {\n const completedSessions = sessions.filter(s => s.endTime);\n if (completedSessions.length === 0) return 0;\n\n const totalDuration = completedSessions.reduce((sum, session) => {\n return sum + (new Date(session.endTime!).getTime() - new Date(session.startTime).getTime());\n }, 0);\n\n return totalDuration / completedSessions.length;\n}\n\nfunction _identifyFailureReasons(results: FunctionalTestResult[]): string[] {\n const failedResults = results.filter(r => !r.passed);\n const reasons: Record = {};\n\n failedResults.forEach(result => {\n Object.entries(result.criteria).forEach(([criterion, passed]) => {\n if (!passed) {\n reasons[criterion] = (reasons[criterion] || 0) + 1;\n }\n });\n });\n\n return Object.entries(reasons)\n .sort(([, a], [, b]) => b - a)\n .map(([reason, count]) => `${reason}: ${count} sessions`);\n}\n\n/**\n * Generate recommendations for MCP tool responses\n * Returns a map of MCP primitive paths to recommendation reasons\n */\nfunction generateRecommendations(\n session: QueryDevelopmentSession | null,\n currentTool: string\n): Record {\n if (!session) {\n return {};\n }\n\n const recommendations: Record = {};\n\n // Session state-based recommendations\n if (session.currentState.compilationStatus === 'failed') {\n recommendations['codeql_query_format'] = 'Format query to fix potential syntax issues';\n recommendations['codeql_query_compile'] = 'Recompile after fixing syntax errors';\n } else if (session.currentState.compilationStatus === 'success') {\n if (session.currentState.testStatus === 'unknown' || session.currentState.testStatus === 'no_tests') {\n recommendations['codeql_test_run'] = 'Run tests to validate query functionality';\n } else if (session.currentState.testStatus === 'failing') {\n recommendations['session_get_test_history'] = 'Review test failures to identify issues';\n recommendations['codeql_query_compile'] = 'Verify query logic matches test expectations';\n } else if (session.currentState.testStatus === 'passing') {\n recommendations['session_calculate_current_score'] = 'Calculate quality score for completed query';\n }\n }\n\n // Tool-specific follow-up recommendations\n switch (currentTool) {\n case 'session_get':\n if (session.mcpCalls.length === 0) {\n recommendations['codeql_query_compile'] = 'Start development by compiling the query';\n }\n break;\n case 'session_end':\n if (session.status === 'completed') {\n recommendations['sessions_export'] = 'Export session data for analysis';\n }\n break;\n case 'session_calculate_current_score': {\n const latestScore = session.qualityScores[session.qualityScores.length - 1];\n if (latestScore && latestScore.overallScore < 80) {\n if (latestScore.dimensions.syntacticCorrectness < 100) {\n recommendations['codeql_query_format'] = 'Improve syntax and formatting';\n }\n if (latestScore.dimensions.testCoverageResults < 70) {\n recommendations['codeql_test_run'] = 'Improve test coverage and results';\n }\n }\n break;\n }\n case 'session_update_state':\n // Recommend next logical step based on updated state\n if (session.currentState.compilationStatus === 'success' && session.currentState.testStatus === 'unknown') {\n recommendations['codeql_test_run'] = 'Run tests now that compilation is successful';\n }\n break;\n }\n\n return recommendations;\n}\n\n/**\n * Generate recommendations for session list results\n */\nfunction generateListRecommendations(sessions: QueryDevelopmentSession[]): Record {\n const recommendations: Record = {};\n\n const activeSessions = sessions.filter(s => s.status === 'active');\n const completedSessions = sessions.filter(s => s.status === 'completed');\n\n if (activeSessions.length > 0) {\n recommendations['session_get'] = `Review details of ${activeSessions.length} active session(s)`;\n }\n\n if (completedSessions.length > 1) {\n recommendations['sessions_compare'] = 'Compare completed sessions to identify patterns';\n recommendations['sessions_aggregate'] = 'Generate aggregate insights from multiple sessions';\n }\n\n if (sessions.length > 5) {\n recommendations['sessions_export'] = 'Export session data for comprehensive analysis';\n }\n\n return recommendations;\n}", "function checkArgs(adapter, defaultData) {\n if (adapter === undefined)\n throw new Error('lowdb: missing adapter');\n if (defaultData === undefined)\n throw new Error('lowdb: missing default data');\n}\nexport class Low {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n async read() {\n const data = await this.adapter.read();\n if (data)\n this.data = data;\n }\n async write() {\n if (this.data)\n await this.adapter.write(this.data);\n }\n async update(fn) {\n fn(this.data);\n await this.write();\n }\n}\nexport class LowSync {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n read() {\n const data = this.adapter.read();\n if (data)\n this.data = data;\n }\n write() {\n if (this.data)\n this.adapter.write(this.data);\n }\n update(fn) {\n fn(this.data);\n this.write();\n }\n}\n", "import { readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Writer } from 'steno';\nexport class TextFile {\n #filename;\n #writer;\n constructor(filename) {\n this.#filename = filename;\n this.#writer = new Writer(filename);\n }\n async read() {\n let data;\n try {\n data = await readFile(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n return this.#writer.write(str);\n }\n}\nexport class TextFileSync {\n #tempFilename;\n #filename;\n constructor(filename) {\n this.#filename = filename;\n const f = filename.toString();\n this.#tempFilename = path.join(path.dirname(f), `.${path.basename(f)}.tmp`);\n }\n read() {\n let data;\n try {\n data = readFileSync(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n writeFileSync(this.#tempFilename, str);\n renameSync(this.#tempFilename, this.#filename);\n }\n}\n", "import { TextFile, TextFileSync } from './TextFile.js';\nexport class DataFile {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFile(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n async read() {\n const data = await this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n return this.#adapter.write(this.#stringify(obj));\n }\n}\nexport class DataFileSync {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFileSync(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n read() {\n const data = this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n this.#adapter.write(this.#stringify(obj));\n }\n}\n", "import { DataFile, DataFileSync } from './DataFile.js';\nexport class JSONFile extends DataFile {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\nexport class JSONFileSync extends DataFileSync {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\n", "/**\n * Session Data Management\n * Provides unified JSON storage and session lifecycle management using lowdb\n */\n\nimport { Low } from 'lowdb';\nimport { JSONFileSync } from 'lowdb/node';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport { getPackageRootDir } from '../utils/package-paths';\nimport {\n QueryDevelopmentSession,\n QueryState,\n MCPCallRecord,\n TestExecutionRecord,\n QualityScoreRecord,\n SessionFilter,\n MonitoringConfig,\n MonitoringConfigSchema,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Database schema for lowdb - sessions only\n */\ninterface SessionDatabase {\n sessions: QueryDevelopmentSession[];\n}\n\n/**\n * Session Data Manager - handles all session persistence and lifecycle\n */\nexport class SessionDataManager {\n private db: Low;\n private config: MonitoringConfig;\n private storageDir: string;\n\n constructor(configOverrides: Partial = {}) {\n this.config = MonitoringConfigSchema.parse({\n ...MonitoringConfigSchema.parse({}),\n ...configOverrides,\n });\n\n this.storageDir = this.config.storageLocation;\n this.ensureStorageDirectory();\n\n const adapter = new JSONFileSync(join(this.storageDir, 'sessions.json'));\n this.db = new Low(adapter, {\n sessions: [],\n });\n\n this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n async initialize(): Promise {\n await this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n private async initializeDatabase(): Promise {\n try {\n await this.db.read();\n \n logger.info(`Session data manager initialized with ${this.db.data.sessions.length} sessions`);\n } catch (error) {\n logger.error('Failed to initialize session database:', error);\n throw error;\n }\n }\n\n /**\n * Ensure storage directory structure exists\n */\n private ensureStorageDirectory(): void {\n try {\n // mkdirSync with recursive: true is a no-op if directories already exist\n mkdirSync(this.storageDir, { recursive: true });\n\n // Create subdirectories\n const subdirs = ['sessions-archive', 'exports'];\n for (const subdir of subdirs) {\n mkdirSync(join(this.storageDir, subdir), { recursive: true });\n }\n\n // Use 'wx' flag (exclusive create) to atomically create config only\n // if it doesn't exist, avoiding TOCTOU race (CWE-367).\n const configPath = join(this.storageDir, 'config.json');\n try {\n writeFileSync(configPath, JSON.stringify(this.config, null, 2), { flag: 'wx' });\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n\n logger.debug(`Storage directory initialized: ${this.storageDir}`);\n } catch (error) {\n logger.error('Failed to create storage directory:', error);\n throw error;\n }\n }\n\n /**\n * Start a new query development session\n */\n async startSession(\n queryPath: string,\n language?: string,\n queryType?: string,\n description?: string\n ): Promise {\n const sessionId = randomUUID();\n const startTime = new Date().toISOString();\n\n const session: QueryDevelopmentSession = {\n sessionId,\n queryPath,\n language: language || 'unknown',\n queryType,\n description,\n startTime,\n status: 'active',\n mcpCalls: [],\n testExecutions: [],\n qualityScores: [],\n currentState: {\n filesPresent: [],\n compilationStatus: 'unknown',\n testStatus: 'unknown',\n documentationStatus: 'unknown',\n lastActivity: startTime,\n },\n recommendations: [],\n };\n\n await this.db.read();\n this.db.data.sessions.push(session);\n await this.db.write();\n\n logger.info(`Started new session: ${sessionId} for query: ${queryPath}`);\n return sessionId;\n }\n\n /**\n * End a session with final status\n */\n async endSession(\n sessionId: string,\n status: 'completed' | 'failed' | 'abandoned'\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.status = status;\n session.endTime = new Date().toISOString();\n session.currentState.lastActivity = session.endTime;\n\n await this.db.write();\n\n // Archive completed session if enabled\n if (this.config.archiveCompletedSessions && status === 'completed') {\n await this.archiveSession(sessionId);\n }\n\n logger.info(`Ended session: ${sessionId} with status: ${status}`);\n return session;\n }\n\n /**\n * Get a specific session by ID\n */\n async getSession(sessionId: string): Promise {\n await this.db.read();\n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n return session || null;\n }\n\n /**\n * List sessions with optional filtering\n */\n async listSessions(filters?: SessionFilter): Promise {\n await this.db.read();\n let sessions = [...this.db.data.sessions];\n\n if (filters) {\n if (filters.queryPath) {\n sessions = sessions.filter(s => s.queryPath.includes(filters.queryPath!));\n }\n if (filters.status) {\n sessions = sessions.filter(s => s.status === filters.status);\n }\n if (filters.language) {\n sessions = sessions.filter(s => s.language === filters.language);\n }\n if (filters.queryType) {\n sessions = sessions.filter(s => s.queryType === filters.queryType);\n }\n if (filters.dateRange) {\n const [start, end] = filters.dateRange;\n sessions = sessions.filter(s => \n s.startTime >= start && s.startTime <= end\n );\n }\n }\n\n return sessions;\n }\n\n /**\n * Update session state\n */\n async updateSessionState(\n sessionId: string,\n stateUpdate: Partial\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.currentState = {\n ...session.currentState,\n ...stateUpdate,\n lastActivity: new Date().toISOString(),\n };\n\n await this.db.write();\n return session;\n }\n\n /**\n * Add MCP call record to session\n */\n async addMCPCall(sessionId: string, callRecord: MCPCallRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for MCP call: ${sessionId}`);\n return;\n }\n\n session.mcpCalls.push(callRecord);\n session.currentState.lastActivity = callRecord.timestamp;\n\n // Update next suggested tool if provided\n if (callRecord.nextSuggestedTool) {\n session.nextSuggestedTool = callRecord.nextSuggestedTool;\n }\n\n await this.db.write();\n }\n\n /**\n * Add test execution record to session\n */\n async addTestExecution(sessionId: string, testRecord: TestExecutionRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for test execution: ${sessionId}`);\n return;\n }\n\n session.testExecutions.push(testRecord);\n session.currentState.lastActivity = testRecord.timestamp;\n\n // Update compilation/test status based on execution\n if (testRecord.type === 'compilation') {\n session.currentState.compilationStatus = testRecord.success ? 'success' : 'failed';\n } else if (testRecord.type === 'test_run') {\n session.currentState.testStatus = testRecord.success ? 'passing' : 'failing';\n }\n\n await this.db.write();\n }\n\n /**\n * Add quality score record to session\n */\n async addQualityScore(sessionId: string, scoreRecord: QualityScoreRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for quality score: ${sessionId}`);\n return;\n }\n\n session.qualityScores.push(scoreRecord);\n session.currentState.lastActivity = scoreRecord.timestamp;\n session.recommendations = scoreRecord.recommendations;\n\n await this.db.write();\n }\n\n /**\n * Archive a completed session to monthly file\n */\n private async archiveSession(sessionId: string): Promise {\n try {\n const session = await this.getSession(sessionId);\n if (!session) return;\n\n const date = new Date(session.endTime || session.startTime);\n const monthDir = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;\n const archiveDir = join(this.storageDir, 'sessions-archive', monthDir);\n\n mkdirSync(archiveDir, { recursive: true });\n\n const archiveFile = join(archiveDir, `${sessionId}.json`);\n writeFileSync(archiveFile, JSON.stringify(session, null, 2));\n\n // Remove from active sessions\n await this.db.read();\n this.db.data.sessions = this.db.data.sessions.filter(s => s.sessionId !== sessionId);\n await this.db.write();\n\n logger.info(`Archived session: ${sessionId} to ${archiveFile}`);\n } catch (error) {\n logger.error(`Failed to archive session ${sessionId}:`, error);\n }\n }\n\n /**\n * Get active sessions for a specific query path\n */\n async getActiveSessionsForQuery(queryPath: string): Promise {\n await this.db.read();\n return this.db.data.sessions.filter(s => \n s.queryPath === queryPath && s.status === 'active'\n );\n }\n\n /**\n * Clean up old sessions based on retention policy\n */\n async cleanupOldSessions(): Promise {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);\n const cutoffTimestamp = cutoffDate.toISOString();\n\n await this.db.read();\n const sessionsToRemove = this.db.data.sessions.filter(s => \n s.endTime && s.endTime < cutoffTimestamp\n );\n\n if (sessionsToRemove.length > 0) {\n this.db.data.sessions = this.db.data.sessions.filter(s => \n !s.endTime || s.endTime >= cutoffTimestamp\n );\n await this.db.write();\n\n logger.info(`Cleaned up ${sessionsToRemove.length} old sessions`);\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): MonitoringConfig {\n return this.config;\n }\n\n /**\n * Update configuration\n */\n async updateConfig(configUpdate: Partial): Promise {\n this.config = MonitoringConfigSchema.parse({\n ...this.config,\n ...configUpdate,\n });\n\n // Update config.json file only\n const configPath = join(this.storageDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(this.config, null, 2));\n\n logger.info('Updated monitoring configuration');\n }\n}\n\n/**\n * Parse boolean environment variable\n */\nfunction parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolean {\n if (envVar === undefined) return defaultValue;\n return envVar.toLowerCase() === 'true' || envVar === '1';\n}\n\n// Export singleton instance with environment variable support\nexport const sessionDataManager = new SessionDataManager({\n storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getPackageRootDir(), '.ql-mcp-tracking'),\n enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false),\n});", "import { z } from 'zod';\n\n/**\n * Monitoring and Reporting types for CodeQL Development MCP Server\n * Based on the specification in docs/mcp-server-monitoring-and-reporting.md\n */\n\n/**\n * MCP Call Record - captures individual MCP tool calls\n */\nexport const MCPCallRecordSchema = z.object({\n callId: z.string(),\n timestamp: z.string(), // ISO timestamp\n toolName: z.string(),\n parameters: z.record(z.any()),\n result: z.any(),\n success: z.boolean(),\n duration: z.number(), // milliseconds\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type MCPCallRecord = z.infer;\n\n/**\n * Test Execution Record - captures query compilation and test runs\n */\nexport const TestExecutionRecordSchema = z.object({\n executionId: z.string(),\n timestamp: z.string(),\n type: z.enum(['compilation', 'test_run', 'database_build']),\n success: z.boolean(),\n details: z.record(z.any()),\n metrics: z.object({\n passRate: z.number().optional(),\n coverage: z.number().optional(),\n performance: z.number().optional(),\n }).optional(),\n});\n\nexport type TestExecutionRecord = z.infer;\n\n/**\n * Quality Score Record - multi-dimensional quality assessment\n */\nexport const QualityScoreRecordSchema = z.object({\n scoreId: z.string(),\n timestamp: z.string(),\n overallScore: z.number().min(0).max(100), // 0-100\n dimensions: z.object({\n syntacticCorrectness: z.number().min(0).max(100),\n testCoverageResults: z.number().min(0).max(100),\n documentationQuality: z.number().min(0).max(100),\n functionalCorrectness: z.number().min(0).max(100),\n }),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n recommendations: z.array(z.string()),\n});\n\nexport type QualityScoreRecord = z.infer;\n\n/**\n * Query State - current state of the query development\n */\nexport const QueryStateSchema = z.object({\n filesPresent: z.array(z.string()),\n compilationStatus: z.enum(['unknown', 'success', 'failed']),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']),\n lastActivity: z.string(), // ISO timestamp\n});\n\nexport type QueryState = z.infer;\n\n/**\n * Query Development Session - main data structure for tracking\n */\nexport const QueryDevelopmentSessionSchema = z.object({\n // Session Metadata\n sessionId: z.string(),\n queryPath: z.string(),\n language: z.string(),\n queryType: z.string().optional(),\n description: z.string().optional(),\n startTime: z.string(), // ISO timestamp\n endTime: z.string().optional(), // ISO timestamp\n status: z.enum(['active', 'completed', 'failed', 'abandoned']),\n\n // MCP Call History\n mcpCalls: z.array(MCPCallRecordSchema),\n\n // Test Execution Records\n testExecutions: z.array(TestExecutionRecordSchema),\n\n // Quality Metrics\n qualityScores: z.array(QualityScoreRecordSchema),\n\n // Development State\n currentState: QueryStateSchema,\n recommendations: z.array(z.string()),\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type QueryDevelopmentSession = z.infer;\n\n/**\n * Session Filter for listing and searching\n */\nexport const SessionFilterSchema = z.object({\n queryPath: z.string().optional(),\n status: z.string().optional(),\n dateRange: z.tuple([z.string(), z.string()]).optional(),\n language: z.string().optional(),\n queryType: z.string().optional(),\n});\n\nexport type SessionFilter = z.infer;\n\n/**\n * Comparison Report for analyzing multiple sessions\n */\nexport const ComparisonReportSchema = z.object({\n sessionIds: z.array(z.string()),\n dimensions: z.array(z.string()),\n timestamp: z.string(),\n results: z.record(z.any()),\n});\n\nexport type ComparisonReport = z.infer;\n\n/**\n * Aggregate Report for batch analysis\n */\nexport const AggregateReportSchema = z.object({\n filters: SessionFilterSchema,\n timestamp: z.string(),\n totalSessions: z.number(),\n successRate: z.number(),\n averageQualityScore: z.number(),\n commonPatterns: z.array(z.string()),\n recommendations: z.array(z.string()),\n});\n\nexport type AggregateReport = z.infer;\n\n/**\n * Export Result for data export operations\n */\nexport const ExportResultSchema = z.object({\n format: z.enum(['json', 'html', 'markdown']),\n filename: z.string(),\n content: z.string(),\n timestamp: z.string(),\n});\n\nexport type ExportResult = z.infer;\n\n/**\n * Functional Test Result for automated testing\n */\nexport const FunctionalTestResultSchema = z.object({\n sessionId: z.string(),\n queryPath: z.string(),\n passed: z.boolean(),\n criteria: z.record(z.any()),\n details: z.record(z.any()),\n timestamp: z.string(),\n});\n\nexport type FunctionalTestResult = z.infer;\n\n/**\n * Test Report for comprehensive test analysis\n */\nexport const TestReportSchema = z.object({\n sessionIds: z.array(z.string()),\n criteria: z.record(z.any()),\n timestamp: z.string(),\n overallPassRate: z.number(),\n results: z.array(FunctionalTestResultSchema),\n summary: z.record(z.any()),\n});\n\nexport type TestReport = z.infer;\n\n/**\n * Monitoring Configuration\n */\nexport const MonitoringConfigSchema = z.object({\n storageLocation: z.string().default('.ql-mcp-tracking/'),\n autoTrackSessions: z.boolean().default(true),\n retentionDays: z.number().default(90),\n includeCallParameters: z.boolean().default(true),\n includeCallResults: z.boolean().default(true),\n maxActiveSessionsPerQuery: z.number().default(3),\n scoringFrequency: z.enum(['per_call', 'periodic', 'manual']).default('per_call'),\n archiveCompletedSessions: z.boolean().default(true),\n enableRecommendations: z.boolean().default(true),\n enableMonitoringTools: z.boolean().default(false), // Opt-in: session_* tools disabled by default for end-users\n});\n\nexport type MonitoringConfig = z.infer;"], + "mappings": "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", + "names": ["dirname", "existsSync", "readFileSync", "resolve", "pathToFileURL", "z", "dirname", "isAbsolute", "mkdirSync", "existsSync", "join", "resolve", "mkdirSync", "resolve", "existsSync", "mkdirSync", "timestamp", "join", "writeFileSync", "existsSync", "mkdirSync", "basename", "dirname", "isAbsolute", "join", "resolve", "isAbsolute", "resolve", "join", "writeFileSync", "existsSync", "logger", "executeCodeQLCommand", "basename", "mkdirSync", "dirname", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "readFile", "z", "exception", "map", "schema", "type", "extend", "str", "string", "z", "z", "z", "z", "z", "z", "setTimeout", "delimiter", "join", "delimiter", "resolve", "setTimeout", "join", "join", "resolve", "pathToFileURL", "z", "z", "z", "z", "z", "z", "writeFileSync", "readFileSync", "existsSync", "join", "dirname", "basename", "mkdirSync", "z", "z", "z", "z", "z", "z", "join", "resolve", "resolve", "join", "z", "z", "resolve", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "fs", "path", "getLanguageExtension", "z", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "readFileSync", "existsSync", "join", "join", "existsSync", "readFileSync", "z", "basename", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "z", "basename", "z", "randomUUID", "readFileSync", "writeFileSync", "path", "path", "readFileSync", "str", "writeFileSync", "parse", "mkdirSync", "writeFileSync", "join", "z", "join", "mkdirSync", "writeFileSync", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] +} diff --git a/server/dist/ql-mcp-server.js.map b/server/dist/ql-mcp-server.js.map deleted file mode 100644 index e24bf2bd..00000000 --- a/server/dist/ql-mcp-server.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/utils/logger.ts", "../src/lib/cli-executor.ts", "../src/ql-mcp-server.ts", "../src/tools/codeql/bqrs-decode.ts", "../src/lib/cli-tool-registry.ts", "../src/lib/query-results-evaluator.ts", "../src/lib/log-directory-manager.ts", "../src/utils/temp-dir.ts", "../src/tools/codeql/bqrs-info.ts", "../src/tools/codeql/bqrs-interpret.ts", "../src/tools/codeql/database-analyze.ts", "../src/tools/codeql/database-create.ts", "../src/tools/codeql/find-class-position.ts", "../src/tools/codeql/find-predicate-position.ts", "../src/tools/codeql/find-query-files.ts", "../src/lib/query-file-finder.ts", "../../node_modules/js-yaml/dist/js-yaml.mjs", "../src/lib/metadata-resolver.ts", "../src/tools/codeql/generate-log-summary.ts", "../src/tools/codeql/generate-query-help.ts", "../src/tools/codeql/language-server-eval.ts", "../src/lib/language-server.ts", "../src/tools/codeql/pack-install.ts", "../src/tools/codeql/pack-ls.ts", "../src/tools/codeql/profile-codeql-query.ts", "../src/tools/codeql/query-compile.ts", "../src/tools/codeql/query-format.ts", "../src/tools/codeql/query-run.ts", "../src/tools/codeql/quick-evaluate.ts", "../src/tools/codeql/register-database.ts", "../src/tools/codeql/resolve-database.ts", "../src/tools/codeql/resolve-languages.ts", "../src/tools/codeql/resolve-library-path.ts", "../src/tools/codeql/resolve-metadata.ts", "../src/tools/codeql/resolve-qlref.ts", "../src/tools/codeql/resolve-queries.ts", "../src/tools/codeql/resolve-tests.ts", "../src/tools/codeql/test-accept.ts", "../src/tools/codeql/test-extract.ts", "../src/tools/codeql/test-run.ts", "../src/tools/codeql-tools.ts", "../src/lib/validation.ts", "../src/lib/query-scaffolding.ts", "../src/lib/resources.ts", "../src/tools/codeql-resources.ts", "../src/resources/language-resources.ts", "../src/types/language-types.ts", "../src/prompts/workflow-prompts.ts", "../src/prompts/prompt-loader.ts", "../src/tools/monitoring-tools.ts", "../../node_modules/lowdb/lib/core/Low.js", "../../node_modules/lowdb/lib/adapters/node/TextFile.js", "../../node_modules/lowdb/lib/adapters/node/DataFile.js", "../../node_modules/lowdb/lib/adapters/node/JSONFile.js", "../src/lib/session-data-manager.ts", "../src/types/monitoring.ts"], - "sourcesContent": ["/**\n * Simple logger utility\n */\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.log(`[INFO] ${new Date().toISOString()} ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[ERROR] ${new Date().toISOString()} ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n console.warn(`[WARN] ${new Date().toISOString()} ${message}`, ...args);\n },\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.debug(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args);\n }\n },\n};\n", "/**\n * Generic CLI command execution utilities for CodeQL and QLT commands\n */\n\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { logger } from '../utils/logger';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CLIExecutionResult {\n stdout: string;\n stderr: string;\n success: boolean;\n error?: string;\n exitCode?: number;\n}\n\nexport interface CLIExecutionOptions {\n command: string;\n args: string[];\n cwd?: string;\n timeout?: number;\n env?: Record;\n}\n\n// Whitelist of allowed commands to prevent arbitrary command execution\nconst ALLOWED_COMMANDS = new Set([\n 'codeql',\n 'git',\n 'node',\n 'npm',\n 'qlt',\n 'which'\n]);\n\n// Additional commands allowed in test environments\nlet testCommands: Set | null = null;\n\n// Whitelist of safe environment variables to pass to child processes\n// This prevents potentially malicious environment variables from being passed through\nconst SAFE_ENV_VARS = [\n 'HOME', // User home directory\n 'LANG', // Locale setting\n 'LC_ALL', // Locale setting\n 'LC_CTYPE', // Locale setting\n 'PATH', // Required to find executables\n 'SHELL', // User's shell (Unix)\n 'TEMP', // Temporary directory (Windows)\n 'TERM', // Terminal type (Unix)\n 'TMP', // Temporary directory (Windows)\n 'TMPDIR', // Temporary directory (Unix)\n 'USER', // Current user (Unix)\n 'USERNAME', // Current user (Windows)\n] as const;\n\n// Whitelist of safe environment variable prefixes\n// These are needed for CodeQL and Node.js functionality\nconst SAFE_ENV_PREFIXES = [\n 'CODEQL_', // CodeQL-specific variables\n 'NODE_', // Node.js-specific variables (for npm, etc.)\n] as const;\n\n// Pattern for dangerous control characters in CLI arguments\n// Rejected characters:\n// \\x01-\\x08: SOH through BS (start of heading, text, null control chars, backspace)\n// \\x0B: Vertical tab - rarely used legitimately, can cause display issues\n// \\x0C: Form feed - can cause unexpected page breaks in output\n// \\x0E-\\x1F: SO through US (shift out/in, device controls, separators)\n// Allowed characters:\n// \\x00: Null byte - handled separately for clearer error messaging\n// \\x09: Horizontal tab - commonly used in file paths and arguments\n// \\x0A: Newline (LF) - may appear in multi-line arguments\n// \\x0D: Carriage return (CR) - may appear with newlines on Windows\n// eslint-disable-next-line no-control-regex\nconst DANGEROUS_CONTROL_CHARS = /[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Enable test-specific commands for testing purposes\n * This should only be called in test environments\n */\nexport function enableTestCommands(): void {\n testCommands = new Set([\n 'cat',\n 'echo',\n 'ls',\n 'sh',\n 'sleep'\n ]);\n}\n\n/**\n * Disable test-specific commands\n */\nexport function disableTestCommands(): void {\n testCommands = null;\n}\n\n/**\n * Check if a command is allowed\n */\nfunction isCommandAllowed(command: string): boolean {\n return ALLOWED_COMMANDS.has(command) || (testCommands !== null && testCommands.has(command));\n}\n\n/**\n * Sanitize a CLI argument to prevent potential issues with special characters.\n * \n * While execFile() does not spawn a shell (preventing shell injection), we still\n * validate arguments to:\n * 1. Reject null bytes that could truncate strings in C-based commands\n * 2. Reject control characters that could cause unexpected behavior\n * 3. Provide defense-in-depth against potential issues\n * \n * @param arg - The argument to sanitize\n * @returns The sanitized argument\n * @throws Error if the argument contains dangerous characters\n */\nexport function sanitizeCLIArgument(arg: string): string {\n // Reject null bytes - these can truncate strings in C-based commands\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n if (arg.includes('\\0')) {\n throw new Error(`CLI argument contains null byte: argument rejected for security`);\n }\n \n // Reject control characters using the module-level constant pattern\n if (DANGEROUS_CONTROL_CHARS.test(arg)) {\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n throw new Error(`CLI argument contains control characters: argument rejected for security`);\n }\n \n return arg;\n}\n\n/**\n * Sanitize an array of CLI arguments\n * @param args - The arguments to sanitize\n * @returns The sanitized arguments\n * @throws Error if any argument contains dangerous characters\n */\nexport function sanitizeCLIArguments(args: string[]): string[] {\n return args.map(sanitizeCLIArgument);\n}\n\n/**\n * Filter environment variables to only include safe ones\n * This prevents potentially malicious environment variables from being passed to child processes\n */\nfunction getSafeEnvironment(additionalEnv?: Record): Record {\n const safeEnv: Record = {};\n \n // Copy whitelisted environment variables from process.env\n for (const key of SAFE_ENV_VARS) {\n if (process.env[key] !== undefined) {\n safeEnv[key] = process.env[key]!;\n }\n }\n \n // Copy environment variables with whitelisted prefixes\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && SAFE_ENV_PREFIXES.some(prefix => key.startsWith(prefix))) {\n safeEnv[key] = value;\n }\n }\n \n // Merge with explicitly provided environment variables\n // These are trusted as they come from the application code, not external sources\n if (additionalEnv) {\n Object.assign(safeEnv, additionalEnv);\n }\n \n return safeEnv;\n}\n\n/**\n * Execute a CLI command and return the result.\n * \n * Security: This function uses execFile() instead of exec() to avoid shell interpretation.\n * Arguments are passed directly to the executable as an array, preventing shell injection.\n * Additional security measures include:\n * - Command whitelist validation\n * - Shell metacharacter detection in command names\n * - CLI argument sanitization (null bytes, control characters)\n * - Environment variable filtering\n */\nexport async function executeCLICommand(options: CLIExecutionOptions): Promise {\n try {\n const { command, args, cwd, timeout = 300000, env } = options; // 5 minute default timeout\n \n // Validate command is in the whitelist to prevent arbitrary command execution\n if (!isCommandAllowed(command)) {\n throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`);\n }\n \n // Validate command to ensure it doesn't contain shell metacharacters\n if (command.includes(';') || command.includes('|') || command.includes('&') || \n command.includes('$') || command.includes('`') || command.includes('\\n') ||\n command.includes('\\r')) {\n throw new Error(`Invalid command: contains shell metacharacters: ${command}`);\n }\n \n // Sanitize CLI arguments to prevent issues with special characters\n // This provides defense-in-depth even though execFile() doesn't use a shell\n const sanitizedArgs = sanitizeCLIArguments(args);\n \n logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout });\n \n const execOptions = {\n cwd,\n timeout,\n env: getSafeEnvironment(env),\n };\n \n // execFile() is used instead of exec() to avoid shell interpretation\n // Arguments are passed as an array, not interpolated into a command string\n const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions);\n\n return {\n stdout,\n stderr,\n success: true,\n exitCode: 0\n };\n\n } catch (error: unknown) {\n logger.error('CLI command execution failed:', error);\n \n const err = error as Error & { code?: number; stdout?: string; stderr?: string };\n const errorMessage = err instanceof Error ? err.message : String(error);\n const exitCode = err.code || 1;\n \n return {\n stdout: err.stdout || '',\n stderr: err.stderr || errorMessage,\n success: false,\n error: errorMessage,\n exitCode\n };\n }\n}\n\n/**\n * Build CodeQL command arguments with proper escaping\n */\nexport function buildCodeQLArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n // Single-letter parameters that should use -key=value format (with equals sign)\n // Note: CodeQL CLI uses -t=key=value format for metadata, not -t key=value\n const singleLetterParams = new Set(['t', 'o', 'v', 'q', 'h', 'J']);\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n const isSingleLetter = key.length === 1 && singleLetterParams.has(key);\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(isSingleLetter ? `-${key}` : `--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values (e.g., multiple -t flags for metadata)\n for (const item of value) {\n if (isSingleLetter) {\n // For single-letter params like -t, use -key=value format\n args.push(`-${key}=${String(item)}`);\n } else {\n // For long params, use --key=value format\n args.push(`--${key}=${String(item)}`);\n }\n }\n } else {\n // Handle string, number, and other values\n if (isSingleLetter) {\n // For single-letter params, use -key=value format\n args.push(`-${key}=${String(value)}`);\n } else {\n args.push(`--${key}=${String(value)}`);\n }\n }\n }\n \n return args;\n}\n\n/**\n * Build QLT command arguments with proper escaping\n */\nexport function buildQLTArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values\n for (const item of value) {\n args.push(`--${key}`, String(item));\n }\n } else {\n // Handle string, number, and other values\n args.push(`--${key}`, String(value));\n }\n }\n \n return args;\n}\n\n/**\n * Execute a CodeQL command\n */\nexport async function executeCodeQLCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = [],\n cwd?: string\n): Promise {\n const args = buildCodeQLArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'codeql',\n args,\n cwd\n });\n}\n\n/**\n * Execute a QLT command\n */\nexport async function executeQLTCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = []\n): Promise {\n const args = buildQLTArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'qlt',\n args\n });\n}\n\n/**\n * Get help text for a CLI command\n */\nexport async function getCommandHelp(command: string, subcommand?: string): Promise {\n const args = subcommand ? [subcommand, '--help'] : ['--help'];\n \n const result = await executeCLICommand({\n command,\n args\n });\n \n return result.stdout || result.stderr || 'No help available';\n}\n\n/**\n * Validate that a command exists on the system\n */\nexport async function validateCommandExists(command: string): Promise {\n try {\n const result = await executeCLICommand({\n command: 'which',\n args: [command]\n });\n return result.success;\n } catch {\n return false;\n }\n}", "/**\n * CodeQL Development MCP McpServer\n * Main entry point for the server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport express from 'express';\nimport cors from 'cors';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport { registerCodeQLTools, registerCodeQLResources } from './tools';\nimport { registerLanguageResources } from './resources/language-resources';\nimport { registerWorkflowPrompts } from './prompts/workflow-prompts';\nimport { registerMonitoringTools } from './tools/monitoring-tools';\nimport { sessionDataManager } from './lib/session-data-manager';\nimport { logger } from './utils/logger';\n\n// Load environment variables\ndotenv.config();\n\nconst PACKAGE_NAME = 'codeql-development-mcp-server';\nconst VERSION = '1.0.0';\n\n/**\n * Start the MCP server\n */\nexport async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise {\n logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`);\n\n const server = new McpServer({\n name: PACKAGE_NAME,\n version: VERSION,\n });\n\n // Register CodeQL tools (legacy high-level helpers)\n registerCodeQLTools(server);\n\n // Register CodeQL resources (static guides)\n registerCodeQLResources(server);\n\n // Register language-specific resources (AST references, security patterns)\n registerLanguageResources(server);\n\n // Register high-level workflow prompts (complete development workflows)\n registerWorkflowPrompts(server);\n\n // Register monitoring and reporting tools\n registerMonitoringTools(server);\n\n // Initialize session data manager\n await sessionDataManager.initialize();\n\n if (mode === 'stdio') {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info('McpServer started successfully on STDIO transport');\n } else {\n // HTTP mode\n const app = express();\n app.use(cors());\n app.use(express.json());\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => Math.random().toString(36).substring(7),\n });\n await server.connect(transport);\n\n app.all('/mcp', (req, res) => {\n transport.handleRequest(req, res, req.body).catch((err) => {\n logger.error('Error handling MCP request:', err);\n if (!res.headersSent) {\n res.status(500).json({ error: 'Internal McpServer Error' });\n }\n });\n });\n\n app.get('/', (_req, res) => {\n res.json({\n name: PACKAGE_NAME,\n version: VERSION,\n description: 'CodeQL Development MCP McpServer',\n status: 'running',\n });\n });\n\n const host = process.env.HTTP_HOST || 'localhost';\n const port = Number(process.env.HTTP_PORT || process.env.PORT) || 3000;\n \n // Return a promise that keeps the process alive\n return new Promise((resolve, reject) => {\n const httpServer = app.listen(port, host, () => {\n logger.info(`HTTP server listening on http://${host}:${port}/mcp`);\n resolve();\n });\n \n httpServer.on('error', (error) => {\n logger.error('HTTP server error:', error);\n reject(error);\n });\n });\n }\n\n setupGracefulShutdown(server);\n return server;\n}\n\n/**\n * Set up graceful shutdown handling\n */\nfunction setupGracefulShutdown(server: McpServer): void {\n const shutdown = async () => {\n logger.info('Shutting down server...');\n try {\n await server.close();\n logger.info('McpServer closed gracefully');\n process.exit(0);\n } catch (error) {\n logger.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\n/**\n * Main function to start the server\n */\nasync function main(): Promise {\n try {\n const transportMode = (process.env.TRANSPORT_MODE || 'stdio').toLowerCase();\n const mode: 'stdio' | 'http' = transportMode === 'http' ? 'http' : 'stdio';\n await startServer(mode);\n } catch (error) {\n logger.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\n// Start the server if this file is run directly\nconst scriptPath = process.argv[1] ? resolve(process.argv[1]) : undefined;\nif (scriptPath && import.meta.url === pathToFileURL(scriptPath).href) {\n main();\n}\n", "/**\n * CodeQL BQRS decode tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsDecodeTool: CLIToolDefinition = {\n name: 'codeql_bqrs_decode',\n description: 'Decode BQRS result files to human-readable formats',\n command: 'codeql',\n subcommand: 'bqrs decode',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to decode'),\n output: createCodeQLSchemas.output(),\n format: z.enum(['csv', 'json']).optional().describe('Output format'),\n 'max-paths': z.number().optional().describe('Maximum number of paths to output'),\n 'start-at': z.number().optional().describe('Start output at result number'),\n 'max-results': z.number().optional().describe('Maximum number of results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs decode --format=csv --output=results.csv results.bqrs',\n 'codeql bqrs decode --format=json --max-results=100 results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * Generic tool registry for creating MCP tools from CLI command definitions\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator';\nimport { getOrCreateLogDirectory } from './log-directory-manager';\nimport { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs';\nimport { basename, dirname, join, resolve } from 'path';\nimport { createProjectTempDir } from '../utils/temp-dir';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n// Calculate the repository root directory\n// When running from source: server/src/lib/ -> go up 3 levels to repo root\n// When running from bundle: server/dist/ -> go up 2 levels to repo root\n// The bundled file flattens the structure, so we detect based on path\n// Normalize path separators for cross-platform compatibility (Windows uses '\\', Unix uses '/')\nconst normalizedDir = __dirname.replace(/\\\\/g, '/');\nconst repoRootDir = normalizedDir.includes('src/lib')\n ? resolve(__dirname, '..', '..', '..') // From source: server/src/lib -> repo root\n : resolve(__dirname, '..', '..'); // From bundle: server/dist -> repo root\n\nexport type { CLIExecutionResult } from './cli-executor';\n\nexport interface CLIToolDefinition {\n name: string;\n description: string;\n command: 'codeql' | 'qlt';\n subcommand: string;\n inputSchema: Record;\n examples?: string[];\n resultProcessor?: (_result: CLIExecutionResult, _params: Record) => string;\n}\n\n/**\n * Default result processor that formats CLI output appropriately\n */\nexport const defaultCLIResultProcessor = (\n result: CLIExecutionResult, \n _params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n \n let output = '';\n \n if (result.stdout) {\n output += result.stdout;\n }\n \n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n \n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n \n return output;\n};\n\n/**\n * Register a CLI tool with the MCP server\n */\nexport function registerCLITool(server: McpServer, definition: CLIToolDefinition): void {\n const {\n name,\n description,\n command,\n subcommand,\n inputSchema,\n resultProcessor = defaultCLIResultProcessor\n } = definition;\n\n server.tool(\n name,\n description,\n inputSchema,\n async (params: Record) => {\n // Track temporary directories for cleanup\n const tempDirsToCleanup: string[] = [];\n \n try {\n logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params });\n\n // Separate positional arguments from named options\n // Extract tool-specific parameters that should not be passed to CLI\n // Note: format is extracted for tools that use it internally but not on CLI\n // For codeql_bqrs_interpret, codeql_bqrs_decode, codeql_generate_query-help, and codeql_database_analyze, format should be passed to CLI\n const formatShouldBePassedToCLI = name === 'codeql_bqrs_interpret' || name === 'codeql_bqrs_decode' || name === 'codeql_generate_query-help' || name === 'codeql_database_analyze';\n \n const extractedParams = formatShouldBePassedToCLI\n ? {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack,\n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n }\n : {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack, \n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n format: params.format,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n };\n\n const {\n _positional = [],\n files,\n file,\n dir,\n packDir,\n tests,\n query,\n queryName,\n queryLanguage: _queryLanguage,\n queryPack: _queryPack,\n sourceFiles,\n sourceFunction,\n targetFunction,\n format: _format,\n interpretedOutput: _interpretedOutput,\n evaluationFunction: _evaluationFunction,\n evaluationOutput: _evaluationOutput,\n directory,\n logDir: customLogDir,\n qlref,\n } = extractedParams;\n\n // Get remaining options (everything not extracted above)\n const options = {...params};\n Object.keys(extractedParams).forEach(key => delete options[key]);\n let positionalArgs = Array.isArray(_positional) ? _positional as string[] : [_positional as string];\n\n // Handle files parameter as positional arguments for certain tools\n if (files && Array.isArray(files)) {\n positionalArgs = [...positionalArgs, ...files as string[]];\n }\n\n // Handle file parameter as positional argument for BQRS tools\n if (file && name.startsWith('codeql_bqrs_')) {\n positionalArgs = [...positionalArgs, file as string];\n }\n\n // Handle qlref parameter as positional argument for resolve qlref tool\n if (qlref && name === 'codeql_resolve_qlref') {\n positionalArgs = [...positionalArgs, qlref as string];\n }\n\n // Handle database parameter as positional argument for resolve database tool\n if (options.database && name === 'codeql_resolve_database') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database parameter as positional argument for database create tool\n if (options.database && name === 'codeql_database_create') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database and queries parameters as positional arguments for database analyze tool\n if (name === 'codeql_database_analyze') {\n if (options.database) {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n if (options.queries) {\n positionalArgs = [...positionalArgs, options.queries as string];\n delete options.queries;\n }\n }\n\n // Handle query parameter as positional argument for generate query-help tool\n if (query && name === 'codeql_generate_query-help') {\n positionalArgs = [...positionalArgs, query as string];\n }\n\n // Handle dir parameter as positional argument for pack tools\n if (dir && (name === 'codeql_pack_ls')) {\n positionalArgs = [...positionalArgs, dir as string];\n }\n \n // Handle tool-specific parameters using switch pattern for better maintainability\n switch (name) {\n case 'codeql_test_accept':\n case 'codeql_test_extract':\n case 'codeql_test_run':\n case 'codeql_resolve_tests':\n // Handle tests parameter as positional arguments for test tools\n if (tests && Array.isArray(tests)) {\n positionalArgs = [...positionalArgs, ...tests as string[]];\n }\n break;\n \n case 'codeql_query_run': {\n // Resolve database path to absolute path if it's relative\n if (options.database && typeof options.database === 'string' && !options.database.startsWith('/')) {\n options.database = resolve(repoRootDir, options.database);\n logger.info(`Resolved database path to: ${options.database}`);\n }\n \n // Implement query resolution logic with enhanced results processing\n const resolvedQuery = await resolveQueryPath(params, logger);\n if (resolvedQuery) {\n positionalArgs = [...positionalArgs, resolvedQuery];\n } else if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n \n // Handle external predicates for tool queries\n if (queryName === 'PrintAST' && sourceFiles) {\n // Create a CSV file with the source file paths for the external predicate\n // The external predicate expects a CSV file with one column containing file paths\n const filePaths = (sourceFiles as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir); // Track for cleanup\n csvPath = join(tempDir, 'selectedSourceFiles.csv');\n\n // Create CSV content\n const csvContent = filePaths.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`selectedSourceFiles=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphFrom queries\n if (queryName === 'CallGraphFrom' && sourceFunction) {\n const functionNames = (sourceFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'sourceFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`sourceFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphTo queries\n if (queryName === 'CallGraphTo' && targetFunction) {\n const functionNames = (targetFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'targetFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`targetFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n break;\n }\n \n case 'codeql_query_compile':\n case 'codeql_resolve_metadata':\n // Handle query parameter as positional argument for query compilation and metadata tools\n if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n break;\n \n case 'codeql_resolve_queries':\n // Handle directory parameter as positional argument\n if (directory) {\n positionalArgs = [...positionalArgs, directory as string];\n }\n break;\n \n default:\n // No special parameter handling needed for other tools\n break;\n }\n\n // Set up logging directory for query/test runs\n let queryLogDir: string | undefined;\n if (name === 'codeql_query_run' || name === 'codeql_test_run') {\n queryLogDir = getOrCreateLogDirectory(customLogDir as string | undefined);\n logger.info(`Using log directory for ${name}: ${queryLogDir}`);\n \n // Create timestamp file to track when query/test run started\n const timestampPath = join(queryLogDir, 'timestamp');\n writeFileSync(timestampPath, Date.now().toString(), 'utf8');\n \n // Set the --logdir option for CodeQL CLI\n options.logdir = queryLogDir;\n \n // Set verbosity to progress+ to generate detailed query.log/test.log\n if (!options.verbosity) {\n options.verbosity = 'progress+';\n }\n \n // For query run, also handle the deprecated evaluator-log parameter and default output\n if (name === 'codeql_query_run') {\n // If evaluator-log was explicitly provided (deprecated), use it\n // Otherwise, set it to the log directory\n if (!options['evaluator-log']) {\n options['evaluator-log'] = join(queryLogDir, 'evaluator-log.jsonl');\n }\n \n // If output was not explicitly provided, set it to the log directory\n if (!options.output) {\n options.output = join(queryLogDir, 'results.bqrs');\n }\n }\n }\n\n let result: CLIExecutionResult;\n \n if (command === 'codeql') {\n // For pack commands, set the working directory to where qlpack.yml is located\n let cwd: string | undefined;\n if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) {\n cwd = (dir || packDir) as string;\n }\n \n // Add --additional-packs for commands that need to access local test packs\n const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || 'server/ql/javascript/examples/';\n if (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile') {\n options['additional-packs'] = additionalPacksPath;\n }\n \n // Keep test databases for codeql_test_run to allow subsequent query runs\n if (name === 'codeql_test_run') {\n options['keep-databases'] = true;\n }\n \n result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd);\n } else if (command === 'qlt') {\n result = await executeQLTCommand(subcommand, options, positionalArgs);\n } else {\n throw new Error(`Unsupported command: ${command}`);\n }\n\n // Post-execution processing for codeql_query_run\n if (name === 'codeql_query_run' && result.success && queryLogDir) {\n // Generate SARIF interpretation if results.bqrs exists\n const bqrsPath = options.output as string;\n const sarifPath = join(queryLogDir, 'results.sarif');\n \n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n \n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n \n // Process evaluation results\n result = await processQueryRunResults(result, params, logger);\n }\n\n // Process the result\n const processedResult = resultProcessor(result, params);\n\n return {\n content: [{\n type: 'text' as const,\n text: processedResult\n }],\n isError: !result.success\n };\n\n } catch (error) {\n logger.error(`Error in CLI tool ${name}:`, error);\n \n return {\n content: [{\n type: 'text' as const,\n text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}`\n }],\n isError: true\n };\n } finally {\n // Clean up temporary directories\n for (const tempDir of tempDirsToCleanup) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n logger.info(`Cleaned up temporary directory: ${tempDir}`);\n } catch (cleanupError) {\n logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError);\n }\n }\n }\n }\n );\n}\n\n/**\n * Helper function to create common CodeQL input schemas\n */\nexport const createCodeQLSchemas = {\n database: () => z.string().describe('Path to the CodeQL database'),\n \n query: () => z.string().describe('Path to the CodeQL query file (.ql)'),\n \n output: () => z.string().optional().describe('Output file path'),\n \n outputFormat: () => z.enum(['csv', 'json', 'bqrs', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n \n language: () => z.string().optional().describe('Programming language'),\n \n threads: () => z.number().optional().describe('Number of threads to use'),\n \n ram: () => z.number().optional().describe('Amount of RAM to use (MB)'),\n \n timeout: () => z.number().optional().describe('Timeout in seconds'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments'),\n \n positionalArgs: () => z.array(z.string()).optional().describe('Positional arguments')\n .transform((val) => ({ _positional: val }))\n};\n\n/**\n * Helper function to create common QLT input schemas\n */\nexport const createQLTSchemas = {\n language: () => z.string().describe('Programming language'),\n \n output: () => z.string().optional().describe('Output directory or file path'),\n \n template: () => z.string().optional().describe('Template to use'),\n \n name: () => z.string().optional().describe('Name for generated query'),\n \n description: () => z.string().optional().describe('Description for generated query'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n force: () => z.boolean().optional().describe('Force overwrite existing files'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments')\n};\n\n/**\n * Create a result processor that formats BQRS output specially\n */\nexport const createBQRSResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n // For BQRS commands, provide more context about the output\n let output = result.stdout;\n \n if (params.output) {\n output += `\\n\\nResults saved to: ${params.output}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Create a result processor that formats database creation output\n */\nexport const createDatabaseResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n let output = 'Database creation completed successfully';\n \n if (params.database || params._positional) {\n const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional);\n output += `\\n\\nDatabase location: ${dbPath}`;\n }\n \n if (result.stdout) {\n output += `\\n\\nOutput:\\n${result.stdout}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Resolve query path for codeql_query_run tool\n * If queryName and queryLanguage are provided, resolve using codeql resolve queries\n */\nasync function resolveQueryPath(\n params: Record, \n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n const { queryName, queryLanguage, queryPack, query } = params;\n \n // Validate parameter usage - queryName and query are mutually exclusive\n if (queryName && query) {\n logger.error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n throw new Error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n }\n \n // If no queryName provided, fall back to direct query parameter\n if (!queryName) {\n return query as string || null;\n }\n \n // If queryName provided but no language, we can't resolve\n if (!queryLanguage) {\n logger.error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n throw new Error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n }\n \n try {\n // Determine the query pack path - use absolute path to ensure it works regardless of cwd\n const defaultPackPath = resolve(repoRootDir, 'server', 'ql', queryLanguage as string, 'tools', 'src');\n const packPath = queryPack as string || defaultPackPath;\n \n logger.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`);\n \n // Execute codeql resolve queries to get available queries\n const { executeCodeQLCommand } = await import('./cli-executor');\n const resolveResult = await executeCodeQLCommand(\n 'resolve queries',\n { format: 'json' },\n [packPath]\n );\n \n if (!resolveResult.success) {\n logger.error('Failed to resolve queries:', resolveResult.stderr || resolveResult.error);\n throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`);\n }\n \n // Parse the JSON output to find matching queries\n let resolvedQueries: string[];\n try {\n resolvedQueries = JSON.parse(resolveResult.stdout);\n } catch (parseError) {\n logger.error('Failed to parse resolve queries output:', parseError);\n throw new Error('Failed to parse resolve queries output');\n }\n \n // Find the query that matches the requested name exactly\n const matchingQuery = resolvedQueries.find(queryPath => {\n const fileName = basename(queryPath);\n // Match exact query name: \"PrintAST\" should match \"PrintAST.ql\" only\n return fileName === `${queryName}.ql`;\n });\n\n if (!matchingQuery) {\n logger.error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\". Available queries:`, resolvedQueries.map(q => basename(q)));\n throw new Error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\"`);\n }\n \n logger.info(`Resolved query \"${queryName}\" to: ${matchingQuery}`);\n return matchingQuery;\n \n } catch (error) {\n logger.error('Error resolving query path:', error);\n throw error;\n }\n}\n\n/**\n * Interpret BQRS file using codeql bqrs interpret\n */\nasync function interpretBQRSFile(\n bqrsPath: string,\n queryPath: string,\n format: string,\n outputPath: string,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n // Extract query metadata to get id and kind\n const metadata = await extractQueryMetadata(queryPath);\n \n // Validate required metadata fields\n const missingFields = [];\n if (!metadata.id) missingFields.push('id');\n if (!metadata.kind) missingFields.push('kind');\n \n if (missingFields.length > 0) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(', ')}. Ensure the query file contains @id and @kind metadata.`\n };\n }\n \n // Sanitize metadata values to prevent command injection\n const sanitizedKind = (metadata.kind || '').replace(/[^a-zA-Z0-9_-]/g, '');\n const sanitizedId = (metadata.id || '').replace(/[^a-zA-Z0-9_/:-]/g, '');\n \n // Validate format for query kind\n const graphFormats = ['graphtext', 'dgml', 'dot'];\n if (graphFormats.includes(format) && metadata.kind !== 'graph') {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}`\n };\n }\n \n // Ensure output directory exists\n mkdirSync(dirname(outputPath), { recursive: true });\n \n // Build the codeql bqrs interpret command\n const params: Record = {\n format: format,\n output: outputPath,\n t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`]\n };\n \n logger.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`);\n \n // Execute codeql bqrs interpret\n const result = await executeCodeQLCommand(\n 'bqrs interpret',\n params,\n [bqrsPath]\n );\n \n return result;\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Failed to interpret BQRS file: ${error}`\n };\n }\n}\n\n/**\n * Get default output extension based on format\n */\nfunction getDefaultExtension(format: string): string {\n switch (format) {\n case 'sarif-latest':\n case 'sarifv2.1.0':\n return '.sarif';\n case 'csv':\n return '.csv';\n case 'graphtext':\n return '.txt';\n case 'dgml':\n return '.dgml';\n case 'dot':\n return '.dot';\n default:\n return '.txt';\n }\n}\n\n/**\n * Process query run results with optional interpretation or evaluation\n */\nasync function processQueryRunResults(\n result: CLIExecutionResult,\n params: Record,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params;\n \n // If no format or evaluationFunction specified, return as-is\n if (!format && !evaluationFunction) {\n return result;\n }\n \n // Ensure output (bqrs file) was generated\n if (!output) {\n return result;\n }\n \n const bqrsPath = output as string;\n \n // Determine the query path for metadata extraction\n let queryPath: string | null = null;\n \n if (query) {\n queryPath = query as string;\n } else if (queryName && queryLanguage) {\n // Try to resolve the query path again for evaluation\n queryPath = await resolveQueryPath(params, logger);\n }\n \n if (!queryPath) {\n logger.error('Cannot determine query path for interpretation/evaluation');\n return {\n ...result,\n stdout: result.stdout + '\\n\\nWarning: Query interpretation skipped - could not determine query path'\n };\n }\n \n // Handle new format parameter (preferred approach)\n if (format) {\n const outputFormat = format as string;\n \n // Determine output path\n let outputFilePath = interpretedOutput as string | undefined;\n if (!outputFilePath) {\n const ext = getDefaultExtension(outputFormat);\n outputFilePath = bqrsPath.replace('.bqrs', ext);\n }\n \n logger.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`);\n \n // Interpret the BQRS file\n const interpretResult = await interpretBQRSFile(\n bqrsPath,\n queryPath,\n outputFormat,\n outputFilePath,\n logger\n );\n \n if (interpretResult.success) {\n let enhancedOutput = result.stdout;\n enhancedOutput += `\\n\\nQuery results interpreted successfully with format: ${outputFormat}`;\n enhancedOutput += `\\nInterpreted output saved to: ${outputFilePath}`;\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n logger.error('Query interpretation failed:', interpretResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}`\n };\n }\n }\n \n // Handle legacy evaluationFunction parameter (deprecated)\n if (evaluationFunction) {\n logger.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`);\n logger.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`);\n \n // Perform the evaluation\n const evaluationResult: QueryEvaluationResult = await evaluateQueryResults(\n bqrsPath,\n queryPath,\n evaluationFunction as string,\n evaluationOutput as string | undefined\n );\n \n if (evaluationResult.success) {\n // Append evaluation results to the command output\n let enhancedOutput = result.stdout;\n \n if (evaluationResult.outputPath) {\n enhancedOutput += `\\n\\nQuery evaluation completed successfully.`;\n enhancedOutput += `\\nEvaluation output saved to: ${evaluationResult.outputPath}`;\n }\n \n if (evaluationResult.content) {\n enhancedOutput += `\\n\\n=== Query Results Evaluation ===\\n`;\n enhancedOutput += evaluationResult.content;\n }\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n // Evaluation failed, but don't fail the whole operation\n logger.error('Query evaluation failed:', evaluationResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query evaluation failed - ${evaluationResult.error}`\n };\n }\n }\n \n return result;\n } catch (error) {\n logger.error('Error in query results processing:', error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query processing error - ${error}`\n };\n }\n}", "/**\n * Query results evaluation functions for processing .bqrs files\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { writeFileSync, readFileSync } from 'fs';\nimport { dirname, isAbsolute } from 'path';\nimport { mkdirSync } from 'fs';\n\nexport interface QueryEvaluationResult {\n success: boolean;\n outputPath?: string;\n content?: string;\n error?: string;\n}\n\nexport interface QueryMetadata {\n kind?: string;\n name?: string;\n description?: string;\n id?: string;\n tags?: string[];\n}\n\n/**\n * Built-in evaluation functions\n */\nexport const BUILT_IN_EVALUATORS = {\n 'json-decode': 'JSON format decoder for query results',\n 'csv-decode': 'CSV format decoder for query results', \n 'mermaid-graph': 'Mermaid diagram generator for @kind graph queries (like PrintAST)',\n} as const;\n\nexport type BuiltInEvaluator = keyof typeof BUILT_IN_EVALUATORS;\n\n/**\n * Extract metadata from a CodeQL query file\n */\nexport async function extractQueryMetadata(queryPath: string): Promise {\n try {\n const queryContent = readFileSync(queryPath, 'utf-8');\n const metadata: QueryMetadata = {};\n \n // Extract metadata from comments using regex patterns\n const kindMatch = queryContent.match(/@kind\\s+([^\\s]+)/);\n if (kindMatch) metadata.kind = kindMatch[1];\n \n const nameMatch = queryContent.match(/@name\\s+(.+)/);\n if (nameMatch) metadata.name = nameMatch[1].trim();\n \n const descMatch = queryContent.match(/@description\\s+(.+)/);\n if (descMatch) metadata.description = descMatch[1].trim();\n \n const idMatch = queryContent.match(/@id\\s+(.+)/);\n if (idMatch) metadata.id = idMatch[1].trim();\n \n const tagsMatch = queryContent.match(/@tags\\s+(.+)/);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(/\\s+/).filter(t => t.length > 0);\n }\n \n return metadata;\n } catch (error) {\n logger.error('Failed to extract query metadata:', error);\n return {};\n }\n}\n\n/**\n * JSON decoder - converts .bqrs to JSON format\n */\nexport async function evaluateWithJsonDecoder(\n bqrsPath: string, \n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.json');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write JSON results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `JSON evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * CSV decoder - converts .bqrs to CSV format\n */\nexport async function evaluateWithCsvDecoder(\n bqrsPath: string,\n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'csv' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.csv');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write CSV results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `CSV evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Mermaid graph generator - converts @kind graph query results to mermaid diagrams\n */\nexport async function evaluateWithMermaidGraph(\n bqrsPath: string,\n queryPath: string,\n outputPath?: string\n): Promise {\n try {\n // First extract query metadata to confirm this is a graph query\n const metadata = await extractQueryMetadata(queryPath);\n \n if (metadata.kind !== 'graph') {\n logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`);\n return {\n success: false,\n error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`\n };\n }\n \n // Decode the BQRS file to JSON first\n const jsonResult = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!jsonResult.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}`\n };\n }\n \n // Parse the JSON results\n let queryResults;\n try {\n queryResults = JSON.parse(jsonResult.stdout);\n } catch (parseError) {\n return {\n success: false,\n error: `Failed to parse query results JSON: ${parseError}`\n };\n }\n \n // Generate mermaid diagram from graph results\n const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata);\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.md');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write markdown file with mermaid diagram\n writeFileSync(defaultOutputPath, mermaidContent);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: mermaidContent\n };\n } catch (error) {\n return {\n success: false,\n error: `Mermaid graph evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Generate mermaid diagram from CodeQL graph query results\n */\nfunction generateMermaidFromGraphResults(queryResults: unknown, metadata: QueryMetadata): string {\n const queryName = sanitizeMarkdown(metadata.name || 'CodeQL Query Results');\n const queryDesc = sanitizeMarkdown(metadata.description || 'Graph visualization of CodeQL query results');\n \n let mermaidContent = `# ${queryName}\\n\\n${queryDesc}\\n\\n`;\n \n // Handle different result structures that CodeQL graph queries can produce\n if (!queryResults || typeof queryResults !== 'object') {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Results]\\n```\\n';\n return mermaidContent;\n }\n \n // Check if results have the expected structure for graph queries\n const tuples = queryResults.tuples || queryResults;\n \n if (!Array.isArray(tuples) || tuples.length === 0) {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Graph Data]\\n```\\n';\n return mermaidContent;\n }\n \n mermaidContent += '```mermaid\\ngraph TD\\n';\n \n // Track nodes and edges to avoid duplicates\n const nodes = new Set();\n const edges = new Set();\n \n // Process each tuple in the results\n tuples.forEach((tuple: unknown, index: number) => {\n if (Array.isArray(tuple) && tuple.length >= 2) {\n // Extract source and target from tuple\n const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`);\n const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`);\n const label = tuple[2]?.toString() || '';\n \n // Add nodes\n nodes.add(source);\n nodes.add(target);\n \n // Add edge\n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n } else if (typeof tuple === 'object' && tuple !== null) {\n // Handle object-based results\n const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`);\n const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`);\n const label = tuple.label?.toString() || tuple.relation?.toString() || '';\n \n nodes.add(source);\n nodes.add(target);\n \n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n }\n });\n \n // If no edges were created, create a simple diagram showing the first few nodes\n if (edges.size === 0 && nodes.size > 0) {\n const nodeArray = Array.from(nodes).slice(0, 10); // Limit to avoid clutter\n nodeArray.forEach((node, index) => {\n if (index === 0) {\n mermaidContent += ` ${node}[${sanitizeLabel(node)}]\\n`;\n } else {\n mermaidContent += ` ${nodeArray[0]} --> ${node}\\n`;\n }\n });\n }\n \n mermaidContent += '```\\n\\n';\n \n // Add statistics\n mermaidContent += `## Query Statistics\\n\\n`;\n mermaidContent += `- Total nodes: ${nodes.size}\\n`;\n mermaidContent += `- Total edges: ${edges.size}\\n`;\n mermaidContent += `- Total tuples processed: ${tuples.length}\\n`;\n \n return mermaidContent;\n}\n\n/**\n * Sanitize node IDs for mermaid compatibility\n */\nfunction sanitizeNodeId(id: string): string {\n return id\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^(\\d)/, 'n$1') // Prefix with 'n' if starts with number\n .substring(0, 50); // Limit length\n}\n\n/**\n * Sanitize labels for mermaid compatibility\n */\nfunction sanitizeLabel(label: string): string {\n return label\n .replace(/[|\"`<>\\n\\r\\t]/g, '') // Remove problematic characters including backticks, newlines, angle brackets\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 30); // Limit length for readability\n}\n\n/**\n * Sanitize markdown content to prevent injection\n */\nfunction sanitizeMarkdown(content: string): string {\n return content\n .replace(/[<>\"`]/g, '') // Remove potentially dangerous characters\n .replace(/\\n/g, ' ') // Convert newlines to spaces\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 100); // Limit length\n}\n\n/**\n * Main evaluation function that determines which evaluator to use\n */\nexport async function evaluateQueryResults(\n bqrsPath: string,\n queryPath: string,\n evaluationFunction?: string,\n outputPath?: string\n): Promise {\n try {\n // If no evaluation function specified, default to json-decode\n const evalFunc = evaluationFunction || 'json-decode';\n \n logger.info(`Evaluating query results with function: ${evalFunc}`);\n \n // Handle built-in evaluation functions\n switch (evalFunc) {\n case 'json-decode':\n return await evaluateWithJsonDecoder(bqrsPath, outputPath);\n \n case 'csv-decode':\n return await evaluateWithCsvDecoder(bqrsPath, outputPath);\n \n case 'mermaid-graph':\n return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath);\n \n default:\n // Check if it's a path to a custom evaluation script\n if (isAbsolute(evalFunc)) {\n return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath);\n } else {\n return {\n success: false,\n error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(', ')}`\n };\n }\n }\n } catch (error) {\n return {\n success: false,\n error: `Query evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Execute custom evaluation script\n */\nasync function evaluateWithCustomScript(\n _bqrsPath: string,\n _queryPath: string,\n _scriptPath: string,\n _outputPath?: string\n): Promise {\n // TODO: Implement custom script execution\n // This would need to execute the script with bqrsPath and queryPath as arguments\n // and capture the output\n return {\n success: false,\n error: 'Custom evaluation scripts are not yet implemented'\n };\n}", "/**\n * Log directory management utilities for CodeQL query and test runs\n */\n\nimport { mkdirSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { randomBytes } from 'crypto';\nimport { getProjectTmpDir } from '../utils/temp-dir';\n\n/**\n * Ensure that a given path is within a base directory.\n * Throws an error if the path is outside the base directory.\n */\nfunction ensurePathWithinBase(baseDir: string, targetPath: string): string {\n const absBase = resolve(baseDir);\n const absTarget = resolve(targetPath);\n if (!absTarget.startsWith(absBase + '/') && absTarget !== absBase) {\n throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`);\n }\n return absTarget;\n}\n\n/**\n * Get or create a unique log directory for query/test runs\n * \n * @param logDir - Optional custom log directory from parameters\n * @returns Absolute path to the log directory\n */\nexport function getOrCreateLogDirectory(logDir?: string): string {\n // Use CODEQL_QUERY_LOG_DIR env var or default base\n const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir('query-logs');\n\n // If logDir is explicitly provided, validate it is within baseLogDir\n if (logDir) {\n const absLogDir = ensurePathWithinBase(baseLogDir, logDir);\n if (!existsSync(absLogDir)) {\n mkdirSync(absLogDir, { recursive: true });\n }\n return absLogDir;\n }\n \n // Otherwise, use baseLogDir and create a unique subdirectory\n \n // Create base directory if it doesn't exist\n if (!existsSync(baseLogDir)) {\n mkdirSync(baseLogDir, { recursive: true });\n }\n \n // Generate unique subdirectory with timestamp and random ID\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const uniqueId = randomBytes(4).toString('hex');\n const uniqueLogDir = join(baseLogDir, `query-run-${timestamp}-${uniqueId}`);\n \n mkdirSync(uniqueLogDir, { recursive: true });\n \n return uniqueLogDir;\n}\n", "/**\n * Secure project-local temporary directory utilities.\n *\n * All temporary files are created under `/.tmp/` which is\n * `.gitignore`d. This avoids writing to the OS temp directory\n * (`os.tmpdir()` / `/tmp`), which is world-readable and triggers\n * CWE-377 / CWE-378 (js/insecure-temporary-file).\n */\n\nimport { mkdirSync, mkdtempSync } from 'fs';\nimport { dirname, join, resolve } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Repository root, calculated once at module load.\n *\n * - From source (`server/src/utils/`) \u2192 3 levels up\n * - From bundle (`server/dist/`) \u2192 2 levels up\n */\nconst normalizedDir = __dirname.split(/[\\\\/]/).join('/');\nconst repoRoot: string = normalizedDir.includes('src/utils')\n ? resolve(__dirname, '..', '..', '..')\n : resolve(__dirname, '..', '..');\n\n/**\n * Base directory for all project-local temporary data.\n * Stored under `/.tmp` and excluded from version control.\n */\nconst PROJECT_TMP_BASE = join(repoRoot, '.tmp');\n\n/**\n * Return the project-local `.tmp` base directory, creating it if needed.\n */\nexport function getProjectTmpBase(): string {\n mkdirSync(PROJECT_TMP_BASE, { recursive: true });\n return PROJECT_TMP_BASE;\n}\n\n/**\n * Create a unique temporary directory under the project `.tmp` root.\n *\n * Works identically to `fs.mkdtempSync(os.tmpdir(), prefix)` but is\n * scoped to the repository.\n *\n * @param prefix - Directory name prefix (e.g. `'codeql-external-'`).\n * @returns Absolute path to the newly created directory.\n */\nexport function createProjectTempDir(prefix: string): string {\n const base = getProjectTmpBase();\n return mkdtempSync(join(base, prefix));\n}\n\n/**\n * Return a deterministic subdirectory under `.tmp/`, creating it\n * if it does not already exist.\n *\n * Useful for well-known scratch areas such as `query-logs` or `quickeval`.\n *\n * @param name - Subdirectory name (e.g. `'query-logs'`).\n * @returns Absolute path to the subdirectory.\n */\nexport function getProjectTmpDir(name: string): string {\n const dir = join(getProjectTmpBase(), name);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n", "/**\n * CodeQL BQRS info tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInfoTool: CLIToolDefinition = {\n name: 'codeql_bqrs_info',\n description: 'Get metadata and information about BQRS result files',\n command: 'codeql',\n subcommand: 'bqrs info',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to examine'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs info results.bqrs',\n 'codeql bqrs info --verbose results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * CodeQL BQRS interpret tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInterpretTool: CLIToolDefinition = {\n name: 'codeql_bqrs_interpret',\n description: 'Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)',\n command: 'codeql',\n subcommand: 'bqrs interpret',\n inputSchema: {\n file: z.string().describe('The BQRS file to interpret'),\n format: z.enum(['csv', 'sarif-latest', 'sarifv2.1.0', 'graphtext', 'dgml', 'dot'])\n .describe('Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)'),\n output: createCodeQLSchemas.output(),\n t: z.array(z.string())\n .describe('Query metadata key=value pairs. At least \"kind\" and \"id\" must be specified (e.g., [\"kind=graph\", \"id=js/print-ast\"])'),\n 'max-paths': z.number().optional()\n .describe('Maximum number of paths to produce for each alert with paths (default: 4)'),\n 'sarif-add-file-contents': z.boolean().optional()\n .describe('[SARIF only] Include full file contents for all files referenced in results'),\n 'sarif-add-snippets': z.boolean().optional()\n .describe('[SARIF only] Include code snippets for each location with context'),\n 'sarif-group-rules-by-pack': z.boolean().optional()\n .describe('[SARIF only] Place rule objects under their QL pack in tool.extensions property'),\n 'sarif-multicause-markdown': z.boolean().optional()\n .describe('[SARIF only] Include multi-cause alerts as Markdown-formatted lists'),\n 'sarif-category': z.string().optional()\n .describe('[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)'),\n 'csv-location-format': z.enum(['uri', 'line-column', 'offset-length']).optional()\n .describe('[CSV only] Format for locations in CSV output (default: line-column)'),\n 'dot-location-url-format': z.string().optional()\n .describe('[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})'),\n threads: z.number().optional()\n .describe('Number of threads for computing paths (0 = one per core, -N = leave N cores unused)'),\n 'column-kind': z.enum(['utf8', 'utf16', 'utf32', 'bytes']).optional()\n .describe('[SARIF only] Column kind for interpreting location columns'),\n 'unicode-new-lines': z.boolean().optional()\n .describe('[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs',\n 'codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs',\n 'codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs',\n 'codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs',\n 'codeql bqrs interpret --format=sarif-latest --sarif-add-snippets --sarif-category=security --output=results.sarif -t kind=path-problem -t id=go/path-injection results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};\n", "/**\n * CodeQL database analyze tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseAnalyzeTool: CLIToolDefinition = {\n name: 'codeql_database_analyze',\n description: 'Run queries or query suites against CodeQL databases',\n command: 'codeql',\n subcommand: 'database analyze',\n inputSchema: {\n database: z.string().describe('Path to the CodeQL database'),\n queries: z.string().describe('Queries or query suite to run'),\n output: z.string().optional().describe('Output file path'),\n format: z.enum(['csv', 'json', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n 'download-location': z.string().optional()\n .describe('Location to download missing dependencies'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n timeout: z.number().optional().describe('Timeout in seconds'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif',\n 'codeql database analyze mydb codeql/java-queries --format=csv'\n ]\n};", "/**\n * CodeQL database create tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createDatabaseResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseCreateTool: CLIToolDefinition = {\n name: 'codeql_database_create',\n description: 'Create a CodeQL database from source code',\n command: 'codeql',\n subcommand: 'database create',\n inputSchema: {\n database: z.string().describe('Database path/name to create'),\n language: z.string().optional().describe('Programming language(s) to extract'),\n 'source-root': z.string().optional().describe('Root directory of source code'),\n command: z.string().optional().describe('Build command for compiled languages'),\n 'build-mode': z.enum(['none', 'autobuild', 'manual']).optional()\n .describe('Build mode: none (interpreted langs), autobuild, or manual'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n overwrite: z.boolean().optional().describe('Overwrite existing database if it exists'),\n 'no-cleanup': z.boolean().optional().describe('Skip database cleanup after finalization'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database create --language=java --source-root=/path/to/project mydb',\n 'codeql database create --language=cpp --command=\"make all\" mydb',\n 'codeql database create --language=python,javascript mydb'\n ],\n resultProcessor: createDatabaseResultProcessor()\n};", "/**\n * CodeQL find class position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface ClassPosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a class name identifier in a QL file.\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findClassPosition(filepath: string, className: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Match class definition with the specific class name\n const classNameRegex = new RegExp(`\\\\bclass\\\\s+(${className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})\\\\b`);\n const match = classNameRegex.exec(line);\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The class name is in capture group 1\n const classNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = classNameStart + 1; // 1-based column numbering\n const end_col = start_col + className.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Class name '${className}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find class position tool with the MCP server\n */\nexport function registerFindClassPositionTool(server: McpServer): void {\n server.tool(\n 'find_class_position',\n 'Finds startline, startcol, endline endcol of a class for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the class to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findClassPosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding class position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find predicate position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface PredicatePosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a predicate name in a QL file.\n * Supports: \n * - predicate name(...) - predicates with no return type\n * - Type name(...) - predicates with return type (e.g., string foo())\n * - name(...) (inside class) - member predicates\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findPredicatePosition(filepath: string, predicateName: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n const escapedName = predicateName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Match predicate definition with the specific predicate name\n // Pattern 1: predicate name(...)\n const predicateKeywordRegex = new RegExp(`\\\\bpredicate\\\\s+(${escapedName})\\\\s*\\\\(`);\n let match = predicateKeywordRegex.exec(line);\n \n // Pattern 2: Type name(...) - predicates with return type\n // Matches: string foo(), int bar(), MyClass baz(), etc.\n // Must start at beginning of line (with optional whitespace) or after certain keywords\n if (!match) {\n const returnTypeRegex = new RegExp(`(?:^|\\\\s)(?:abstract\\\\s+)?(?:cached\\\\s+)?(?:private\\\\s+)?(?:deprecated\\\\s+)?(?:\\\\w+)\\\\s+(${escapedName})\\\\s*\\\\(`);\n match = returnTypeRegex.exec(line);\n }\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The predicate name is in capture group 1\n const predicateNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = predicateNameStart + 1; // 1-based column numbering\n const end_col = start_col + predicateName.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find predicate position tool with the MCP server\n */\nexport function registerFindPredicatePositionTool(server: McpServer): void {\n server.tool(\n 'find_predicate_position',\n 'Finds startline, startcol, endline endcol of a predicate for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the predicate to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findPredicatePosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding predicate position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find query files tool\n * Discovers and tracks all files related to a CodeQL query\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { findCodeQLQueryFiles } from '../../lib/query-file-finder';\nimport { logger } from '../../utils/logger';\n\n/**\n * Register the find_codeql_query_files tool\n */\nexport function registerFindCodeQLQueryFilesTool(server: McpServer): void {\n server.tool(\n 'find_codeql_query_files',\n 'Find and track all files and directories related to a CodeQL query, including resolved metadata',\n {\n queryPath: z.string().describe('Path to the CodeQL query file (.ql)'),\n language: z.string().optional().describe('Programming language (optional, will be inferred if not provided)'),\n resolveMetadata: z.boolean().optional().describe('Whether to resolve query metadata (default: true)')\n },\n async ({ queryPath, language, resolveMetadata }) => {\n try {\n const result = await findCodeQLQueryFiles(\n queryPath,\n language,\n resolveMetadata !== false // Default to true if not specified\n );\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]\n };\n } catch (error) {\n logger.error('Error finding CodeQL query files:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }\n ],\n isError: true\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query file finder utilities\n * Handles discovery and tracking of query-related files and directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { QueryFileInfo, QueryFilesResult } from '../types/codeql';\nimport { resolveQueryMetadata } from './metadata-resolver';\n\n// Supported CodeQL languages and their file extensions (alphabetically ordered)\nconst LANGUAGE_EXTENSIONS: Record = {\n actions: 'yml',\n cpp: 'cpp',\n csharp: 'cs',\n go: 'go',\n java: 'java',\n javascript: 'js',\n python: 'py',\n ruby: 'rb',\n swift: 'swift',\n typescript: 'ts'\n};\n\nconst KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS);\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n return LANGUAGE_EXTENSIONS[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Infer the language from the query file's directory structure\n */\nfunction inferLanguageFromPath(queryPath: string): string {\n const parts = queryPath.split(path.sep);\n\n for (const part of parts) {\n if (KNOWN_LANGUAGES.includes(part.toLowerCase())) {\n return part.toLowerCase();\n }\n }\n\n // Default fallback\n return 'unknown';\n}\n\n/**\n * Find the nearest qlpack.yml or codeql-pack.yml file by walking up the directory tree\n */\nfunction findNearestQlpack(startPath: string): string | null {\n let currentPath = startPath;\n const root = path.parse(currentPath).root;\n\n while (currentPath !== root) {\n // Check for codeql-pack.yml first (newer format), then qlpack.yml\n for (const packFile of ['codeql-pack.yml', 'qlpack.yml']) {\n const packPath = path.join(currentPath, packFile);\n if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) {\n return packPath;\n }\n }\n currentPath = path.dirname(currentPath);\n }\n\n return null;\n}\n\n/**\n * Read and parse qlpack.yml file\n */\nfunction readQlpackMetadata(qlpackPath: string): Record | null {\n try {\n const content = fs.readFileSync(qlpackPath, 'utf-8');\n const parsed = yaml.load(content) as Record;\n return parsed;\n } catch (_error) {\n // If we can't parse it, return null rather than failing\n return null;\n }\n}\n\n/**\n * Check if a file exists and return QueryFileInfo\n */\nfunction checkFile(filePath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n return {\n exists,\n path: filePath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: filePath // Return the path even on error\n };\n }\n}\n\n/**\n * Check if a directory exists and return QueryFileInfo\n */\nfunction checkDirectory(dirPath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n return {\n exists,\n path: dirPath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: dirPath // Return the path even on error\n };\n }\n}\n\n/**\n * Find all test code files in the test directory\n */\nfunction findTestCodeFiles(testDir: string, queryName: string, language: string): string[] {\n if (!fs.existsSync(testDir)) {\n return [];\n }\n\n try {\n const files = fs.readdirSync(testDir);\n const languageExt = getLanguageExtension(language);\n const testFiles: string[] = [];\n\n // Look for files matching the query name or other test code files\n const allValidExtensions = [...new Set([...Object.values(LANGUAGE_EXTENSIONS), 'yaml'])]; // Include yaml as alias for yml\n\n for (const file of files) {\n const filePath = path.join(testDir, file);\n const stat = fs.statSync(filePath);\n\n if (stat.isFile()) {\n // Include the primary test file matching query name\n if (file === `${queryName}.${languageExt}`) {\n testFiles.push(filePath);\n }\n // Include other code files (but not .qlref, .expected, .actual files)\n else if (!file.endsWith('.qlref') && !file.endsWith('.expected') && !file.endsWith('.actual')) {\n const ext = path.extname(file).slice(1);\n if (ext === languageExt || allValidExtensions.includes(ext)) {\n testFiles.push(filePath);\n }\n }\n }\n }\n\n return testFiles;\n } catch {\n return [];\n }\n}\n\n/**\n * Find CodeQL query files and directories based on a query file path\n * Optionally resolves metadata if the query file exists\n */\nexport async function findCodeQLQueryFiles(\n queryFilePath: string,\n language?: string,\n resolveMetadata: boolean = true\n): Promise {\n // Resolve absolute path\n const absoluteQueryPath = path.resolve(queryFilePath);\n\n // Extract query name and directory\n const queryName = path.basename(absoluteQueryPath, '.ql');\n const queryDir = path.dirname(absoluteQueryPath);\n\n // Infer language if not provided\n const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath);\n\n // Check query file itself\n const queryPath = checkFile(absoluteQueryPath);\n const queryDirectory = checkDirectory(queryDir);\n\n // Check for documentation files\n const mdPath = path.join(queryDir, `${queryName}.md`);\n const qhelpPath = path.join(queryDir, `${queryName}.qhelp`);\n const mdInfo = checkFile(mdPath);\n const qhelpInfo = checkFile(qhelpPath);\n\n const documentationPath: QueryFileInfo = mdInfo.exists ? mdInfo : (qhelpInfo.exists ? qhelpInfo : {\n exists: false,\n path: mdPath // Suggest .md as the default\n });\n\n // Check for specification file\n const qspecPath = path.join(queryDir, `${queryName}.qspec`);\n const specificationPath = checkFile(qspecPath);\n\n // Determine test directory\n // Pattern: if query is in .../src/QueryName/, test should be in .../test/QueryName/\n let testDir: string;\n if (queryDir.includes(`${path.sep}src${path.sep}`)) {\n // Find the last occurrence of /src/ and replace it with /test/\n const parts = queryDir.split(path.sep);\n const srcIndex = parts.lastIndexOf('src');\n if (srcIndex !== -1) {\n parts[srcIndex] = 'test';\n testDir = parts.join(path.sep);\n } else {\n // Fallback in case split didn't find it\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n } else {\n // Fallback: if not in src directory, construct test dir based on parent\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n const testDirectory = checkDirectory(testDir);\n\n // Check for .qlref file\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const qlrefInfo = checkFile(qlrefPath);\n\n // Find test code files\n const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage);\n\n // Check for expected results\n const expectedPath = path.join(testDir, `${queryName}.expected`);\n const expectedResultsPath = checkFile(expectedPath);\n\n // Check for actual results\n const actualPath = path.join(testDir, `${queryName}.actual`);\n const actualResultsPath = checkFile(actualPath);\n\n // Check for test database\n const testprojPath = path.join(testDir, `${queryName}.testproj`);\n const testDatabasePath = checkDirectory(testprojPath);\n\n // Determine missing files\n const missingFiles: string[] = [];\n if (!queryPath.exists) missingFiles.push(queryPath.path);\n if (!documentationPath.exists) missingFiles.push(documentationPath.path);\n if (!specificationPath.exists) missingFiles.push(specificationPath.path);\n if (!testDirectory.exists) missingFiles.push(testDirectory.path);\n if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path);\n if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`));\n if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path);\n\n const allFilesExist = missingFiles.length === 0;\n\n // Resolve metadata if requested and query file exists\n let metadata: { [key: string]: string | string[] } | undefined;\n if (resolveMetadata && queryPath.exists) {\n const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath);\n if (resolvedMetadata) {\n metadata = resolvedMetadata;\n }\n }\n\n // Resolve pack metadata and directories by finding the nearest qlpack.yml files\n let packMetadata: Record | undefined;\n const queryPackPath = findNearestQlpack(queryDir);\n const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir;\n if (queryPackPath) {\n const parsed = readQlpackMetadata(queryPackPath);\n if (parsed) {\n packMetadata = parsed;\n }\n }\n\n // Find pack directory for test files\n const testPackPath = findNearestQlpack(testDir);\n const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir;\n\n return {\n queryName,\n language: detectedLanguage,\n\n allFilesExist,\n\n files: {\n query: {\n dir: queryDirectory.path,\n doc: path.basename(documentationPath.path),\n packDir: queryPackDir,\n query: path.basename(queryPath.path),\n spec: path.basename(specificationPath.path)\n },\n test: {\n actual: path.basename(actualResultsPath.path),\n dir: testDirectory.path,\n expected: path.basename(expectedResultsPath.path),\n packDir: testPackDir,\n qlref: path.basename(qlrefInfo.path),\n testCode: testCodePaths,\n testDatabaseDir: testDatabasePath.path\n }\n },\n\n metadata,\n\n missingFiles,\n\n packMetadata,\n\n status: {\n actualResultsExist: actualResultsPath.exists,\n documentationExists: documentationPath.exists,\n expectedResultsExist: expectedResultsPath.exists,\n hasTestCode: testCodePaths.length > 0,\n qlrefExists: qlrefInfo.exists,\n queryExists: queryPath.exists,\n specificationExists: specificationPath.exists,\n testDatabaseDirExists: testDatabasePath.exists,\n testDirectoryExists: testDirectory.exists\n }\n };\n}\n", "\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n", "/**\n * CodeQL metadata resolver utilities\n * Handles resolution of query metadata using the CodeQL CLI\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * Query metadata structure returned by codeql resolve metadata\n */\nexport interface QueryMetadata {\n [key: string]: string | string[];\n}\n\n/**\n * Resolve metadata for a CodeQL query file\n * @param queryPath - Absolute or relative path to the .ql query file\n * @returns Parsed metadata object or null if resolution fails\n */\nexport async function resolveQueryMetadata(queryPath: string): Promise {\n try {\n logger.info(`Resolving metadata for query: ${queryPath}`);\n\n const result = await executeCodeQLCommand(\n 'resolve metadata',\n { format: 'json' },\n [queryPath]\n );\n\n if (!result.success) {\n logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error);\n return null;\n }\n\n // Parse the JSON output\n try {\n const metadata = JSON.parse(result.stdout);\n return metadata;\n } catch (parseError) {\n logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError);\n return null;\n }\n } catch (error) {\n logger.error(`Error resolving metadata for ${queryPath}:`, error);\n return null;\n }\n}\n", "/**\n * CodeQL generate log-summary tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateLogSummaryTool: CLIToolDefinition = {\n name: 'codeql_generate_log-summary',\n description: 'Create a summary of a structured JSON evaluator event log file',\n command: 'codeql',\n subcommand: 'generate log-summary',\n inputSchema: {\n inputLog: z.string().describe('Path to the evaluator log file to summarize'),\n outputFile: z.string().optional().describe('Path to write the summary (optional, defaults to stdout)'),\n format: z.enum(['text', 'predicates', 'overall']).optional()\n .describe('Output format: text (human-readable), predicates (JSON), or overall (stats)'),\n 'minify-output': z.boolean().optional().describe('Minify JSON output'),\n utc: z.boolean().optional().describe('Force UTC timestamps'),\n 'deduplicate-stage-summaries': z.boolean().optional().describe('Deduplicate stage summaries'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt',\n 'codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt',\n 'codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL generate query-help tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateQueryHelpTool: CLIToolDefinition = {\n name: 'codeql_generate_query-help',\n description: 'Generate query help documentation from QLDoc comments',\n command: 'codeql',\n subcommand: 'generate query-help',\n inputSchema: {\n query: z.string().describe('Path to the query file to generate help for'),\n outputFile: z.string().optional().describe('Path to write the help documentation'),\n format: z.enum(['markdown', 'text', 'html']).optional()\n .describe('Output format for the help documentation'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate query-help -- MyQuery.ql',\n 'codeql generate query-help --format=markdown -- MyQuery.ql help.md',\n 'codeql generate query-help --format=html -- MyQuery.ql help.html'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL Language Server Eval tool for MCP server\n * Provides real-time QL code validation through LSP communication\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { CodeQLLanguageServer, Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\n// Global language server instance for reuse across evaluations\nlet globalLanguageServer: CodeQLLanguageServer | null = null;\n\nexport interface LanguageServerEvalParams {\n qlCode: string;\n workspaceUri?: string;\n serverOptions?: LanguageServerOptions;\n}\n\nexport interface LanguageServerEvalResult {\n isValid: boolean;\n diagnostics: Diagnostic[];\n summary: {\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n };\n formattedOutput: string;\n}\n\n/**\n * Format diagnostics for human-readable output\n */\nfunction formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '\u2705 No issues found in QL code';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${diagnostics.length} issue(s):\\n`);\n\n diagnostics.forEach((diagnostic, index) => {\n const severityIcon = getSeverityIcon(diagnostic.severity);\n const severityName = getSeverityName(diagnostic.severity);\n const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`;\n \n lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`);\n lines.push(` ${diagnostic.message}`);\n if (diagnostic.source) {\n lines.push(` Source: ${diagnostic.source}`);\n }\n if (diagnostic.code) {\n lines.push(` Code: ${diagnostic.code}`);\n }\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n\nfunction getSeverityIcon(severity: number): string {\n switch (severity) {\n case 1: return '\u274C'; // Error\n case 2: return '\u26A0\uFE0F'; // Warning\n case 3: return '\u2139\uFE0F'; // Information\n case 4: return '\uD83D\uDCA1'; // Hint\n default: return '\u2753';\n }\n}\n\nfunction getSeverityName(severity: number): string {\n switch (severity) {\n case 1: return 'Error';\n case 2: return 'Warning';\n case 3: return 'Information';\n case 4: return 'Hint';\n default: return 'Unknown';\n }\n}\n\n/**\n * Initialize or get existing language server instance\n */\nasync function getLanguageServer(options: LanguageServerOptions = {}): Promise {\n if (globalLanguageServer && globalLanguageServer.isRunning()) {\n return globalLanguageServer;\n }\n\n // Set default options\n const defaultOptions: LanguageServerOptions = {\n searchPath: resolve(process.cwd(), 'ql'),\n loglevel: 'WARN',\n ...options\n };\n\n globalLanguageServer = new CodeQLLanguageServer(defaultOptions);\n \n try {\n await globalLanguageServer.start();\n \n // Use provided workspace URI or default to ql directory\n const workspaceUri = pathToFileURL(resolve(process.cwd(), 'ql')).href;\n await globalLanguageServer.initialize(workspaceUri);\n \n logger.info('CodeQL Language Server started and initialized successfully');\n return globalLanguageServer;\n } catch (error) {\n logger.error('Failed to start language server:', error);\n globalLanguageServer = null;\n throw error;\n }\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server\n */\nexport async function evaluateQLCode({\n qlCode,\n workspaceUri: _workspaceUri,\n serverOptions = {}\n}: LanguageServerEvalParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n \n const languageServer = await getLanguageServer(serverOptions);\n \n // Generate unique URI for this evaluation\n const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href;\n \n const diagnostics = await languageServer.evaluateQL(qlCode, evalUri);\n \n // Count diagnostics by severity\n const summary = {\n errorCount: diagnostics.filter(d => d.severity === 1).length,\n warningCount: diagnostics.filter(d => d.severity === 2).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n hintCount: diagnostics.filter(d => d.severity === 4).length\n };\n \n const isValid = summary.errorCount === 0;\n const formattedOutput = formatDiagnostics(diagnostics);\n \n logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`);\n \n return {\n isValid,\n diagnostics,\n summary,\n formattedOutput\n };\n \n } catch (error) {\n logger.error('Error evaluating QL code:', error);\n throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Shutdown the global language server\n */\nexport async function shutdownLanguageServer(): Promise {\n if (globalLanguageServer) {\n logger.info('Shutting down CodeQL Language Server...');\n await globalLanguageServer.shutdown();\n globalLanguageServer = null;\n }\n}\n\n/**\n * Register the language server eval tool with the MCP server\n */\nexport function registerLanguageServerEvalTool(server: McpServer): void {\n server.tool(\n 'codeql_language_server_eval',\n 'Authoritative syntax and semantic validation of CodeQL (QL) code via the CodeQL Language Server. Compiles the query and provides real-time diagnostics with precise error locations. Use this for accurate validation; for quick heuristic checks without compilation, use validate_codeql_query instead.',\n {\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level')\n },\n async ({ ql_code, workspace_uri, search_path, log_level }) => {\n try {\n const serverOptions: LanguageServerOptions = {};\n \n if (search_path) {\n serverOptions.searchPath = search_path;\n }\n if (log_level) {\n serverOptions.loglevel = log_level;\n }\n \n const result = await evaluateQLCode({\n qlCode: ql_code,\n workspaceUri: workspace_uri,\n serverOptions\n });\n \n // Return structured result\n const responseContent = {\n isValid: result.isValid,\n summary: result.summary,\n formattedOutput: result.formattedOutput,\n diagnostics: result.diagnostics.map(d => ({\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n severity: getSeverityName(d.severity),\n message: d.message,\n code: d.code,\n source: d.source\n }))\n };\n \n return {\n content: [\n { \n type: 'text', \n text: JSON.stringify(responseContent, null, 2) \n }\n ],\n };\n \n } catch (error) {\n logger.error('Error in language server eval tool:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n \n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownLanguageServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownLanguageServer();\n });\n}", "/**\n * CodeQL Language Server manager for LSP communication\n * Manages the lifecycle and communication with the CodeQL language server process\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { setTimeout, clearTimeout } from 'timers';\nimport { pathToFileURL } from 'url';\nimport { join } from 'path';\nimport { logger } from '../utils/logger';\nimport { getProjectTmpDir } from '../utils/temp-dir';\n\nexport interface LSPMessage {\n jsonrpc: '2.0';\n id?: number | string;\n method: string;\n params?: unknown;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport interface Diagnostic {\n range: {\n start: { line: number; character: number };\n end: { line: number; character: number };\n };\n severity: number; // 1=Error, 2=Warning, 3=Information, 4=Hint\n source?: string;\n message: string;\n code?: string | number;\n}\n\nexport interface PublishDiagnosticsParams {\n uri: string;\n diagnostics: Diagnostic[];\n}\n\nexport interface LanguageServerOptions {\n searchPath?: string;\n logdir?: string;\n loglevel?: 'OFF' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'ALL';\n synchronous?: boolean;\n verbosity?: 'errors' | 'warnings' | 'progress' | 'progress+' | 'progress++' | 'progress+++';\n}\n\nexport class CodeQLLanguageServer extends EventEmitter {\n private server: ChildProcess | null = null;\n private messageId = 1;\n private pendingResponses = new Map void; reject: (_error: Error) => void }>();\n private isInitialized = false;\n private messageBuffer = '';\n\n constructor(private _options: LanguageServerOptions = {}) {\n super();\n }\n\n async start(): Promise {\n if (this.server) {\n throw new Error('Language server is already running');\n }\n\n logger.info('Starting CodeQL Language Server...');\n\n const args = [\n 'execute', 'language-server',\n '--check-errors=ON_CHANGE'\n ];\n\n // Add optional arguments\n if (this._options.searchPath) {\n args.push(`--search-path=${this._options.searchPath}`);\n }\n if (this._options.logdir) {\n args.push(`--logdir=${this._options.logdir}`);\n }\n if (this._options.loglevel) {\n args.push(`--loglevel=${this._options.loglevel}`);\n }\n if (this._options.synchronous) {\n args.push('--synchronous');\n }\n if (this._options.verbosity) {\n args.push(`--verbosity=${this._options.verbosity}`);\n }\n\n this.server = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe']\n });\n\n this.server.stderr?.on('data', (data) => {\n logger.debug('CodeQL LS stderr:', data.toString());\n });\n\n this.server.stdout?.on('data', (data) => {\n this.handleStdout(data);\n });\n\n this.server.on('error', (error) => {\n logger.error('CodeQL Language Server error:', error);\n this.emit('error', error);\n });\n\n this.server.on('exit', (code) => {\n logger.info('CodeQL Language Server exited with code:', code);\n this.server = null;\n this.isInitialized = false;\n this.emit('exit', code);\n });\n\n // Wait for server to be ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n private handleStdout(data: Buffer): void {\n this.messageBuffer += data.toString();\n \n let headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n while (headerEnd !== -1) {\n const header = this.messageBuffer.substring(0, headerEnd);\n const contentLengthMatch = header.match(/Content-Length: (\\d+)/);\n \n if (contentLengthMatch) {\n const contentLength = parseInt(contentLengthMatch[1]);\n const messageStart = headerEnd + 4;\n const messageEnd = messageStart + contentLength;\n \n if (this.messageBuffer.length >= messageEnd) {\n const messageContent = this.messageBuffer.substring(messageStart, messageEnd);\n this.messageBuffer = this.messageBuffer.substring(messageEnd);\n \n try {\n const message: LSPMessage = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse LSP message:', error, messageContent);\n }\n \n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid LSP header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: LSPMessage): void {\n logger.debug('Received LSP message:', message);\n\n // Handle responses to our requests\n if (message.id !== undefined && this.pendingResponses.has(Number(message.id))) {\n const pending = this.pendingResponses.get(Number(message.id))!;\n this.pendingResponses.delete(Number(message.id));\n \n if (message.error) {\n pending.reject(new Error(`LSP Error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications from server\n if (message.method === 'textDocument/publishDiagnostics') {\n this.emit('diagnostics', message.params as PublishDiagnosticsParams);\n }\n }\n\n private sendMessage(message: LSPMessage): void {\n if (!this.server?.stdin) {\n throw new Error('Language server is not running');\n }\n\n const messageStr = JSON.stringify(message);\n const contentLength = Buffer.byteLength(messageStr, 'utf8');\n const header = `Content-Length: ${contentLength}\\r\\n\\r\\n`;\n const fullMessage = header + messageStr;\n\n logger.debug('Sending LSP message:', fullMessage);\n this.server.stdin.write(fullMessage);\n }\n\n private sendRequest(method: string, params?: unknown): Promise {\n const id = this.messageId++;\n const message: LSPMessage = {\n jsonrpc: '2.0',\n id,\n method,\n params\n };\n\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n this.sendMessage(message);\n \n // Add timeout\n setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 10000); // 10 second timeout\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n const message: LSPMessage = {\n jsonrpc: '2.0',\n method,\n params\n };\n this.sendMessage(message);\n }\n\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n return;\n }\n\n logger.info('Initializing CodeQL Language Server...');\n\n const initParams = {\n processId: process.pid,\n clientInfo: {\n name: 'codeql-mcp-server',\n version: '1.0.0'\n },\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n didClose: true\n },\n publishDiagnostics: {}\n }\n }\n };\n\n if (workspaceUri) {\n (initParams as unknown as { workspaceFolders: unknown[] }).workspaceFolders = [{\n uri: workspaceUri,\n name: 'codeql-workspace'\n }];\n }\n\n await this.sendRequest('initialize', initParams);\n this.sendNotification('initialized', {});\n \n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n async evaluateQL(qlCode: string, uri?: string): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n\n // Default to a project-local virtual URI rather than /tmp\n const documentUri = uri || pathToFileURL(join(getProjectTmpDir('lsp-eval'), 'eval.ql')).href;\n\n return new Promise((resolve, reject) => {\n let diagnosticsReceived = false;\n const timeout = setTimeout(() => {\n if (!diagnosticsReceived) {\n this.removeAllListeners('diagnostics');\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 5000);\n\n // Listen for diagnostics\n const diagnosticsHandler = (params: PublishDiagnosticsParams) => {\n if (params.uri === documentUri) {\n diagnosticsReceived = true;\n clearTimeout(timeout);\n this.removeListener('diagnostics', diagnosticsHandler);\n\n // Close the document\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri: documentUri }\n });\n\n resolve(params.diagnostics);\n }\n };\n\n this.on('diagnostics', diagnosticsHandler);\n\n // Open the document with the QL code\n this.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri: documentUri,\n languageId: 'ql',\n version: 1,\n text: qlCode\n }\n });\n });\n }\n\n async shutdown(): Promise {\n if (!this.server) {\n return;\n }\n\n logger.info('Shutting down CodeQL Language Server...');\n\n try {\n await this.sendRequest('shutdown', {});\n this.sendNotification('exit', {});\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n }, 1000);\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL pack install tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackInstallTool: CLIToolDefinition = {\n name: 'codeql_pack_install',\n description: 'Install CodeQL pack dependencies',\n command: 'codeql',\n subcommand: 'pack install',\n inputSchema: {\n packDir: z.string().optional().describe('Directory containing qlpack.yml (default: current)'),\n force: z.boolean().optional().describe('Force reinstall of dependencies'),\n 'no-strict-mode': z.boolean().optional()\n .describe('Allow non-strict dependency resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack install',\n 'codeql pack install --force /path/to/pack',\n 'codeql pack install --no-strict-mode'\n ]\n};", "/**\n * CodeQL pack ls tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackLsTool: CLIToolDefinition = {\n name: 'codeql_pack_ls',\n description: 'List CodeQL packs under some local directory path',\n command: 'codeql',\n subcommand: 'pack ls',\n inputSchema: {\n dir: z.string().optional().describe('The root directory of the package or workspace, defaults to the current working directory'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format: text (default) or json'),\n groups: z.string().optional()\n .describe('List of CodeQL pack groups to include or exclude'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack ls -- .',\n 'codeql pack ls --format=json -- /path/to/pack-directory',\n 'codeql pack ls --format=json --groups=queries,tests -- .'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL query profiling tool\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand } from '../../lib/cli-executor';\nimport { logger } from '../../utils/logger';\nimport { writeFileSync, readFileSync, existsSync } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { mkdirSync } from 'fs';\n\ninterface EvaluatorLogEvent {\n time: string;\n type: string;\n eventId: number;\n nanoTime: number;\n [key: string]: unknown;\n}\n\ninterface PipelineNode {\n eventId: number;\n name: string;\n position?: string;\n type?: string;\n startTime: number;\n endTime: number;\n duration: number;\n resultSize?: number;\n tupleCount?: number;\n dependencies: string[];\n dependencyEventIds: number[];\n}\n\ninterface ProfileData {\n queryName: string;\n totalDuration: number;\n totalEvents: number;\n pipelines: PipelineNode[];\n}\n\n/**\n * Parse evaluator log and create profile data\n */\nfunction parseEvaluatorLog(logPath: string): ProfileData {\n const logContent = readFileSync(logPath, 'utf-8');\n \n // Split by empty lines to get each JSON object (handles both JSONL and pretty-printed JSON)\n const jsonObjects = logContent.split('\\n\\n').filter((s) => s.trim());\n const events: EvaluatorLogEvent[] = jsonObjects\n .map((obj) => {\n try {\n return JSON.parse(obj);\n } catch (_error) {\n logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`);\n return null;\n }\n })\n .filter((event): event is EvaluatorLogEvent => event !== null);\n\n // Map to track pipeline nodes by their start event ID\n const pipelineMap = new Map>();\n // Map to track dependency event IDs by predicate name\n const predicateNameToEventId = new Map();\n \n let queryName = '';\n let queryStartTime = 0;\n let queryEndTime = 0;\n\n for (const event of events) {\n switch (event.type) {\n case 'QUERY_STARTED':\n queryName = (event.queryName as string) || '';\n queryStartTime = event.nanoTime;\n break;\n\n case 'QUERY_COMPLETED':\n queryEndTime = event.nanoTime;\n break;\n\n case 'PREDICATE_STARTED': {\n const predicateName = event.predicateName as string;\n const position = event.position as string | undefined;\n const predicateType = event.predicateType as string | undefined;\n const dependencies = event.dependencies as Record | undefined;\n \n // Track this predicate's event ID by name for dependency resolution\n predicateNameToEventId.set(predicateName, event.eventId);\n \n // Get dependency event IDs\n const dependencyEventIds: number[] = [];\n const dependencyNames: string[] = [];\n if (dependencies) {\n for (const depName of Object.keys(dependencies)) {\n dependencyNames.push(depName);\n const depEventId = predicateNameToEventId.get(depName);\n if (depEventId !== undefined) {\n dependencyEventIds.push(depEventId);\n }\n }\n }\n\n pipelineMap.set(event.eventId, {\n eventId: event.eventId,\n name: predicateName,\n position,\n type: predicateType,\n startTime: event.nanoTime,\n dependencies: dependencyNames,\n dependencyEventIds,\n });\n break;\n }\n\n case 'PREDICATE_COMPLETED': {\n const startEventId = event.startEvent as number;\n const pipelineInfo = pipelineMap.get(startEventId);\n if (pipelineInfo) {\n const startEvent = events.find((e) => e.eventId === startEventId);\n if (startEvent) {\n const duration = (event.nanoTime - startEvent.nanoTime) / 1_000_000; // Convert to ms\n pipelineInfo.endTime = event.nanoTime;\n pipelineInfo.duration = duration;\n pipelineInfo.resultSize = event.resultSize as number | undefined;\n pipelineInfo.tupleCount = event.tupleCount as number | undefined;\n }\n }\n break;\n }\n }\n }\n\n // Convert to array and maintain original evaluation order (by eventId)\n const pipelines: PipelineNode[] = Array.from(pipelineMap.values())\n .filter((p): p is PipelineNode => p.duration !== undefined)\n .sort((a, b) => a.eventId - b.eventId);\n\n const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1_000_000 : 0;\n\n return {\n queryName,\n totalDuration,\n totalEvents: events.length,\n pipelines,\n };\n}\n\n/**\n * Format profile data as JSON\n */\nfunction formatAsJson(profile: ProfileData): string {\n return JSON.stringify(profile, null, 2);\n}\n\n/**\n * Format profile data as Mermaid diagram\n * Creates a graph showing the query evaluation pipelines in order of execution\n * with dependencies as edges, annotated with duration and result sizes\n */\nfunction formatAsMermaid(profile: ProfileData): string {\n const lines: string[] = [];\n\n lines.push('```mermaid');\n lines.push('graph TD');\n lines.push('');\n \n // Add query root node\n lines.push(` QUERY[\"${basename(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms\"]`);\n lines.push('');\n \n // Create nodes for each pipeline in evaluation order (already sorted by eventId)\n profile.pipelines.forEach((pipeline) => {\n const nodeId = `P${pipeline.eventId}`;\n const duration = pipeline.duration.toFixed(2);\n const resultSize = pipeline.resultSize !== undefined ? pipeline.resultSize : '?';\n // Sanitize predicate name for Mermaid\n const name = pipeline.name.replace(/[<>]/g, '').substring(0, 40);\n lines.push(` ${nodeId}[\"${name}
${duration}ms | ${resultSize} results\"]`);\n });\n \n lines.push('');\n \n // Add edges from QUERY to root pipelines (those with no dependencies)\n const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0);\n \n rootPipelines.forEach((pipeline) => {\n lines.push(` QUERY --> P${pipeline.eventId}`);\n });\n \n lines.push('');\n \n // Add edges between pipelines based on dependencies (using eventIds to preserve links)\n profile.pipelines.forEach((pipeline) => {\n pipeline.dependencyEventIds.forEach((depEventId) => {\n const duration = pipeline.duration.toFixed(2);\n lines.push(` P${depEventId} -->|\"${duration}ms\"| P${pipeline.eventId}`);\n });\n });\n \n lines.push('');\n lines.push(' classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px');\n lines.push(' classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px');\n lines.push(' class QUERY query');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Register the profile_codeql_query tool\n */\nexport function registerProfileCodeQLQueryTool(server: McpServer): void {\n server.tool(\n 'profile_codeql_query',\n 'Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file',\n {\n query: z.string().describe('Path to the .ql query file'),\n database: z.string().describe('Path to the CodeQL database directory'),\n evaluatorLog: z\n .string()\n .optional()\n .describe(\n 'Path to an existing structured JSON log (e.g., evaluator-log.jsonl) file. If not provided, the tool will run the query to generate one.'\n ),\n outputDir: z\n .string()\n .optional()\n .describe('Directory to write profiling data files (defaults to same directory as evaluator log)'),\n },\n async (params) => {\n try {\n const { query, database, evaluatorLog, outputDir } = params;\n let logPath = evaluatorLog;\n let bqrsPath: string | undefined;\n let sarifPath: string | undefined;\n\n // If evaluator log not provided, run the query to generate one\n if (!logPath) {\n logger.info('No evaluator log provided, running query to generate one');\n\n // Determine output directory\n const defaultOutputDir = outputDir || join(dirname(query as string), 'profile-output');\n mkdirSync(defaultOutputDir, { recursive: true });\n\n logPath = join(defaultOutputDir, 'evaluator-log.jsonl');\n bqrsPath = join(defaultOutputDir, 'query-results.bqrs');\n sarifPath = join(defaultOutputDir, 'query-results.sarif');\n\n // Run query with evaluator logging and tuple counting\n const queryResult = await executeCodeQLCommand(\n 'query run',\n {\n database: database as string,\n output: bqrsPath,\n 'evaluator-log': logPath,\n 'tuple-counting': true,\n 'evaluator-log-level': 5,\n },\n [query as string]\n );\n\n if (!queryResult.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to run query: ${queryResult.stderr || queryResult.error}`,\n },\n ],\n isError: true,\n };\n }\n\n // Generate SARIF interpretation\n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n\n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n }\n\n // Verify evaluator log exists\n if (!existsSync(logPath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Evaluator log not found at: ${logPath}`,\n },\n ],\n isError: true,\n };\n }\n\n // Parse the evaluator log\n logger.info(`Parsing evaluator log from: ${logPath}`);\n const profile = parseEvaluatorLog(logPath);\n\n // Determine output directory for profile\n const profileOutputDir = outputDir || dirname(logPath);\n mkdirSync(profileOutputDir, { recursive: true });\n\n // Write profile JSON file\n const jsonPath = join(profileOutputDir, 'query-evaluation-profile.json');\n const jsonContent = formatAsJson(profile);\n writeFileSync(jsonPath, jsonContent);\n logger.info(`Profile JSON written to: ${jsonPath}`);\n\n // Write profile Mermaid diagram file\n const mdPath = join(profileOutputDir, 'query-evaluation-profile.md');\n const mdContent = formatAsMermaid(profile);\n writeFileSync(mdPath, mdContent);\n logger.info(`Profile Mermaid diagram written to: ${mdPath}`);\n\n // Build response message\n const outputFiles: string[] = [\n `Profile JSON: ${jsonPath}`,\n `Profile Mermaid: ${mdPath}`,\n `Evaluator Log: ${logPath}`,\n ];\n\n if (bqrsPath) {\n outputFiles.push(`Query Results (BQRS): ${bqrsPath}`);\n }\n\n if (sarifPath && existsSync(sarifPath)) {\n outputFiles.push(`Query Results (SARIF): ${sarifPath}`);\n }\n\n const responseText = [\n 'Query profiling completed successfully!',\n '',\n 'Output Files:',\n ...outputFiles.map((f) => ` - ${f}`),\n '',\n 'Profile Summary:',\n ` - Query: ${basename(profile.queryName)}`,\n ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`,\n ` - Total Pipelines: ${profile.pipelines.length}`,\n ` - Total Events: ${profile.totalEvents}`,\n '',\n 'First 5 Pipeline Nodes (in evaluation order):',\n ...profile.pipelines.slice(0, 5).map((p, idx) => {\n return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || '?'} results)`;\n }),\n ].join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n };\n } catch (error) {\n logger.error('Error profiling CodeQL query:', error);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query compile tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryCompileTool: CLIToolDefinition = {\n name: 'codeql_query_compile',\n description: 'Compile and validate CodeQL queries',\n command: 'codeql',\n subcommand: 'query compile',\n inputSchema: {\n query: z.string().describe('Path to the CodeQL query file (.ql)'),\n database: z.string().optional().describe('Path to the CodeQL database'),\n library: z.string().optional().describe('Path to query library'),\n output: z.string().optional().describe('Output file path'),\n warnings: z.enum(['hide', 'show', 'error']).optional()\n .describe('How to handle compilation warnings'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql query compile --database=/path/to/db MyQuery.ql',\n 'codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql'\n ]\n};", "/**\n * CodeQL query format tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Custom result processor for codeql query format tool\n * Exit code 1 with --check-only means \"file would change\" - this is success for format checking\n */\nfunction formatResultProcessor(result: CLIExecutionResult, params: Record): string {\n const isCheckOnly = params['check-only'];\n const hasFormatChanges = result.exitCode === 1;\n \n if (isCheckOnly && hasFormatChanges) {\n // Mark as success for the CLI tool registry since detecting format changes is the intended behavior\n result.success = true;\n return result.stdout || result.stderr || 'File would change by autoformatting.';\n }\n \n return defaultCLIResultProcessor(result, params);\n}\n\nexport const codeqlQueryFormatTool: CLIToolDefinition = {\n name: 'codeql_query_format',\n description: 'Automatically format CodeQL source code files',\n command: 'codeql',\n subcommand: 'query format',\n inputSchema: {\n files: z.array(z.string()).describe('One or more .ql or .qll source files to format'),\n output: z.string().optional().describe('Write formatted code to this file instead of stdout'),\n 'in-place': z.boolean().optional().describe('Overwrite each input file with formatted version'),\n 'check-only': z.boolean().optional().describe('Check formatting without writing output'),\n backup: z.string().optional().describe('Backup extension when overwriting existing files'),\n 'no-syntax-errors': z.boolean().optional().describe('Ignore syntax errors and pretend file is formatted'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query format -i -- ExampleQuery.ql',\n 'codeql query format --in-place -- queries/*.ql',\n 'codeql query format --check-only -- queries/*.ql'\n ],\n resultProcessor: formatResultProcessor\n};", "/**\n * CodeQL query run tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryRunTool: CLIToolDefinition = {\n name: 'codeql_query_run',\n description: 'Execute a CodeQL query against a database. Use either \"query\" parameter for direct file path OR \"queryName\" + \"queryLanguage\" for pre-defined tool queries.',\n command: 'codeql',\n subcommand: 'query run',\n inputSchema: {\n query: z.string().optional().describe('Path to the CodeQL query file (.ql) - cannot be used with queryName'),\n queryName: z.string().optional().describe('Name of pre-defined query to run (e.g., \"PrintAST\", \"CallGraphFrom\", \"CallGraphTo\") - requires queryLanguage'),\n queryLanguage: z.string().optional().describe('Programming language for tools queries (e.g., \"javascript\", \"java\", \"python\") - required when using queryName'),\n queryPack: z.string().optional().describe('Query pack path (defaults to server/ql//tools/src/ for tool queries)'),\n sourceFiles: z.string().optional().describe('Comma-separated list of source file paths for PrintAST queries (e.g., \"src/main.js,src/utils.js\" or just \"main.js\")'),\n sourceFunction: z.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., \"main,processData\")'),\n targetFunction: z.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., \"helper,validateInput\")'),\n database: createCodeQLSchemas.database(),\n output: createCodeQLSchemas.output(),\n external: z.array(z.string()).optional()\n .describe('External predicate data: predicate=file.csv'),\n timeout: createCodeQLSchemas.timeout(),\n logDir: z.string().optional()\n .describe('Custom directory for query execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n 'evaluator-log': z.string().optional().describe('Path to save evaluator log (deprecated: use logDir instead)'),\n 'evaluator-log-minify': z.boolean().optional()\n .describe('Minimize evaluator log for smaller size'),\n 'evaluator-log-level': z.number().min(1).max(5).optional()\n .describe('Evaluator log verbosity level (1-5, default 5)'),\n 'tuple-counting': z.boolean().optional()\n .describe('Display tuple counts for each evaluation step in evaluator logs'),\n format: z.enum(['sarif-latest', 'sarifv2.1.0', 'csv', 'graphtext', 'dgml', 'dot']).optional()\n .describe('Output format for query results via codeql bqrs interpret. Defaults to sarif-latest for @kind problem/path-problem queries, graphtext for @kind graph queries. Graph formats (graphtext, dgml, dot) only work with @kind graph queries.'),\n interpretedOutput: z.string().optional()\n .describe('Output file for interpreted results (e.g., results.sarif, results.txt). If not provided, defaults based on format: .sarif for SARIF, .txt for graphtext/csv, .dgml for dgml, .dot for dot'),\n evaluationFunction: z.string().optional()\n .describe('[DEPRECATED - use format parameter instead] Built-in function for query results evaluation (e.g., \"mermaid-graph\", \"json-decode\", \"csv-decode\") or path to custom evaluation script'),\n evaluationOutput: z.string().optional()\n .describe('[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query run --database=mydb --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=src/index.js --output=results.bqrs --format=graphtext --interpreted-output=results.txt',\n 'codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif',\n 'codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=\"main.js,utils.js\" --format=graphtext',\n 'codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql'\n ]\n};", "/**\n * CodeQL quick evaluate tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { join, resolve } from 'path';\nimport { findClassPosition } from './find-class-position';\nimport { findPredicatePosition } from './find-predicate-position';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\n\nexport interface QuickEvaluateParams {\n file: string;\n db: string;\n symbol: string;\n output_path?: string;\n}\n\n/**\n * Quick evaluate either a class or a predicate in a CodeQL query.\n * This allows debugging a select portion of QL code without running the whole query.\n */\nexport async function quickEvaluate({\n file,\n db: _db,\n symbol,\n output_path\n}: QuickEvaluateParams): Promise {\n try {\n // Try to find as a class first, then as a predicate\n try {\n await findClassPosition(file, symbol);\n } catch {\n try {\n await findPredicatePosition(file, symbol);\n } catch {\n throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`);\n }\n }\n \n const resolvedOutput = resolve(output_path || join(getProjectTmpDir('quickeval'), 'quickeval.bqrs'));\n \n // For now, return the resolved output path\n // In a full implementation, this would use the CodeQL CLI or query server\n // to perform the actual quick evaluation with the position parameters\n return resolvedOutput;\n } catch (error) {\n throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the quick evaluate tool with the MCP server\n */\nexport function registerQuickEvaluateTool(server: McpServer): void {\n server.tool(\n 'quick_evaluate',\n 'Quick evaluate either a class or a predicate in a CodeQL query for debugging',\n {\n file: z.string().describe('Path to the .ql file containing the symbol'),\n db: z.string().describe('Path to the CodeQL database'),\n symbol: z.string().describe('Name of the class or predicate to evaluate'),\n output_path: z.string().optional().describe('Output path for results (defaults to project-local .tmp/quickeval/)'),\n },\n async ({ file, db, symbol, output_path }) => {\n try {\n const result = await quickEvaluate({ file, db, symbol, output_path });\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error in quick evaluate:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL register database tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { access, constants } from 'fs/promises';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger';\n\nexport interface DatabaseRegistration {\n uri: string;\n content: {\n sourceArchiveZip: string;\n dbDir: string;\n };\n}\n\n/**\n * Register a CodeQL database given a local path to the database directory.\n * Validates that the database exists and has required structure.\n * Supports both full databases (with src.zip) and test databases (with src/ folder).\n */\nexport async function registerDatabase(dbPath: string): Promise {\n try {\n const resolvedPath = resolve(dbPath);\n \n // Check if database directory exists\n await access(resolvedPath, constants.F_OK);\n \n // Check for codeql-database.yml (required for all CodeQL databases)\n const dbYmlPath = resolve(resolvedPath, 'codeql-database.yml');\n await access(dbYmlPath, constants.F_OK);\n \n // Check if src.zip exists (for full databases) OR src/ directory exists (for test databases)\n const srcZipPath = resolve(resolvedPath, 'src.zip');\n const srcDirPath = resolve(resolvedPath, 'src');\n \n let hasSrcZip = false;\n let hasSrcDir = false;\n \n try {\n await access(srcZipPath, constants.F_OK);\n hasSrcZip = true;\n } catch {\n // src.zip not found, check for src/ directory\n }\n \n if (!hasSrcZip) {\n try {\n await access(srcDirPath, constants.F_OK);\n hasSrcDir = true;\n } catch {\n // src directory not found either\n }\n }\n \n if (!hasSrcZip && !hasSrcDir) {\n throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`);\n }\n \n // For now, we just validate and return success message\n // In a full implementation, this would register with a query server\n const sourceType = hasSrcZip ? 'src.zip' : 'src/';\n return `Database registered: ${dbPath} (source: ${sourceType})`;\n } catch (error) {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === 'ENOENT') {\n if (error.message.includes('codeql-database.yml')) {\n throw new Error(`Missing required codeql-database.yml in: ${dbPath}`);\n }\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n if (errorCode === 'EACCES') {\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n }\n throw new Error(`Failed to register database: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the register database tool with the MCP server\n */\nexport function registerRegisterDatabaseTool(server: McpServer): void {\n server.tool(\n 'register_database',\n 'Register a CodeQL database given a local path to the database directory',\n {\n db_path: z.string().describe('Path to the CodeQL database directory'),\n },\n async ({ db_path }) => {\n try {\n const result = await registerDatabase(db_path);\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error registering database:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL resolve database tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveDatabaseTool: CLIToolDefinition = {\n name: 'codeql_resolve_database',\n description: 'Resolve database path and validate database structure',\n command: 'codeql',\n subcommand: 'resolve database',\n inputSchema: {\n database: z.string().describe('Database path to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for database information'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve database -- /path/to/database',\n 'codeql resolve database --format=json -- my-database',\n 'codeql resolve database --format=betterjson -- database-dir'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve languages tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLanguagesTool: CLIToolDefinition = {\n name: 'codeql_resolve_languages',\n description: 'List installed CodeQL extractor packs',\n command: 'codeql',\n subcommand: 'resolve languages',\n inputSchema: {\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for language information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve languages --format=text',\n 'codeql resolve languages --format=json',\n 'codeql resolve languages --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve library-path tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLibraryPathTool: CLIToolDefinition = {\n name: 'codeql_resolve_library-path',\n description: 'Resolve library path for CodeQL queries and libraries',\n command: 'codeql',\n subcommand: 'resolve library-path',\n inputSchema: {\n language: z.string().optional().describe('Programming language to resolve library path for'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for library path information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve library-path --language=java',\n 'codeql resolve library-path --format=json --language=python',\n 'codeql resolve library-path --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve metadata tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveMetadataTool: CLIToolDefinition = {\n name: 'codeql_resolve_metadata',\n description: 'Resolve and return the key-value metadata pairs from a CodeQL query source file.',\n command: 'codeql',\n subcommand: 'resolve metadata',\n inputSchema: {\n query: z.string().describe('Query file to resolve metadata for'),\n format: z.enum(['json']).optional()\n .describe('Output format for metadata information (always JSON, optional for future compatibility)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve metadata -- relative-path/2/MyQuery.ql',\n 'codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve qlref tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveQlrefTool: CLIToolDefinition = {\n name: 'codeql_resolve_qlref',\n description: 'Resolve qlref files to their corresponding query files',\n command: 'codeql',\n subcommand: 'resolve qlref',\n inputSchema: {\n qlref: z.string().describe('Path to the .qlref file to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for qlref resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve qlref -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=json -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=betterjson -- test/MyQuery.qlref'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve queries tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Result processor that only returns stdout for JSON formats\n * This prevents warnings/info from stderr from corrupting JSON output\n */\nconst jsonOnlyResultProcessor = (\n result: CLIExecutionResult,\n params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n\n // For JSON formats (including bylanguage), only return stdout to avoid mixing warnings with JSON\n if (params.format === 'json' || params.format === 'betterjson' || params.format === 'bylanguage') {\n return result.stdout || '[]';\n }\n\n // For text format, include warnings\n let output = '';\n\n if (result.stdout) {\n output += result.stdout;\n }\n\n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n\n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n\n return output;\n};\n\nexport const codeqlResolveQueriesTool: CLIToolDefinition = {\n name: 'codeql_resolve_queries',\n description: 'List available CodeQL queries found on the local filesystem',\n command: 'codeql',\n subcommand: 'resolve queries',\n inputSchema: {\n directory: z.string().optional().describe('Directory to search for queries'),\n language: z.string().optional().describe('Filter queries by programming language'),\n format: z.enum(['text', 'json', 'betterjson', 'bylanguage']).optional()\n .describe('Output format for query list'),\n 'additional-packs': z.union([z.string(), z.array(z.string())]).optional()\n .describe('Additional pack directories to search for CodeQL packs'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve queries',\n 'codeql resolve queries --language=java --format=json',\n 'codeql resolve queries --format=betterjson -- /path/to/queries',\n 'codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries'\n ],\n resultProcessor: jsonOnlyResultProcessor\n};", "/**\n * CodeQL resolve tests tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveTestsTool: CLIToolDefinition = {\n name: 'codeql_resolve_tests',\n description: 'Resolve the local filesystem paths of unit tests and/or queries under some base directory',\n command: 'codeql',\n subcommand: 'resolve tests',\n inputSchema: {\n tests: z.array(z.string()).optional().describe('One or more tests (.ql, .qlref files, or test directories)'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format for test list'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve tests',\n 'codeql resolve tests --format=json -- test-directory',\n 'codeql resolve tests --format=json -- test1.ql test2.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test accept tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestAcceptTool: CLIToolDefinition = {\n name: 'codeql_test_accept',\n description: 'Accept new test results as the expected baseline',\n command: 'codeql',\n subcommand: 'test accept',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref',\n 'codeql test accept -- languages/java/test/MyQuery/',\n 'codeql test accept -- languages/java/src/MyQuery/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test extract tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestExtractTool: CLIToolDefinition = {\n name: 'codeql_test_extract',\n description: 'Extract test databases for CodeQL query tests',\n command: 'codeql',\n subcommand: 'test extract',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more test directories or files'),\n language: z.string().optional().describe('Programming language for extraction'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test extract -- languages/java/test/MyQuery/',\n 'codeql test extract --language=java --threads=4 -- test-directory',\n 'codeql test extract --threads=2 --ram=2048 -- multiple/test/directories'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test run tool\n */\n\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\nimport { z } from 'zod';\n\nexport const codeqlTestRunTool: CLIToolDefinition = {\n name: 'codeql_test_run',\n description: 'Run CodeQL query tests',\n command: 'codeql',\n subcommand: 'test run',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n 'show-extractor-output': z.boolean().optional()\n .describe('Show output from extractors during test execution'),\n 'keep-databases': z.boolean().optional()\n .describe('Keep test databases after running tests'),\n 'learn': z.boolean().optional()\n .describe('Accept current output as expected for failing tests'),\n logDir: z.string().optional()\n .describe('Custom directory for test execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test run /path/to/tests',\n 'codeql test run --learn /path/to/failing/tests',\n 'codeql test run --threads=4 --keep-databases /path/to/tests',\n 'codeql test run --log-dir=/custom/log/path /path/to/tests'\n ]\n};", "/**\n * CodeQL tools registration for MCP server\n * Includes both high-level helpers and CLI command wrappers\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { validateCodeQLSyntax } from '../lib/validation';\nimport { createCodeQLQuery } from '../lib/query-scaffolding';\nimport { registerCLITool } from '../lib/cli-tool-registry';\nimport {\n codeqlBqrsDecodeTool,\n codeqlBqrsInfoTool,\n codeqlBqrsInterpretTool,\n codeqlDatabaseAnalyzeTool,\n codeqlDatabaseCreateTool,\n codeqlGenerateLogSummaryTool,\n codeqlGenerateQueryHelpTool,\n codeqlPackInstallTool,\n codeqlPackLsTool,\n codeqlQueryCompileTool,\n codeqlQueryFormatTool,\n codeqlQueryRunTool,\n codeqlResolveDatabaseTool,\n codeqlResolveLanguagesTool,\n codeqlResolveLibraryPathTool,\n codeqlResolveMetadataTool,\n codeqlResolveQlrefTool,\n codeqlResolveQueriesTool,\n codeqlResolveTestsTool,\n codeqlTestAcceptTool,\n codeqlTestExtractTool,\n codeqlTestRunTool,\n registerFindClassPositionTool,\n registerFindCodeQLQueryFilesTool,\n registerFindPredicatePositionTool,\n registerLanguageServerEvalTool,\n registerProfileCodeQLQueryTool,\n registerQuickEvaluateTool,\n registerRegisterDatabaseTool\n} from './codeql';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all CodeQL tools with the MCP server\n */\nexport function registerCodeQLTools(server: McpServer): void {\n // Register high-level helper tools\n \n // Tool: Validate CodeQL Query (heuristic-based)\n server.tool(\n 'validate_codeql_query',\n 'Quick heuristic validation for CodeQL query structure - checks for common patterns like from/where/select clauses and metadata presence. Does NOT compile the query. For authoritative validation with actual compilation, use codeql_language_server_eval instead.',\n {\n query: z.string().describe('The CodeQL query to validate'),\n language: z.string().optional().describe('Target programming language'),\n },\n async ({ query, language }) => {\n try {\n const validation = validateCodeQLSyntax(query, language);\n return {\n content: [{ type: 'text', text: JSON.stringify(validation, null, 2) }],\n };\n } catch (error) {\n logger.error('Error validating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Create CodeQL Query\n server.tool(\n 'create_codeql_query',\n 'Create directory structure and files for a new CodeQL query with tests',\n {\n basePath: z.string().describe('Base path where src/ and test/ directories will be created'),\n queryName: z.string().describe('Name of the query (e.g., MySecurityQuery)'),\n language: z.string().describe('Target programming language (e.g., javascript, python, java)'),\n description: z.string().optional().describe('Description of what the query does'),\n queryId: z.string().optional().describe('Custom query ID (defaults to language/example/queryname)'),\n },\n async ({ basePath, queryName, language, description, queryId }) => {\n try {\n const result = createCodeQLQuery({\n basePath,\n queryName,\n language,\n description,\n queryId\n });\n \n const summary = {\n success: true,\n queryPath: result.queryPath,\n testPath: result.testPath,\n qlrefPath: result.qlrefPath,\n testCodePath: result.testCodePath,\n filesCreated: result.filesCreated,\n nextSteps: [\n 'Review and customize the generated query in: ' + result.queryPath,\n 'Add test cases to: ' + result.testCodePath,\n 'Run codeql_pack_install to install dependencies',\n 'Run codeql_test_extract to create test database',\n 'Run codeql_test_run to execute tests'\n ]\n };\n \n return {\n content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }],\n };\n } catch (error) {\n logger.error('Error creating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register CLI tools (alphabetically by tool name)\n registerCLITool(server, codeqlBqrsDecodeTool);\n registerCLITool(server, codeqlBqrsInfoTool);\n registerCLITool(server, codeqlBqrsInterpretTool);\n registerCLITool(server, codeqlDatabaseAnalyzeTool);\n registerCLITool(server, codeqlDatabaseCreateTool);\n registerCLITool(server, codeqlGenerateLogSummaryTool);\n registerCLITool(server, codeqlGenerateQueryHelpTool);\n registerCLITool(server, codeqlPackInstallTool);\n registerCLITool(server, codeqlPackLsTool);\n registerCLITool(server, codeqlQueryCompileTool);\n registerCLITool(server, codeqlQueryFormatTool);\n registerCLITool(server, codeqlQueryRunTool);\n registerCLITool(server, codeqlResolveDatabaseTool);\n registerCLITool(server, codeqlResolveLanguagesTool);\n registerCLITool(server, codeqlResolveLibraryPathTool);\n registerCLITool(server, codeqlResolveMetadataTool);\n registerCLITool(server, codeqlResolveQlrefTool);\n registerCLITool(server, codeqlResolveQueriesTool);\n registerCLITool(server, codeqlResolveTestsTool);\n registerCLITool(server, codeqlTestAcceptTool);\n registerCLITool(server, codeqlTestExtractTool);\n registerCLITool(server, codeqlTestRunTool);\n\n // Register new MCP tools (inspired by JordyZomer/codeql-mcp repository)\n registerFindClassPositionTool(server);\n registerFindCodeQLQueryFilesTool(server);\n registerFindPredicatePositionTool(server);\n registerLanguageServerEvalTool(server);\n registerProfileCodeQLQueryTool(server);\n registerQuickEvaluateTool(server);\n registerRegisterDatabaseTool(server);\n}\n", "/**\n * CodeQL query validation utilities\n */\n\nimport { resolve, normalize, isAbsolute, relative } from 'path';\n\nexport interface CodeQLValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n suggestions: string[];\n}\n\n/**\n * Validates CodeQL query syntax and structure\n */\nexport function validateCodeQLSyntax(query: string, _language?: string): CodeQLValidationResult {\n const validation: CodeQLValidationResult = {\n isValid: true,\n errors: [],\n warnings: [],\n suggestions: [],\n };\n\n if (!query.trim()) {\n validation.isValid = false;\n validation.errors.push('Query cannot be empty');\n return validation;\n }\n\n if (!query.includes('from') && !query.includes('select')) {\n validation.warnings.push('Query should typically include \"from\" and \"select\" clauses');\n }\n\n if (!query.includes('@name') && !query.includes('@description')) {\n validation.suggestions.push('Consider adding @name and @description metadata');\n }\n\n return validation;\n}\n\n/**\n * Validates a file path to prevent path traversal attacks\n * @param filePath - The file path to validate\n * @param workspaceRoot - Optional workspace root directory. If not provided, allows any absolute path but still blocks traversal attempts\n * @returns The validated absolute path\n * @throws Error if the path contains path traversal sequences\n */\nexport function validateFilePath(filePath: string, workspaceRoot?: string): string {\n // Normalize the path to resolve any . or .. segments\n const normalizedPath = normalize(filePath);\n \n // Check for path traversal attempts in the normalized path\n // This blocks paths like \"../../../etc/passwd\" even after normalization\n if (normalizedPath.includes('..')) {\n throw new Error(`Invalid file path: path traversal detected in \"${filePath}\"`);\n }\n \n // Resolve to absolute path\n const absolutePath = isAbsolute(normalizedPath) \n ? normalizedPath \n : resolve(workspaceRoot || process.cwd(), normalizedPath);\n \n // If workspace root is specified, ensure the resolved path is within it\n if (workspaceRoot) {\n const relativePath = relative(workspaceRoot, absolutePath);\n \n // If relative path starts with .. or is absolute, it's outside workspace\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Invalid file path: \"${filePath}\" is outside the workspace root`);\n }\n }\n \n return absolutePath;\n}", "/**\n * CodeQL query scaffolding utilities\n * Handles creation of query directory structure and files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface QueryScaffoldingOptions {\n basePath: string;\n queryName: string;\n language: string;\n description?: string;\n queryId?: string;\n}\n\nexport interface QueryScaffoldingResult {\n queryPath: string;\n testPath: string;\n qlrefPath: string;\n testCodePath: string;\n filesCreated: string[];\n}\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n const extensions: Record = {\n javascript: 'js',\n typescript: 'ts',\n python: 'py',\n java: 'java',\n csharp: 'cs',\n cpp: 'cpp',\n go: 'go',\n ruby: 'rb',\n actions: 'yml'\n };\n return extensions[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Generate query template content\n */\nfunction generateQueryTemplate(\n queryName: string,\n language: string,\n description?: string,\n queryId?: string\n): string {\n const desc = description || `${queryName} query`;\n const id = queryId || `${language}/example/${queryName.toLowerCase()}`;\n \n return `/**\n * @id ${id}\n * @name ${queryName}\n * @description ${desc}\n * @kind problem\n * @precision medium\n * @problem.severity warning\n */\n\nimport ${language}\n\n// TODO: Implement query logic\nfrom File f\nwhere f.getBaseName() = \"${queryName}.${getLanguageExtension(language)}\"\nselect f, \"TODO: Add query logic\"\n`;\n}\n\n/**\n * Create the directory structure and files for a new CodeQL query\n */\nexport function createCodeQLQuery(options: QueryScaffoldingOptions): QueryScaffoldingResult {\n const { basePath, queryName, language, description, queryId } = options;\n \n // Resolve absolute paths\n const absoluteBasePath = path.resolve(basePath);\n \n // Define paths with intermediate directory\n const srcDir = path.join(absoluteBasePath, 'src', queryName);\n const testDir = path.join(absoluteBasePath, 'test', queryName);\n \n const queryPath = path.join(srcDir, `${queryName}.ql`);\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const testCodePath = path.join(testDir, `${queryName}.${getLanguageExtension(language)}`);\n \n const filesCreated: string[] = [];\n \n try {\n // Create directories (recursive: true is a no-op if they already exist)\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(testDir, { recursive: true });\n \n // Create files atomically using 'wx' flag (exclusive create) to avoid\n // TOCTOU race between existsSync check and writeFileSync (CWE-367).\n // The 'wx' flag fails with EEXIST if the file already exists.\n try {\n const queryContent = generateQueryTemplate(queryName, language, description, queryId);\n fs.writeFileSync(queryPath, queryContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(queryPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const qlrefContent = `${queryName}/${queryName}.ql\\n`;\n fs.writeFileSync(qlrefPath, qlrefContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(qlrefPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const testCodeContent = `// Test code for ${queryName}\\n// TODO: Add test cases\\n`;\n fs.writeFileSync(testCodePath, testCodeContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(testCodePath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n return {\n queryPath,\n testPath: testDir,\n qlrefPath,\n testCodePath,\n filesCreated\n };\n } catch (error) {\n throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n", "/**\n * CodeQL learning resources utilities\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the getting started guide content\n */\nexport function getGettingStartedGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/getting-started.md'), 'utf-8');\n } catch {\n return 'Getting started guide not available';\n }\n}\n\n/**\n * Get the query basics guide content\n */\nexport function getQueryBasicsGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/query-basics.md'), 'utf-8');\n } catch {\n return 'Query basics guide not available';\n }\n}\n\n/**\n * Get the security templates content\n */\nexport function getSecurityTemplates(): string {\n try {\n return readFileSync(join(__dirname, '../resources/security-templates.md'), 'utf-8');\n } catch {\n return 'Security templates not available';\n }\n}\n\n/**\n * Get the performance patterns content\n */\nexport function getPerformancePatterns(): string {\n try {\n return readFileSync(join(__dirname, '../resources/performance-patterns.md'), 'utf-8');\n } catch {\n return 'Performance patterns not available';\n }\n}", "/**\n * CodeQL resources registration for MCP server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getGettingStartedGuide,\n getQueryBasicsGuide,\n getSecurityTemplates,\n getPerformancePatterns,\n} from '../lib/resources';\n\n/**\n * Register all CodeQL resources with the MCP server\n */\nexport function registerCodeQLResources(server: McpServer): void {\n // Getting Started Guide\n server.resource(\n 'CodeQL Getting Started',\n 'codeql://learning/getting-started',\n {\n description: 'Comprehensive introduction to CodeQL for beginners',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/getting-started',\n mimeType: 'text/markdown',\n text: getGettingStartedGuide(),\n },\n ],\n };\n }\n );\n\n // Query Basics Guide\n server.resource(\n 'CodeQL Query Basics',\n 'codeql://learning/query-basics',\n {\n description: 'Learn the fundamentals of writing CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/query-basics',\n mimeType: 'text/markdown',\n text: getQueryBasicsGuide(),\n },\n ],\n };\n }\n );\n\n // Security Templates\n server.resource(\n 'CodeQL Security Templates',\n 'codeql://templates/security',\n {\n description: 'Ready-to-use security query templates',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://templates/security',\n mimeType: 'text/markdown',\n text: getSecurityTemplates(),\n },\n ],\n };\n }\n );\n\n // Performance Patterns\n server.resource(\n 'CodeQL Performance Patterns',\n 'codeql://patterns/performance',\n {\n description: 'Best practices for writing efficient CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://patterns/performance',\n mimeType: 'text/markdown',\n text: getPerformancePatterns(),\n },\n ],\n };\n }\n );\n}\n", "/**\n * Language-specific resources implementation\n * Dynamically loads and serves language-specific AST references and security patterns\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { LANGUAGE_RESOURCES } from '../types/language-types';\nimport { logger } from '../utils/logger';\n\n/**\n * Get the base path for ql resources\n */\nfunction getQLBasePath(): string {\n // In production, this would be the path to the ql submodule\n // For now, we assume we're running from the server directory\n return join(process.cwd(), '..');\n}\n\n/**\n * Load content from a resource file\n */\nfunction loadResourceContent(relativePath: string): string | null {\n try {\n const fullPath = join(getQLBasePath(), relativePath);\n \n if (!existsSync(fullPath)) {\n logger.warn(`Resource file not found: ${fullPath}`);\n return null;\n }\n \n return readFileSync(fullPath, 'utf-8');\n } catch (error) {\n logger.error(`Error loading resource file ${relativePath}:`, error);\n return null;\n }\n}\n\n/**\n * Register language-specific AST resources\n */\nexport function registerLanguageASTResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.astFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/ast`;\n \n server.resource(\n `${langResource.language.toUpperCase()} AST Reference`,\n resourceUri,\n {\n description: `CodeQL AST class reference for ${langResource.language} programs`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.astFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} AST Reference\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register language-specific security pattern resources\n */\nexport function registerLanguageSecurityResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.securityFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/security`;\n \n server.resource(\n `${langResource.language.toUpperCase()} Security Patterns`,\n resourceUri,\n {\n description: `CodeQL security query patterns and framework modeling for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.securityFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} Security Patterns\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register additional language-specific resources (like Go's dataflow patterns)\n */\nexport function registerLanguageAdditionalResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.additionalFiles) continue;\n \n for (const [resourceType, filePath] of Object.entries(langResource.additionalFiles)) {\n const resourceUri = `codeql://languages/${langResource.language}/${resourceType}`;\n \n server.resource(\n `${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}`,\n resourceUri,\n {\n description: `CodeQL ${resourceType.replace('-', ' ')} guide for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(filePath);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n }\n}\n\n/**\n * Register all language-specific resources\n */\nexport function registerLanguageResources(server: McpServer): void {\n logger.info('Registering language-specific resources...');\n \n // Register AST references for all languages\n registerLanguageASTResources(server);\n \n // Register security patterns for languages that have them\n registerLanguageSecurityResources(server);\n \n // Register additional resources (like Go's dataflow patterns)\n registerLanguageAdditionalResources(server);\n \n logger.info(`Registered resources for ${LANGUAGE_RESOURCES.length} languages`);\n}", "/**\n * Type definitions and constants for language-specific resources\n */\n\n// Language mappings to resource files\nexport interface LanguageResource {\n language: string;\n astFile?: string;\n securityFile?: string;\n additionalFiles?: Record;\n}\n\nexport const LANGUAGE_RESOURCES: LanguageResource[] = [\n {\n language: 'actions',\n astFile: 'ql/languages/actions/tools/dev/actions_ast.prompt.md'\n },\n {\n language: 'cpp',\n astFile: 'ql/languages/cpp/tools/dev/cpp_ast.prompt.md',\n securityFile: 'ql/languages/cpp/tools/dev/cpp_security_query_guide.prompt.md'\n },\n {\n language: 'csharp',\n astFile: 'ql/languages/csharp/tools/dev/csharp_ast.prompt.md',\n securityFile: 'ql/languages/csharp/tools/dev/csharp_security_query_guide.prompt.md'\n },\n {\n language: 'go',\n astFile: 'ql/languages/go/tools/dev/go_ast.prompt.md',\n securityFile: 'ql/languages/go/tools/dev/go_security_query_guide.prompt.md',\n additionalFiles: {\n 'dataflow': 'ql/languages/go/tools/dev/go_dataflow.prompt.md',\n 'library-modeling': 'ql/languages/go/tools/dev/go_library_modeling.prompt.md',\n 'basic-queries': 'ql/languages/go/tools/dev/go_basic_queries.prompt.md'\n }\n },\n {\n language: 'java',\n astFile: 'ql/languages/java/tools/dev/java_ast.prompt.md'\n },\n {\n language: 'javascript',\n astFile: 'ql/languages/javascript/tools/dev/javascript_ast.prompt.md',\n securityFile: 'ql/languages/javascript/tools/dev/javascript_security_query_guide.prompt.md'\n },\n {\n language: 'python',\n astFile: 'ql/languages/python/tools/dev/python_ast.prompt.md',\n securityFile: 'ql/languages/python/tools/dev/python_security_query_guide.prompt.md'\n },\n {\n language: 'ql',\n astFile: 'ql/languages/ql/tools/dev/ql_ast.prompt.md'\n },\n {\n language: 'ruby',\n astFile: 'ql/languages/ruby/tools/dev/ruby_ast.prompt.md'\n }\n];", "/**\n * MCP Server workflow prompts for CodeQL development\n *\n * All prompt content is loaded from .prompt.md files in this directory.\n * This file only handles prompt registration and parameter processing.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { basename } from 'path';\nimport { loadPromptTemplate, processPromptTemplate } from './prompt-loader';\nimport { logger } from '../utils/logger';\n\n/** Supported CodeQL languages for tools queries */\nexport const SUPPORTED_LANGUAGES = [\n 'actions',\n 'cpp',\n 'csharp',\n 'go',\n 'java',\n 'javascript',\n 'python',\n 'ruby',\n 'swift'\n] as const;\n\n/**\n * Schema for workshop_creation_workflow prompt parameters.\n * Uses z.coerce.number() for numStages to handle string inputs from VSCode slash commands.\n */\nexport const workshopCreationWorkflowSchema = z.object({\n queryPath: z\n .string()\n .describe('Path to the production-grade CodeQL query (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n workshopName: z\n .string()\n .optional()\n .describe('Name for the workshop directory'),\n numStages: z\n .coerce.number()\n .optional()\n .describe('Number of incremental stages (default: 4-8)')\n});\n\n/**\n * Register MCP workflow prompts\n *\n * Each prompt loads its content from a corresponding .prompt.md file\n * and processes any parameter substitutions.\n */\nexport function registerWorkflowPrompts(server: McpServer): void {\n // Test-Driven Development Prompt\n server.prompt(\n 'test_driven_development',\n 'Test-driven development workflow for CodeQL queries using MCP tools',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n queryName: queryName || '[QueryName]'\n });\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `## Context\\n\\n- **Language**: ${language}\\n${queryName ? `- **Query Name**: ${queryName}\\n` : ''}\\n${content}`\n }\n }\n ]\n };\n }\n );\n\n // Tools Query Workflow Prompt\n server.prompt(\n 'tools_query_workflow',\n 'Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n database: z.string().describe('Path to the CodeQL database'),\n sourceFiles: z\n .string()\n .optional()\n .describe(\n 'Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'\n ),\n sourceFunction: z\n .string()\n .optional()\n .describe(\n 'Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'\n ),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")')\n },\n async ({\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n }) => {\n const template = loadPromptTemplate('tools-query-workflow.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n database\n });\n\n const contextSection = buildToolsQueryContext(\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + content\n }\n }\n ]\n };\n }\n );\n\n // Workshop Creation Workflow Prompt\n server.prompt(\n 'workshop_creation_workflow',\n 'Guide for creating CodeQL query development workshops from production-grade queries',\n workshopCreationWorkflowSchema.shape,\n async ({ queryPath, language, workshopName, numStages }) => {\n const template = loadPromptTemplate('workshop-creation-workflow.prompt.md');\n\n // Derive workshop name from query path if not provided\n const derivedName =\n workshopName ||\n basename(queryPath)\n .replace(/\\.(ql|qlref)$/, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') ||\n 'codeql-workshop';\n\n const contextSection = buildWorkshopContext(\n queryPath,\n language,\n derivedName,\n numStages\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Basic Prompt - Test-Driven Development Checklist\n server.prompt(\n 'ql_tdd_basic',\n 'Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (language || queryName) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Advanced Prompt - Advanced Techniques with AST/CFG/CallGraph\n server.prompt(\n 'ql_tdd_advanced',\n 'Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop'),\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis')\n },\n async ({ language, queryName, database }) => {\n const template = loadPromptTemplate('ql-tdd-advanced.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (database) {\n contextSection += `- **Database**: ${database}\\n`;\n }\n if (language || queryName || database) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank False Positives Prompt\n server.prompt(\n 'sarif_rank_false_positives',\n 'Analyze SARIF results to identify likely false positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-false-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank True Positives Prompt\n server.prompt(\n 'sarif_rank_true_positives',\n 'Analyze SARIF results to identify likely true positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-true-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Explain CodeQL Query Prompt (for workshop learning content)\n server.prompt(\n 'explain_codeql_query',\n 'Generate detailed explanation of a CodeQL query for workshop learning content - uses MCP tools to gather context and produces both verbal explanations and mermaid evaluation diagrams',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling')\n },\n async ({ queryPath, language, databasePath }) => {\n const template = loadPromptTemplate('explain-codeql-query.prompt.md');\n\n let contextSection = '## Query to Explain\\n\\n';\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n contextSection += `- **Language**: ${language}\\n`;\n if (databasePath) {\n contextSection += `- **Database Path**: ${databasePath}\\n`;\n }\n contextSection += '\\n';\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Document CodeQL Query Prompt\n server.prompt(\n 'document_codeql_query',\n 'Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query')\n },\n async ({ queryPath, language }) => {\n const template = loadPromptTemplate('document-codeql-query.prompt.md');\n\n const contextSection = `## Query to Document\n\n- **Query Path**: ${queryPath}\n- **Language**: ${language}\n\n`;\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n logger.info('Registered 9 workflow prompts');\n}\n\n/**\n * Build context section for tools query workflow\n */\nexport function buildToolsQueryContext(\n language: string,\n database: string,\n sourceFiles?: string,\n sourceFunction?: string,\n targetFunction?: string\n): string {\n const lines = [\n '## Your Context',\n '',\n `- **Language**: ${language}`,\n `- **Database**: ${database}`\n ];\n\n if (sourceFiles) {\n lines.push(`- **Source Files**: ${sourceFiles}`);\n }\n if (sourceFunction) {\n lines.push(`- **Source Function**: ${sourceFunction}`);\n }\n if (targetFunction) {\n lines.push(`- **Target Function**: ${targetFunction}`);\n }\n\n lines.push('', '## Recommended Next Steps', '');\n\n if (sourceFiles) {\n lines.push(\n `1. Run \\`codeql_query_run\\` with queryName=\"PrintAST\", sourceFiles=\"${sourceFiles}\"`\n );\n } else {\n lines.push('1. Identify source files to analyze with PrintAST');\n }\n\n if (sourceFunction) {\n lines.push(\n `2. Run \\`codeql_query_run\\` with queryName=\"PrintCFG\" or \"CallGraphFrom\", sourceFunction=\"${sourceFunction}\"`\n );\n } else {\n lines.push(\n '2. Identify key functions for CFG or call graph analysis'\n );\n }\n\n if (targetFunction) {\n lines.push(\n `3. Run \\`codeql_query_run\\` with queryName=\"CallGraphTo\", targetFunction=\"${targetFunction}\"`\n );\n } else {\n lines.push('3. Identify target functions to find callers');\n }\n\n lines.push('', '');\n return lines.join('\\n');\n}\n\n/**\n * Build context section for workshop creation workflow\n */\nexport function buildWorkshopContext(\n queryPath: string,\n language: string,\n workshopName: string,\n numStages?: number\n): string {\n return `## Your Workshop Context\n\n- **Target Query**: ${queryPath}\n- **Language**: ${language}\n- **Workshop Name**: ${workshopName}\n- **Suggested Stages**: ${numStages || '4-8 (auto-detect based on query complexity)'}\n\n## Immediate Actions\n\n1. **Locate query files**: Use \\`find_codeql_query_files\\` with queryPath=\"${queryPath}\"\n2. **Understand query for learning content**: Use the \\`explain_codeql_query\\` prompt with queryPath=\"${queryPath}\" and language=\"${language}\"\n3. **Document each workshop stage**: Use the \\`document_codeql_query\\` prompt to create/update documentation for each solution query\n4. **Verify tests pass**: Use \\`codeql_test_run\\` on existing tests\n5. **Run tools queries**: Generate AST/CFG understanding for workshop materials\n\n`;\n}\n", "/**\n * Utility functions for loading prompt template files\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Load a prompt template from a .prompt.md file\n */\nexport function loadPromptTemplate(promptFileName: string): string {\n try {\n const promptPath = join(__dirname, promptFileName);\n return readFileSync(promptPath, 'utf-8');\n } catch (error) {\n return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n}\n\n/**\n * Process prompt template by replacing placeholders with actual values\n */\nexport function processPromptTemplate(template: string, variables: Record): string {\n let processed = template;\n \n // Replace variables in the format {{variable}} or {variable}\n for (const [key, value] of Object.entries(variables)) {\n const patterns = [\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'),\n new RegExp(`\\\\{${key}\\\\}`, 'g')\n ];\n \n for (const pattern of patterns) {\n processed = processed.replace(pattern, value);\n }\n }\n \n return processed;\n}", "/**\n * Monitoring Tools - MCP tool implementations for session management and reporting\n * Provides the MCP Tool APIs specified in the monitoring specification\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport { sessionDataManager } from '../lib/session-data-manager';\nimport {\n QueryDevelopmentSession,\n SessionFilter,\n QualityScoreRecord,\n ComparisonReport,\n AggregateReport,\n ExportResult,\n FunctionalTestResult,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all monitoring and reporting tools with the MCP server\n * Note: These tools are opt-in and disabled by default for end-users.\n * Set enableMonitoringTools: true in monitoring config to enable them.\n */\nexport function registerMonitoringTools(server: McpServer): void {\n const config = sessionDataManager.getConfig();\n \n // Check if monitoring tools are enabled (opt-in, disabled by default)\n if (!config.enableMonitoringTools) {\n logger.info('Monitoring tools are disabled (opt-in). Set enableMonitoringTools: true to enable session_* tools.');\n return;\n }\n\n // Session Management Tools - session_start removed per feedback (auto-creation instead)\n registerSessionEndTool(server);\n registerSessionGetTool(server);\n registerSessionListTool(server);\n registerSessionUpdateStateTool(server);\n\n // Session Analytics Tools\n registerSessionGetCallHistoryTool(server);\n registerSessionGetTestHistoryTool(server);\n registerSessionGetScoreHistoryTool(server);\n registerSessionCalculateCurrentScoreTool(server);\n\n // Batch Operations Tools\n registerSessionsCompareTool(server);\n registerSessionsAggregateTool(server);\n registerSessionsExportTool(server);\n\n // Note: Functional Testing Support Tools are internal only, not exposed as MCP tools\n\n logger.info('Registered monitoring and reporting tools');\n}\n\n/**\n * Session Management Tools\n */\n\n// session_start tool removed - sessions are now auto-created when needed\n// Sessions are automatically created when MCP tools are called with queryPath\n// If explicit session creation is needed, provide sessionId=null and it will auto-create\n\nfunction registerSessionEndTool(server: McpServer): void {\n server.tool(\n 'session_end',\n 'End a query development session with final status',\n {\n sessionId: z.string().describe('ID of the session to end'),\n status: z.enum(['completed', 'failed', 'abandoned']).describe('Final status of the session'),\n },\n async ({ sessionId, status }) => {\n try {\n const session = await sessionDataManager.endSession(sessionId, status);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error ending session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error ending session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTool(server: McpServer): void {\n server.tool(\n 'session_get',\n 'Get complete details of a specific query development session',\n {\n sessionId: z.string().describe('ID of the session to retrieve'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionListTool(server: McpServer): void {\n server.tool(\n 'session_list',\n 'List query development sessions with optional filtering',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const sessionList = {\n totalSessions: sessions.length,\n sessions: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n language: s.language,\n status: s.status,\n startTime: s.startTime,\n endTime: s.endTime,\n mcpCallsCount: s.mcpCalls.length,\n testExecutionsCount: s.testExecutions.length,\n currentScore: s.qualityScores.length > 0 \n ? s.qualityScores[s.qualityScores.length - 1].overallScore \n : null,\n })),\n };\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(sessionList, null, 2),\n },\n ],\n recommendations: generateListRecommendations(sessions),\n };\n } catch (error) {\n logger.error('Error listing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error listing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionUpdateStateTool(server: McpServer): void {\n server.tool(\n 'session_update_state',\n 'Update the current state of a query development session',\n {\n sessionId: z.string().describe('ID of the session to update'),\n filesPresent: z.array(z.string()).optional().describe('List of files present in the query development'),\n compilationStatus: z.enum(['unknown', 'success', 'failed']).optional().describe('Current compilation status'),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']).optional().describe('Current test status'),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']).optional().describe('Documentation status'),\n },\n async ({ sessionId, filesPresent, compilationStatus, testStatus, documentationStatus }) => {\n try {\n const stateUpdate: Record = {};\n if (filesPresent !== undefined) stateUpdate.filesPresent = filesPresent;\n if (compilationStatus !== undefined) stateUpdate.compilationStatus = compilationStatus;\n if (testStatus !== undefined) stateUpdate.testStatus = testStatus;\n if (documentationStatus !== undefined) stateUpdate.documentationStatus = documentationStatus;\n\n const session = await sessionDataManager.updateSessionState(sessionId, stateUpdate);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n recommendations: generateRecommendations(session, 'session_update_state'),\n };\n } catch (error) {\n logger.error('Error updating session state:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error updating session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Session Analytics Tools\n */\n\nfunction registerSessionGetCallHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_call_history',\n 'Get MCP call history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of calls to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let calls = [...session.mcpCalls].reverse(); // Most recent first\n if (limit && limit > 0) {\n calls = calls.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalCalls: session.mcpCalls.length,\n callHistory: calls,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting call history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting call history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTestHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_test_history',\n 'Get test execution history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of test executions to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let tests = [...session.testExecutions].reverse(); // Most recent first\n if (limit && limit > 0) {\n tests = tests.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalTests: session.testExecutions.length,\n testHistory: tests,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting test history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting test history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetScoreHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_score_history',\n 'Get quality score history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of scores to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let scores = [...session.qualityScores].reverse(); // Most recent first\n if (limit && limit > 0) {\n scores = scores.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalScores: session.qualityScores.length,\n scoreHistory: scores,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting score history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting score history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionCalculateCurrentScoreTool(server: McpServer): void {\n server.tool(\n 'session_calculate_current_score',\n 'Calculate current quality score for a session based on its state',\n {\n sessionId: z.string().describe('ID of the session'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n // Calculate quality score based on current state\n const scoreRecord = calculateQualityScore(session);\n \n // Add the score to the session\n await sessionDataManager.addQualityScore(sessionId, scoreRecord);\n \n // Get updated session with new score\n const updatedSession = await sessionDataManager.getSession(sessionId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(scoreRecord, null, 2),\n },\n ],\n recommendations: generateRecommendations(updatedSession, 'session_calculate_current_score'),\n };\n } catch (error) {\n logger.error('Error calculating current score:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error calculating current score: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Batch Operations Tools\n */\n\nfunction registerSessionsCompareTool(server: McpServer): void {\n server.tool(\n 'sessions_compare',\n 'Compare multiple query development sessions across specified dimensions',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to compare'),\n dimensions: z.array(z.string()).optional().describe('Specific dimensions to compare (default: all)'),\n },\n async ({ sessionIds, dimensions }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for comparison',\n },\n ],\n isError: true,\n };\n }\n\n const comparison = await compareSessions(validSessions, dimensions);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(comparison, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error comparing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error comparing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsAggregateTool(server: McpServer): void {\n server.tool(\n 'sessions_aggregate',\n 'Generate aggregate insights from multiple sessions based on filters',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const aggregate = await aggregateSessions(sessions, filters);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(aggregate, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error aggregating sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error aggregating sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsExportTool(server: McpServer): void {\n server.tool(\n 'sessions_export',\n 'Export session data in specified format for external analysis',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to export'),\n format: z.enum(['json', 'html', 'markdown']).optional().default('json').describe('Export format'),\n },\n async ({ sessionIds, format = 'json' }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for export',\n },\n ],\n isError: true,\n };\n }\n\n const exportResult = await exportSessions(validSessions, format);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(exportResult, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error exporting sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error exporting sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Helper Functions\n */\n\n/**\n * Calculate quality score for a session based on current state and history\n */\nfunction calculateQualityScore(session: QueryDevelopmentSession): QualityScoreRecord {\n const timestamp = new Date().toISOString();\n \n // Calculate syntactic correctness (25%)\n const syntacticCorrectness = session.currentState.compilationStatus === 'success' ? 100 :\n session.currentState.compilationStatus === 'failed' ? 0 : 50;\n\n // Calculate test coverage and results (30%)\n const testCoverageResults = session.currentState.testStatus === 'passing' ? 100 :\n session.currentState.testStatus === 'failing' ? 25 :\n session.currentState.testStatus === 'no_tests' ? 0 : 50;\n\n // Calculate documentation quality (20%)\n const documentationQuality = session.currentState.documentationStatus === 'present' ? 100 :\n session.currentState.documentationStatus === 'incomplete' ? 60 :\n session.currentState.documentationStatus === 'missing' ? 0 : 50;\n\n // Calculate functional correctness (25%) - based on successful test runs\n const successfulTests = session.testExecutions.filter(t => t.success && t.type === 'test_run').length;\n const totalTests = session.testExecutions.filter(t => t.type === 'test_run').length;\n const functionalCorrectness = totalTests > 0 ? (successfulTests / totalTests) * 100 : 50;\n\n // Calculate overall score\n const overallScore = Math.round(\n (syntacticCorrectness * 0.25) +\n (testCoverageResults * 0.30) +\n (documentationQuality * 0.20) +\n (functionalCorrectness * 0.25)\n );\n\n // Determine grade\n const grade = overallScore >= 90 ? 'A' :\n overallScore >= 80 ? 'B' :\n overallScore >= 70 ? 'C' :\n overallScore >= 60 ? 'D' : 'F';\n\n // Generate recommendations\n const recommendations: string[] = [];\n if (syntacticCorrectness < 100) {\n recommendations.push('Fix compilation errors to improve syntactic correctness');\n }\n if (testCoverageResults < 70) {\n recommendations.push('Add comprehensive tests and ensure they pass');\n }\n if (documentationQuality < 80) {\n recommendations.push('Add or improve query documentation with examples');\n }\n if (functionalCorrectness < 80) {\n recommendations.push('Improve test pass rate and verify query logic');\n }\n\n return {\n scoreId: randomUUID(),\n timestamp,\n overallScore,\n dimensions: {\n syntacticCorrectness,\n testCoverageResults,\n documentationQuality,\n functionalCorrectness,\n },\n grade,\n recommendations,\n };\n}\n\n/**\n * Compare multiple sessions\n */\nasync function compareSessions(\n sessions: QueryDevelopmentSession[],\n dimensions?: string[]\n): Promise {\n const timestamp = new Date().toISOString();\n const sessionIds = sessions.map(s => s.sessionId);\n \n const results: Record = {\n sessionCount: sessions.length,\n sessionOverview: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n status: s.status,\n mcpCallsCount: s.mcpCalls.length,\n duration: s.endTime ? \n new Date(s.endTime).getTime() - new Date(s.startTime).getTime() : \n new Date().getTime() - new Date(s.startTime).getTime(),\n currentScore: s.qualityScores.length > 0 ? \n s.qualityScores[s.qualityScores.length - 1].overallScore : null,\n })),\n };\n\n if (!dimensions || dimensions.includes('quality')) {\n const qualityScores = sessions.map(s => \n s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1] : null\n );\n results.qualityComparison = {\n averageScore: qualityScores\n .filter(q => q !== null)\n .reduce((sum, q) => sum + q!.overallScore, 0) / qualityScores.filter(q => q !== null).length,\n scoreRange: {\n min: Math.min(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n max: Math.max(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n },\n };\n }\n\n if (!dimensions || dimensions.includes('activity')) {\n results.activityComparison = {\n totalMCPCalls: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0),\n averageCallsPerSession: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length,\n mostActiveTool: getMostUsedTool(sessions),\n };\n }\n\n return {\n sessionIds,\n dimensions: dimensions || ['all'],\n timestamp,\n results,\n };\n}\n\n/**\n * Aggregate insights from multiple sessions\n */\nasync function aggregateSessions(\n sessions: QueryDevelopmentSession[],\n filters: SessionFilter\n): Promise {\n const timestamp = new Date().toISOString();\n \n const completedSessions = sessions.filter(s => s.status === 'completed');\n const successRate = sessions.length > 0 ? completedSessions.length / sessions.length : 0;\n \n const qualityScores = sessions\n .map(s => s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1].overallScore : null)\n .filter(score => score !== null) as number[];\n \n const averageQualityScore = qualityScores.length > 0 ? \n qualityScores.reduce((sum, score) => sum + score, 0) / qualityScores.length : 0;\n\n const commonPatterns = identifyCommonPatterns(sessions);\n const recommendations = generateAggregateRecommendations(sessions);\n\n return {\n filters,\n timestamp,\n totalSessions: sessions.length,\n successRate,\n averageQualityScore,\n commonPatterns,\n recommendations,\n };\n}\n\n/**\n * Export sessions in specified format\n */\nasync function exportSessions(\n sessions: QueryDevelopmentSession[],\n format: 'json' | 'html' | 'markdown'\n): Promise {\n const timestamp = new Date().toISOString();\n const filename = `session-export-${timestamp.replace(/[:.]/g, '-')}.${format}`;\n \n let content: string;\n \n switch (format) {\n case 'json':\n content = JSON.stringify(sessions, null, 2);\n break;\n case 'html':\n content = generateHTMLReport(sessions);\n break;\n case 'markdown':\n content = generateMarkdownReport(sessions);\n break;\n }\n\n return {\n format,\n filename,\n content,\n timestamp,\n };\n}\n\n/**\n * Utility functions\n */\n\nfunction getMostUsedTool(sessions: QueryDevelopmentSession[]): string {\n const toolCounts: Record = {};\n \n sessions.forEach(session => {\n session.mcpCalls.forEach(call => {\n toolCounts[call.toolName] = (toolCounts[call.toolName] || 0) + 1;\n });\n });\n\n return Object.entries(toolCounts)\n .sort(([, a], [, b]) => b - a)[0]?.[0] || 'none';\n}\n\nfunction identifyCommonPatterns(sessions: QueryDevelopmentSession[]): string[] {\n const patterns: string[] = [];\n \n const commonTools = getMostUsedTool(sessions);\n if (commonTools && commonTools !== 'none') {\n patterns.push(`Most commonly used tool: ${commonTools}`);\n }\n\n const completionRate = sessions.filter(s => s.status === 'completed').length / sessions.length;\n if (completionRate > 0.8) {\n patterns.push('High completion rate indicates effective workflow');\n } else if (completionRate < 0.5) {\n patterns.push('Low completion rate suggests workflow issues');\n }\n\n return patterns;\n}\n\nfunction generateAggregateRecommendations(sessions: QueryDevelopmentSession[]): string[] {\n const recommendations: string[] = [];\n \n const failedSessions = sessions.filter(s => s.status === 'failed');\n if (failedSessions.length > sessions.length * 0.3) {\n recommendations.push('High failure rate - consider improving error handling and guidance');\n }\n\n const averageCallsPerSession = sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length;\n if (averageCallsPerSession > 20) {\n recommendations.push('High number of MCP calls per session - consider workflow optimization');\n }\n\n return recommendations;\n}\n\nfunction generateHTMLReport(sessions: QueryDevelopmentSession[]): string {\n const html = `\n\n\n\n Session Export Report\n \n\n\n

Query Development Sessions Report

\n

Generated: ${new Date().toISOString()}

\n

Total Sessions: ${sessions.length}

\n \n ${sessions.map(session => `\n
\n

Session: ${session.sessionId}

\n

Query Path: ${session.queryPath}

\n

Status: ${session.status}

\n

Language: ${session.language}

\n

Start Time: ${session.startTime}

\n

MCP Calls: ${session.mcpCalls.length}

\n

Test Executions: ${session.testExecutions.length}

\n

Quality Scores: ${session.qualityScores.length}

\n
\n `).join('')}\n\n`;\n \n return html;\n}\n\nfunction generateMarkdownReport(sessions: QueryDevelopmentSession[]): string {\n const md = `# Query Development Sessions Report\n\nGenerated: ${new Date().toISOString()}\nTotal Sessions: ${sessions.length}\n\n## Session Summary\n\n| Session ID | Query Path | Status | Language | MCP Calls | Test Executions |\n|------------|-----------|--------|----------|-----------|-----------------|\n${sessions.map(session => \n `| ${session.sessionId} | ${session.queryPath} | ${session.status} | ${session.language} | ${session.mcpCalls.length} | ${session.testExecutions.length} |`\n).join('\\n')}\n\n## Detailed Sessions\n\n${sessions.map(session => `\n### Session: ${session.sessionId}\n\n- **Query Path:** ${session.queryPath}\n- **Status:** ${session.status}\n- **Language:** ${session.language}\n- **Start Time:** ${session.startTime}\n- **End Time:** ${session.endTime || 'N/A'}\n- **MCP Calls:** ${session.mcpCalls.length}\n- **Test Executions:** ${session.testExecutions.length}\n- **Quality Scores:** ${session.qualityScores.length}\n\n${session.recommendations.length > 0 ? `\n**Current Recommendations:**\n${session.recommendations.map(rec => `- ${rec}`).join('\\n')}\n` : ''}\n`).join('\\n')}`;\n\n return md;\n}\n\nfunction _calculateAverageDuration(sessions: QueryDevelopmentSession[]): number {\n const completedSessions = sessions.filter(s => s.endTime);\n if (completedSessions.length === 0) return 0;\n\n const totalDuration = completedSessions.reduce((sum, session) => {\n return sum + (new Date(session.endTime!).getTime() - new Date(session.startTime).getTime());\n }, 0);\n\n return totalDuration / completedSessions.length;\n}\n\nfunction _identifyFailureReasons(results: FunctionalTestResult[]): string[] {\n const failedResults = results.filter(r => !r.passed);\n const reasons: Record = {};\n\n failedResults.forEach(result => {\n Object.entries(result.criteria).forEach(([criterion, passed]) => {\n if (!passed) {\n reasons[criterion] = (reasons[criterion] || 0) + 1;\n }\n });\n });\n\n return Object.entries(reasons)\n .sort(([, a], [, b]) => b - a)\n .map(([reason, count]) => `${reason}: ${count} sessions`);\n}\n\n/**\n * Generate recommendations for MCP tool responses\n * Returns a map of MCP primitive paths to recommendation reasons\n */\nfunction generateRecommendations(\n session: QueryDevelopmentSession | null,\n currentTool: string\n): Record {\n if (!session) {\n return {};\n }\n\n const recommendations: Record = {};\n\n // Session state-based recommendations\n if (session.currentState.compilationStatus === 'failed') {\n recommendations['codeql_query_format'] = 'Format query to fix potential syntax issues';\n recommendations['codeql_query_compile'] = 'Recompile after fixing syntax errors';\n } else if (session.currentState.compilationStatus === 'success') {\n if (session.currentState.testStatus === 'unknown' || session.currentState.testStatus === 'no_tests') {\n recommendations['codeql_test_run'] = 'Run tests to validate query functionality';\n } else if (session.currentState.testStatus === 'failing') {\n recommendations['session_get_test_history'] = 'Review test failures to identify issues';\n recommendations['codeql_query_compile'] = 'Verify query logic matches test expectations';\n } else if (session.currentState.testStatus === 'passing') {\n recommendations['session_calculate_current_score'] = 'Calculate quality score for completed query';\n }\n }\n\n // Tool-specific follow-up recommendations\n switch (currentTool) {\n case 'session_get':\n if (session.mcpCalls.length === 0) {\n recommendations['codeql_query_compile'] = 'Start development by compiling the query';\n }\n break;\n case 'session_end':\n if (session.status === 'completed') {\n recommendations['sessions_export'] = 'Export session data for analysis';\n }\n break;\n case 'session_calculate_current_score': {\n const latestScore = session.qualityScores[session.qualityScores.length - 1];\n if (latestScore && latestScore.overallScore < 80) {\n if (latestScore.dimensions.syntacticCorrectness < 100) {\n recommendations['codeql_query_format'] = 'Improve syntax and formatting';\n }\n if (latestScore.dimensions.testCoverageResults < 70) {\n recommendations['codeql_test_run'] = 'Improve test coverage and results';\n }\n }\n break;\n }\n case 'session_update_state':\n // Recommend next logical step based on updated state\n if (session.currentState.compilationStatus === 'success' && session.currentState.testStatus === 'unknown') {\n recommendations['codeql_test_run'] = 'Run tests now that compilation is successful';\n }\n break;\n }\n\n return recommendations;\n}\n\n/**\n * Generate recommendations for session list results\n */\nfunction generateListRecommendations(sessions: QueryDevelopmentSession[]): Record {\n const recommendations: Record = {};\n\n const activeSessions = sessions.filter(s => s.status === 'active');\n const completedSessions = sessions.filter(s => s.status === 'completed');\n\n if (activeSessions.length > 0) {\n recommendations['session_get'] = `Review details of ${activeSessions.length} active session(s)`;\n }\n\n if (completedSessions.length > 1) {\n recommendations['sessions_compare'] = 'Compare completed sessions to identify patterns';\n recommendations['sessions_aggregate'] = 'Generate aggregate insights from multiple sessions';\n }\n\n if (sessions.length > 5) {\n recommendations['sessions_export'] = 'Export session data for comprehensive analysis';\n }\n\n return recommendations;\n}", "function checkArgs(adapter, defaultData) {\n if (adapter === undefined)\n throw new Error('lowdb: missing adapter');\n if (defaultData === undefined)\n throw new Error('lowdb: missing default data');\n}\nexport class Low {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n async read() {\n const data = await this.adapter.read();\n if (data)\n this.data = data;\n }\n async write() {\n if (this.data)\n await this.adapter.write(this.data);\n }\n async update(fn) {\n fn(this.data);\n await this.write();\n }\n}\nexport class LowSync {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n read() {\n const data = this.adapter.read();\n if (data)\n this.data = data;\n }\n write() {\n if (this.data)\n this.adapter.write(this.data);\n }\n update(fn) {\n fn(this.data);\n this.write();\n }\n}\n", "import { readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Writer } from 'steno';\nexport class TextFile {\n #filename;\n #writer;\n constructor(filename) {\n this.#filename = filename;\n this.#writer = new Writer(filename);\n }\n async read() {\n let data;\n try {\n data = await readFile(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n return this.#writer.write(str);\n }\n}\nexport class TextFileSync {\n #tempFilename;\n #filename;\n constructor(filename) {\n this.#filename = filename;\n const f = filename.toString();\n this.#tempFilename = path.join(path.dirname(f), `.${path.basename(f)}.tmp`);\n }\n read() {\n let data;\n try {\n data = readFileSync(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n writeFileSync(this.#tempFilename, str);\n renameSync(this.#tempFilename, this.#filename);\n }\n}\n", "import { TextFile, TextFileSync } from './TextFile.js';\nexport class DataFile {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFile(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n async read() {\n const data = await this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n return this.#adapter.write(this.#stringify(obj));\n }\n}\nexport class DataFileSync {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFileSync(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n read() {\n const data = this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n this.#adapter.write(this.#stringify(obj));\n }\n}\n", "import { DataFile, DataFileSync } from './DataFile.js';\nexport class JSONFile extends DataFile {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\nexport class JSONFileSync extends DataFileSync {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\n", "/**\n * Session Data Management\n * Provides unified JSON storage and session lifecycle management using lowdb\n */\n\nimport { Low } from 'lowdb';\nimport { JSONFileSync } from 'lowdb/node';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n QueryDevelopmentSession,\n QueryState,\n MCPCallRecord,\n TestExecutionRecord,\n QualityScoreRecord,\n SessionFilter,\n MonitoringConfig,\n MonitoringConfigSchema,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Database schema for lowdb - sessions only\n */\ninterface SessionDatabase {\n sessions: QueryDevelopmentSession[];\n}\n\n/**\n * Session Data Manager - handles all session persistence and lifecycle\n */\nexport class SessionDataManager {\n private db: Low;\n private config: MonitoringConfig;\n private storageDir: string;\n\n constructor(configOverrides: Partial = {}) {\n this.config = MonitoringConfigSchema.parse({\n ...MonitoringConfigSchema.parse({}),\n ...configOverrides,\n });\n\n this.storageDir = this.config.storageLocation;\n this.ensureStorageDirectory();\n\n const adapter = new JSONFileSync(join(this.storageDir, 'sessions.json'));\n this.db = new Low(adapter, {\n sessions: [],\n });\n\n this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n async initialize(): Promise {\n await this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n private async initializeDatabase(): Promise {\n try {\n await this.db.read();\n \n logger.info(`Session data manager initialized with ${this.db.data.sessions.length} sessions`);\n } catch (error) {\n logger.error('Failed to initialize session database:', error);\n throw error;\n }\n }\n\n /**\n * Ensure storage directory structure exists\n */\n private ensureStorageDirectory(): void {\n try {\n // mkdirSync with recursive: true is a no-op if directories already exist\n mkdirSync(this.storageDir, { recursive: true });\n\n // Create subdirectories\n const subdirs = ['sessions-archive', 'exports'];\n for (const subdir of subdirs) {\n mkdirSync(join(this.storageDir, subdir), { recursive: true });\n }\n\n // Use 'wx' flag (exclusive create) to atomically create config only\n // if it doesn't exist, avoiding TOCTOU race (CWE-367).\n const configPath = join(this.storageDir, 'config.json');\n try {\n writeFileSync(configPath, JSON.stringify(this.config, null, 2), { flag: 'wx' });\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n\n logger.debug(`Storage directory initialized: ${this.storageDir}`);\n } catch (error) {\n logger.error('Failed to create storage directory:', error);\n throw error;\n }\n }\n\n /**\n * Start a new query development session\n */\n async startSession(\n queryPath: string,\n language?: string,\n queryType?: string,\n description?: string\n ): Promise {\n const sessionId = randomUUID();\n const startTime = new Date().toISOString();\n\n const session: QueryDevelopmentSession = {\n sessionId,\n queryPath,\n language: language || 'unknown',\n queryType,\n description,\n startTime,\n status: 'active',\n mcpCalls: [],\n testExecutions: [],\n qualityScores: [],\n currentState: {\n filesPresent: [],\n compilationStatus: 'unknown',\n testStatus: 'unknown',\n documentationStatus: 'unknown',\n lastActivity: startTime,\n },\n recommendations: [],\n };\n\n await this.db.read();\n this.db.data.sessions.push(session);\n await this.db.write();\n\n logger.info(`Started new session: ${sessionId} for query: ${queryPath}`);\n return sessionId;\n }\n\n /**\n * End a session with final status\n */\n async endSession(\n sessionId: string,\n status: 'completed' | 'failed' | 'abandoned'\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.status = status;\n session.endTime = new Date().toISOString();\n session.currentState.lastActivity = session.endTime;\n\n await this.db.write();\n\n // Archive completed session if enabled\n if (this.config.archiveCompletedSessions && status === 'completed') {\n await this.archiveSession(sessionId);\n }\n\n logger.info(`Ended session: ${sessionId} with status: ${status}`);\n return session;\n }\n\n /**\n * Get a specific session by ID\n */\n async getSession(sessionId: string): Promise {\n await this.db.read();\n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n return session || null;\n }\n\n /**\n * List sessions with optional filtering\n */\n async listSessions(filters?: SessionFilter): Promise {\n await this.db.read();\n let sessions = [...this.db.data.sessions];\n\n if (filters) {\n if (filters.queryPath) {\n sessions = sessions.filter(s => s.queryPath.includes(filters.queryPath!));\n }\n if (filters.status) {\n sessions = sessions.filter(s => s.status === filters.status);\n }\n if (filters.language) {\n sessions = sessions.filter(s => s.language === filters.language);\n }\n if (filters.queryType) {\n sessions = sessions.filter(s => s.queryType === filters.queryType);\n }\n if (filters.dateRange) {\n const [start, end] = filters.dateRange;\n sessions = sessions.filter(s => \n s.startTime >= start && s.startTime <= end\n );\n }\n }\n\n return sessions;\n }\n\n /**\n * Update session state\n */\n async updateSessionState(\n sessionId: string,\n stateUpdate: Partial\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.currentState = {\n ...session.currentState,\n ...stateUpdate,\n lastActivity: new Date().toISOString(),\n };\n\n await this.db.write();\n return session;\n }\n\n /**\n * Add MCP call record to session\n */\n async addMCPCall(sessionId: string, callRecord: MCPCallRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for MCP call: ${sessionId}`);\n return;\n }\n\n session.mcpCalls.push(callRecord);\n session.currentState.lastActivity = callRecord.timestamp;\n\n // Update next suggested tool if provided\n if (callRecord.nextSuggestedTool) {\n session.nextSuggestedTool = callRecord.nextSuggestedTool;\n }\n\n await this.db.write();\n }\n\n /**\n * Add test execution record to session\n */\n async addTestExecution(sessionId: string, testRecord: TestExecutionRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for test execution: ${sessionId}`);\n return;\n }\n\n session.testExecutions.push(testRecord);\n session.currentState.lastActivity = testRecord.timestamp;\n\n // Update compilation/test status based on execution\n if (testRecord.type === 'compilation') {\n session.currentState.compilationStatus = testRecord.success ? 'success' : 'failed';\n } else if (testRecord.type === 'test_run') {\n session.currentState.testStatus = testRecord.success ? 'passing' : 'failing';\n }\n\n await this.db.write();\n }\n\n /**\n * Add quality score record to session\n */\n async addQualityScore(sessionId: string, scoreRecord: QualityScoreRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for quality score: ${sessionId}`);\n return;\n }\n\n session.qualityScores.push(scoreRecord);\n session.currentState.lastActivity = scoreRecord.timestamp;\n session.recommendations = scoreRecord.recommendations;\n\n await this.db.write();\n }\n\n /**\n * Archive a completed session to monthly file\n */\n private async archiveSession(sessionId: string): Promise {\n try {\n const session = await this.getSession(sessionId);\n if (!session) return;\n\n const date = new Date(session.endTime || session.startTime);\n const monthDir = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;\n const archiveDir = join(this.storageDir, 'sessions-archive', monthDir);\n\n mkdirSync(archiveDir, { recursive: true });\n\n const archiveFile = join(archiveDir, `${sessionId}.json`);\n writeFileSync(archiveFile, JSON.stringify(session, null, 2));\n\n // Remove from active sessions\n await this.db.read();\n this.db.data.sessions = this.db.data.sessions.filter(s => s.sessionId !== sessionId);\n await this.db.write();\n\n logger.info(`Archived session: ${sessionId} to ${archiveFile}`);\n } catch (error) {\n logger.error(`Failed to archive session ${sessionId}:`, error);\n }\n }\n\n /**\n * Get active sessions for a specific query path\n */\n async getActiveSessionsForQuery(queryPath: string): Promise {\n await this.db.read();\n return this.db.data.sessions.filter(s => \n s.queryPath === queryPath && s.status === 'active'\n );\n }\n\n /**\n * Clean up old sessions based on retention policy\n */\n async cleanupOldSessions(): Promise {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);\n const cutoffTimestamp = cutoffDate.toISOString();\n\n await this.db.read();\n const sessionsToRemove = this.db.data.sessions.filter(s => \n s.endTime && s.endTime < cutoffTimestamp\n );\n\n if (sessionsToRemove.length > 0) {\n this.db.data.sessions = this.db.data.sessions.filter(s => \n !s.endTime || s.endTime >= cutoffTimestamp\n );\n await this.db.write();\n\n logger.info(`Cleaned up ${sessionsToRemove.length} old sessions`);\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): MonitoringConfig {\n return this.config;\n }\n\n /**\n * Update configuration\n */\n async updateConfig(configUpdate: Partial): Promise {\n this.config = MonitoringConfigSchema.parse({\n ...this.config,\n ...configUpdate,\n });\n\n // Update config.json file only\n const configPath = join(this.storageDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(this.config, null, 2));\n\n logger.info('Updated monitoring configuration');\n }\n}\n\n/**\n * Parse boolean environment variable\n */\nfunction parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolean {\n if (envVar === undefined) return defaultValue;\n return envVar.toLowerCase() === 'true' || envVar === '1';\n}\n\n// Export singleton instance with environment variable support\nexport const sessionDataManager = new SessionDataManager({\n storageLocation: process.env.MONITORING_STORAGE_LOCATION || '.ql-mcp-tracking/',\n enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false),\n});", "import { z } from 'zod';\n\n/**\n * Monitoring and Reporting types for CodeQL Development MCP Server\n * Based on the specification in docs/mcp-server-monitoring-and-reporting.md\n */\n\n/**\n * MCP Call Record - captures individual MCP tool calls\n */\nexport const MCPCallRecordSchema = z.object({\n callId: z.string(),\n timestamp: z.string(), // ISO timestamp\n toolName: z.string(),\n parameters: z.record(z.any()),\n result: z.any(),\n success: z.boolean(),\n duration: z.number(), // milliseconds\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type MCPCallRecord = z.infer;\n\n/**\n * Test Execution Record - captures query compilation and test runs\n */\nexport const TestExecutionRecordSchema = z.object({\n executionId: z.string(),\n timestamp: z.string(),\n type: z.enum(['compilation', 'test_run', 'database_build']),\n success: z.boolean(),\n details: z.record(z.any()),\n metrics: z.object({\n passRate: z.number().optional(),\n coverage: z.number().optional(),\n performance: z.number().optional(),\n }).optional(),\n});\n\nexport type TestExecutionRecord = z.infer;\n\n/**\n * Quality Score Record - multi-dimensional quality assessment\n */\nexport const QualityScoreRecordSchema = z.object({\n scoreId: z.string(),\n timestamp: z.string(),\n overallScore: z.number().min(0).max(100), // 0-100\n dimensions: z.object({\n syntacticCorrectness: z.number().min(0).max(100),\n testCoverageResults: z.number().min(0).max(100),\n documentationQuality: z.number().min(0).max(100),\n functionalCorrectness: z.number().min(0).max(100),\n }),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n recommendations: z.array(z.string()),\n});\n\nexport type QualityScoreRecord = z.infer;\n\n/**\n * Query State - current state of the query development\n */\nexport const QueryStateSchema = z.object({\n filesPresent: z.array(z.string()),\n compilationStatus: z.enum(['unknown', 'success', 'failed']),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']),\n lastActivity: z.string(), // ISO timestamp\n});\n\nexport type QueryState = z.infer;\n\n/**\n * Query Development Session - main data structure for tracking\n */\nexport const QueryDevelopmentSessionSchema = z.object({\n // Session Metadata\n sessionId: z.string(),\n queryPath: z.string(),\n language: z.string(),\n queryType: z.string().optional(),\n description: z.string().optional(),\n startTime: z.string(), // ISO timestamp\n endTime: z.string().optional(), // ISO timestamp\n status: z.enum(['active', 'completed', 'failed', 'abandoned']),\n\n // MCP Call History\n mcpCalls: z.array(MCPCallRecordSchema),\n\n // Test Execution Records\n testExecutions: z.array(TestExecutionRecordSchema),\n\n // Quality Metrics\n qualityScores: z.array(QualityScoreRecordSchema),\n\n // Development State\n currentState: QueryStateSchema,\n recommendations: z.array(z.string()),\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type QueryDevelopmentSession = z.infer;\n\n/**\n * Session Filter for listing and searching\n */\nexport const SessionFilterSchema = z.object({\n queryPath: z.string().optional(),\n status: z.string().optional(),\n dateRange: z.tuple([z.string(), z.string()]).optional(),\n language: z.string().optional(),\n queryType: z.string().optional(),\n});\n\nexport type SessionFilter = z.infer;\n\n/**\n * Comparison Report for analyzing multiple sessions\n */\nexport const ComparisonReportSchema = z.object({\n sessionIds: z.array(z.string()),\n dimensions: z.array(z.string()),\n timestamp: z.string(),\n results: z.record(z.any()),\n});\n\nexport type ComparisonReport = z.infer;\n\n/**\n * Aggregate Report for batch analysis\n */\nexport const AggregateReportSchema = z.object({\n filters: SessionFilterSchema,\n timestamp: z.string(),\n totalSessions: z.number(),\n successRate: z.number(),\n averageQualityScore: z.number(),\n commonPatterns: z.array(z.string()),\n recommendations: z.array(z.string()),\n});\n\nexport type AggregateReport = z.infer;\n\n/**\n * Export Result for data export operations\n */\nexport const ExportResultSchema = z.object({\n format: z.enum(['json', 'html', 'markdown']),\n filename: z.string(),\n content: z.string(),\n timestamp: z.string(),\n});\n\nexport type ExportResult = z.infer;\n\n/**\n * Functional Test Result for automated testing\n */\nexport const FunctionalTestResultSchema = z.object({\n sessionId: z.string(),\n queryPath: z.string(),\n passed: z.boolean(),\n criteria: z.record(z.any()),\n details: z.record(z.any()),\n timestamp: z.string(),\n});\n\nexport type FunctionalTestResult = z.infer;\n\n/**\n * Test Report for comprehensive test analysis\n */\nexport const TestReportSchema = z.object({\n sessionIds: z.array(z.string()),\n criteria: z.record(z.any()),\n timestamp: z.string(),\n overallPassRate: z.number(),\n results: z.array(FunctionalTestResultSchema),\n summary: z.record(z.any()),\n});\n\nexport type TestReport = z.infer;\n\n/**\n * Monitoring Configuration\n */\nexport const MonitoringConfigSchema = z.object({\n storageLocation: z.string().default('.ql-mcp-tracking/'),\n autoTrackSessions: z.boolean().default(true),\n retentionDays: z.number().default(90),\n includeCallParameters: z.boolean().default(true),\n includeCallResults: z.boolean().default(true),\n maxActiveSessionsPerQuery: z.number().default(3),\n scoringFrequency: z.enum(['per_call', 'periodic', 'manual']).default('per_call'),\n archiveCompletedSessions: z.boolean().default(true),\n enableRecommendations: z.boolean().default(true),\n enableMonitoringTools: z.boolean().default(false), // Opt-in: session_* tools disabled by default for end-users\n});\n\nexport type MonitoringConfig = z.infer;"], - "mappings": "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", - "names": ["resolve", "pathToFileURL", "z", "mkdirSync", "join", "resolve", "mkdirSync", "dirname", "resolve", "mkdirSync", "timestamp", "join", "writeFileSync", "existsSync", "mkdirSync", "dirname", "join", "resolve", "fileURLToPath", "__filename", "__dirname", "dirname", "normalizedDir", "resolve", "join", "writeFileSync", "existsSync", "logger", "resolve", "executeCodeQLCommand", "mkdirSync", "dirname", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "readFile", "z", "exception", "map", "schema", "type", "extend", "str", "string", "z", "z", "z", "z", "z", "z", "setTimeout", "join", "resolve", "setTimeout", "join", "join", "resolve", "pathToFileURL", "z", "z", "z", "z", "z", "z", "writeFileSync", "readFileSync", "existsSync", "join", "dirname", "basename", "mkdirSync", "z", "z", "z", "z", "z", "z", "join", "resolve", "resolve", "join", "z", "z", "resolve", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "fs", "path", "getLanguageExtension", "z", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "readFileSync", "existsSync", "join", "join", "existsSync", "readFileSync", "z", "basename", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "z", "basename", "z", "randomUUID", "readFileSync", "writeFileSync", "path", "path", "readFileSync", "str", "writeFileSync", "parse", "mkdirSync", "writeFileSync", "join", "z", "join", "mkdirSync", "writeFileSync", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] -} diff --git a/server/esbuild.config.js b/server/esbuild.config.js index efd7fce6..1096cea8 100644 --- a/server/esbuild.config.js +++ b/server/esbuild.config.js @@ -3,8 +3,8 @@ import { chmod, mkdir } from 'fs/promises'; import { existsSync } from 'fs'; const distDir = 'dist'; -const entryFile = 'src/ql-mcp-server.ts'; -const outFile = 'dist/ql-mcp-server.js'; +const entryFile = 'src/codeql-development-mcp-server.ts'; +const outFile = 'dist/codeql-development-mcp-server.js'; // Ensure dist directory exists if (!existsSync(distDir)) { @@ -17,7 +17,7 @@ const config = { outfile: outFile, format: 'esm', platform: 'node', - target: 'node18', + target: 'node22', sourcemap: true, external: [ '@modelcontextprotocol/sdk', diff --git a/server/package.json b/server/package.json index aa9f3ef6..1e1fe8cf 100644 --- a/server/package.json +++ b/server/package.json @@ -1,12 +1,30 @@ { - "name": "codeql-development-mcp-server", + "name": "@advanced-security/codeql-development-mcp-server", "version": "2.23.9", "description": "An MCP server supporting LLM requests for CodeQL development tools and resources.", - "main": "dist/ql-mcp-server.js", - "types": "dist/ql-mcp-server.d.ts", + "main": "dist/codeql-development-mcp-server.js", + "types": "dist/codeql-development-mcp-server.d.ts", "type": "module", "bin": { - "codeql-mcp-server": "./dist/ql-mcp-server.js" + "codeql-development-mcp-server": "./dist/codeql-development-mcp-server.js" + }, + "files": [ + "dist/", + "ql/actions/tools/src/", + "ql/cpp/tools/src/", + "ql/csharp/tools/src/", + "ql/go/tools/src/", + "ql/java/tools/src/", + "ql/javascript/tools/src/", + "ql/python/tools/src/", + "ql/ruby/tools/src/", + "ql/swift/tools/src/", + "package.json", + "README.md" + ], + "publishConfig": { + "access": "public", + "registry": "https://npm.pkg.github.com" }, "keywords": [ "codeql", @@ -22,9 +40,18 @@ ], "author": "@github/ps-codeql", "license": "SEE LICENSE IN LICENSE", + "repository": { + "type": "git", + "url": "https://github.com/advanced-security/codeql-development-mcp-server.git", + "directory": "server" + }, + "homepage": "https://github.com/advanced-security/codeql-development-mcp-server#readme", + "bugs": { + "url": "https://github.com/advanced-security/codeql-development-mcp-server/issues" + }, "engines": { - "node": ">=25.2.1", - "npm": ">=11.6.2" + "node": ">=22.0.0", + "npm": ">=10.0.0" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", @@ -56,12 +83,12 @@ "build:all": "npm run build && npm run test:ql:fail-fast", "bundle": "node esbuild.config.js", "clean": "rm -rf dist", - "dev:stdio": "npm run build && TRANSPORT_MODE=stdio node dist/ql-mcp-server.js", - "dev:http": "npm run build && TRANSPORT_MODE=http node dist/ql-mcp-server.js", + "dev:stdio": "npm run build && TRANSPORT_MODE=stdio node dist/codeql-development-mcp-server.js", + "dev:http": "npm run build && TRANSPORT_MODE=http node dist/codeql-development-mcp-server.js", "format": "prettier --write 'src/**/*.ts'", "lint": "eslint src test --ext .ts", "lint:fix": "eslint src test --ext .ts --fix", - "start": "npm run build && node dist/ql-mcp-server.js", + "start": "npm run build && node dist/codeql-development-mcp-server.js", "test": "npm run build && npm run test:ts:coverage", "test:coverage": "npm run test:ts:coverage", "test:ql": "./scripts/run-query-unit-tests.sh", diff --git a/server/ql/actions/tools/src/codeql-pack.yml b/server/ql/actions/tools/src/codeql-pack.yml index 03c15633..4587f1cb 100644 --- a/server/ql/actions/tools/src/codeql-pack.yml +++ b/server/ql/actions/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-actions-tools-src +name: advanced-security/ql-mcp-actions-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for actions language' library: false dependencies: codeql/actions-all: 0.4.25 diff --git a/server/ql/actions/tools/test/codeql-pack.yml b/server/ql/actions/tools/test/codeql-pack.yml index 44e2dbe3..77319644 100644 --- a/server/ql/actions/tools/test/codeql-pack.yml +++ b/server/ql/actions/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-actions-tools-test +name: advanced-security/ql-mcp-actions-tools-test version: 2.23.9 dependencies: - ql-mcp-actions-tools-src: 2.23.9 + advanced-security/ql-mcp-actions-tools-src: ${workspace} extractor: actions diff --git a/server/ql/cpp/tools/src/codeql-pack.yml b/server/ql/cpp/tools/src/codeql-pack.yml index 8d41b627..5083e3b6 100644 --- a/server/ql/cpp/tools/src/codeql-pack.yml +++ b/server/ql/cpp/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-cpp-tools-src +name: advanced-security/ql-mcp-cpp-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for cpp language' library: false dependencies: codeql/cpp-all: 6.1.4 diff --git a/server/ql/cpp/tools/test/codeql-pack.yml b/server/ql/cpp/tools/test/codeql-pack.yml index f27ecbbf..5a0b0360 100644 --- a/server/ql/cpp/tools/test/codeql-pack.yml +++ b/server/ql/cpp/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-cpp-tools-test +name: advanced-security/ql-mcp-cpp-tools-test version: 2.23.9 dependencies: - ql-mcp-cpp-tools-src: 2.23.9 + advanced-security/ql-mcp-cpp-tools-src: ${workspace} extractor: cpp diff --git a/server/ql/csharp/tools/src/codeql-pack.yml b/server/ql/csharp/tools/src/codeql-pack.yml index ad9da6f8..ec00d120 100644 --- a/server/ql/csharp/tools/src/codeql-pack.yml +++ b/server/ql/csharp/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-csharp-tools-src +name: advanced-security/ql-mcp-csharp-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for csharp language' library: false dependencies: codeql/csharp-all: 5.4.4 diff --git a/server/ql/csharp/tools/test/codeql-pack.yml b/server/ql/csharp/tools/test/codeql-pack.yml index 032c7335..e6a64b97 100644 --- a/server/ql/csharp/tools/test/codeql-pack.yml +++ b/server/ql/csharp/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-csharp-tools-test +name: advanced-security/ql-mcp-csharp-tools-test version: 2.23.9 dependencies: - ql-mcp-csharp-tools-src: 2.23.9 + advanced-security/ql-mcp-csharp-tools-src: ${workspace} extractor: csharp diff --git a/server/ql/go/tools/src/codeql-pack.yml b/server/ql/go/tools/src/codeql-pack.yml index 03d9ba32..9f86bd96 100644 --- a/server/ql/go/tools/src/codeql-pack.yml +++ b/server/ql/go/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-go-tools-src +name: advanced-security/ql-mcp-go-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for go language' library: false dependencies: codeql/go-all: 5.0.0 diff --git a/server/ql/go/tools/test/codeql-pack.yml b/server/ql/go/tools/test/codeql-pack.yml index 3861b123..73a2faec 100644 --- a/server/ql/go/tools/test/codeql-pack.yml +++ b/server/ql/go/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-go-tools-test +name: advanced-security/ql-mcp-go-tools-test version: 2.23.9 dependencies: - ql-mcp-go-tools-src: 2.23.9 + advanced-security/ql-mcp-go-tools-src: ${workspace} extractor: go diff --git a/server/ql/java/tools/src/codeql-pack.yml b/server/ql/java/tools/src/codeql-pack.yml index 47f77e5e..3a7e663d 100644 --- a/server/ql/java/tools/src/codeql-pack.yml +++ b/server/ql/java/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-java-tools-src +name: advanced-security/ql-mcp-java-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for java language' library: false dependencies: codeql/java-all: 7.8.3 diff --git a/server/ql/java/tools/test/codeql-pack.yml b/server/ql/java/tools/test/codeql-pack.yml index dc5c6985..774fdb84 100644 --- a/server/ql/java/tools/test/codeql-pack.yml +++ b/server/ql/java/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-java-tools-test +name: advanced-security/ql-mcp-java-tools-test version: 2.23.9 dependencies: - ql-mcp-java-tools-src: 2.23.9 + advanced-security/ql-mcp-java-tools-src: ${workspace} extractor: java diff --git a/server/ql/javascript/examples/src/codeql-pack.yml b/server/ql/javascript/examples/src/codeql-pack.yml index 2a4ffaaa..eb93e98f 100644 --- a/server/ql/javascript/examples/src/codeql-pack.yml +++ b/server/ql/javascript/examples/src/codeql-pack.yml @@ -1,4 +1,4 @@ -name: ql-mcp-javascript-examples-src +name: advanced-security/ql-mcp-javascript-examples-src version: '0.0.1' library: false dependencies: diff --git a/server/ql/javascript/examples/test/codeql-pack.yml b/server/ql/javascript/examples/test/codeql-pack.yml index c9ff1c88..e775d08b 100644 --- a/server/ql/javascript/examples/test/codeql-pack.yml +++ b/server/ql/javascript/examples/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-javascript-examples-test +name: advanced-security/ql-mcp-javascript-examples-test version: '0.0.1' dependencies: - ql-mcp-javascript-examples-src: '*' + advanced-security/ql-mcp-javascript-examples-src: ${workspace} extractor: javascript diff --git a/server/ql/javascript/tools/src/codeql-pack.yml b/server/ql/javascript/tools/src/codeql-pack.yml index 07de27e6..f2b63caa 100644 --- a/server/ql/javascript/tools/src/codeql-pack.yml +++ b/server/ql/javascript/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-javascript-tools-src +name: advanced-security/ql-mcp-javascript-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for javascript language' library: false dependencies: codeql/javascript-all: 2.6.19 diff --git a/server/ql/javascript/tools/test/codeql-pack.yml b/server/ql/javascript/tools/test/codeql-pack.yml index 28a80810..d1c9f4c5 100644 --- a/server/ql/javascript/tools/test/codeql-pack.yml +++ b/server/ql/javascript/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-javascript-tools-test +name: advanced-security/ql-mcp-javascript-tools-test version: 2.23.9 dependencies: - ql-mcp-javascript-tools-src: 2.23.9 + advanced-security/ql-mcp-javascript-tools-src: ${workspace} extractor: javascript diff --git a/server/ql/python/tools/src/codeql-pack.yml b/server/ql/python/tools/src/codeql-pack.yml index 68b1fa14..957a4708 100644 --- a/server/ql/python/tools/src/codeql-pack.yml +++ b/server/ql/python/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-python-tools-src +name: advanced-security/ql-mcp-python-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for python language' library: false dependencies: codeql/python-all: 5.0.4 diff --git a/server/ql/python/tools/test/codeql-pack.yml b/server/ql/python/tools/test/codeql-pack.yml index df40c209..6a1d6118 100644 --- a/server/ql/python/tools/test/codeql-pack.yml +++ b/server/ql/python/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-python-tools-test +name: advanced-security/ql-mcp-python-tools-test version: 2.23.9 dependencies: - ql-mcp-python-tools-src: 2.23.9 + advanced-security/ql-mcp-python-tools-src: ${workspace} extractor: python diff --git a/server/ql/ruby/tools/src/codeql-pack.yml b/server/ql/ruby/tools/src/codeql-pack.yml index 0d76ab3d..fd06610e 100644 --- a/server/ql/ruby/tools/src/codeql-pack.yml +++ b/server/ql/ruby/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-ruby-tools-src +name: advanced-security/ql-mcp-ruby-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for ruby language' library: false dependencies: codeql/ruby-all: 5.1.7 diff --git a/server/ql/ruby/tools/test/codeql-pack.yml b/server/ql/ruby/tools/test/codeql-pack.yml index 97828a66..a1e18556 100644 --- a/server/ql/ruby/tools/test/codeql-pack.yml +++ b/server/ql/ruby/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-ruby-tools-test +name: advanced-security/ql-mcp-ruby-tools-test version: 2.23.9 dependencies: - ql-mcp-ruby-tools-src: 2.23.9 + advanced-security/ql-mcp-ruby-tools-src: ${workspace} extractor: ruby diff --git a/server/ql/swift/tools/src/codeql-pack.yml b/server/ql/swift/tools/src/codeql-pack.yml index 9f5c06ad..b79752f7 100644 --- a/server/ql/swift/tools/src/codeql-pack.yml +++ b/server/ql/swift/tools/src/codeql-pack.yml @@ -1,5 +1,6 @@ -name: ql-mcp-swift-tools-src +name: advanced-security/ql-mcp-swift-tools-src version: 2.23.9 +description: 'Queries for codeql-development-mcp-server tools for swift language' library: false dependencies: codeql/swift-all: 6.1.0 diff --git a/server/ql/swift/tools/test/codeql-pack.yml b/server/ql/swift/tools/test/codeql-pack.yml index d1dd4492..bd4e5eef 100644 --- a/server/ql/swift/tools/test/codeql-pack.yml +++ b/server/ql/swift/tools/test/codeql-pack.yml @@ -1,5 +1,5 @@ -name: ql-mcp-swift-tools-test +name: advanced-security/ql-mcp-swift-tools-test version: 2.23.9 dependencies: - ql-mcp-swift-tools-src: 2.23.9 + advanced-security/ql-mcp-swift-tools-src: ${workspace} extractor: swift diff --git a/server/src/ql-mcp-server.ts b/server/src/codeql-development-mcp-server.ts similarity index 86% rename from server/src/ql-mcp-server.ts rename to server/src/codeql-development-mcp-server.ts index 76551de9..f62c20b4 100644 --- a/server/src/ql-mcp-server.ts +++ b/server/src/codeql-development-mcp-server.ts @@ -16,13 +16,17 @@ import { registerLanguageResources } from './resources/language-resources'; import { registerWorkflowPrompts } from './prompts/workflow-prompts'; import { registerMonitoringTools } from './tools/monitoring-tools'; import { sessionDataManager } from './lib/session-data-manager'; +import { resolveCodeQLBinary } from './lib/cli-executor'; +import { packageRootDir } from './utils/package-paths'; import { logger } from './utils/logger'; -// Load environment variables -dotenv.config(); +// Load environment variables from a .env file co-located with the package root. +// Uses the package directory (not CWD) so that npm-installed users don't +// accidentally inherit a .env from their project. +dotenv.config({ path: resolve(packageRootDir, '.env') }); const PACKAGE_NAME = 'codeql-development-mcp-server'; -const VERSION = '1.0.0'; +const VERSION = '2.23.9'; /** * Start the MCP server @@ -30,6 +34,12 @@ const VERSION = '1.0.0'; export async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise { logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`); + // Resolve the CodeQL CLI binary path (honors CODEQL_PATH env var). + // This must happen before any tool registration so that all CodeQL commands + // use the user-specified binary. + const codeqlBinary = resolveCodeQLBinary(); + logger.info(`CodeQL CLI binary: ${codeqlBinary}`); + const server = new McpServer({ name: PACKAGE_NAME, version: VERSION, diff --git a/server/src/lib/cli-executor.ts b/server/src/lib/cli-executor.ts index 6b9c1083..2bd54756 100644 --- a/server/src/lib/cli-executor.ts +++ b/server/src/lib/cli-executor.ts @@ -3,6 +3,8 @@ */ import { execFile } from 'child_process'; +import { existsSync } from 'fs'; +import { basename, delimiter, dirname, isAbsolute } from 'path'; import { promisify } from 'util'; import { logger } from '../utils/logger'; @@ -103,6 +105,76 @@ function isCommandAllowed(command: string): boolean { return ALLOWED_COMMANDS.has(command) || (testCommands !== null && testCommands.has(command)); } +// Resolved CodeQL binary directory from CODEQL_PATH. +// When set, this directory is prepended to PATH for all child processes +// so that `execFile('codeql', ...)` finds the correct binary via execvp(). +// Using PATH lookup (rather than an absolute path) is essential because +// execvp() handles shell-script shebangs correctly, whereas passing an +// absolute path to execFile() can fail with ENOENT for shell scripts. +let resolvedCodeQLDir: string | null = null; + +/** + * Resolve the CodeQL CLI binary path. + * + * Resolution order: + * 1. `CODEQL_PATH` environment variable — must point to an existing file whose + * basename is `codeql` (or `codeql.exe` / `codeql.cmd` on Windows). + * The parent directory is prepended to PATH for child processes. + * 2. Falls back to the bare `codeql` command (resolved via PATH at exec time). + * + * The resolved value is cached for the lifetime of the process. Call this once + * at startup; subsequent calls are a no-op and return the cached value. + */ +export function resolveCodeQLBinary(): string { + const envPath = process.env.CODEQL_PATH; + + if (!envPath) { + resolvedCodeQLDir = null; + return 'codeql'; + } + + // Validate the path points to a plausible CodeQL binary + const base = basename(envPath).toLowerCase(); + const validBaseNames = ['codeql', 'codeql.exe', 'codeql.cmd']; + if (!validBaseNames.includes(base)) { + throw new Error( + `CODEQL_PATH must point to a CodeQL CLI binary (expected basename: codeql), got: ${base}` + ); + } + + // Require an absolute path to avoid ambiguity + if (!isAbsolute(envPath)) { + throw new Error( + `CODEQL_PATH must be an absolute path, got: ${envPath}` + ); + } + + // Verify the file exists + if (!existsSync(envPath)) { + throw new Error( + `CODEQL_PATH points to a file that does not exist: ${envPath}` + ); + } + + resolvedCodeQLDir = dirname(envPath); + logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`); + return envPath; +} + +/** + * Get the currently resolved CodeQL binary directory, or null if using PATH. + */ +export function getResolvedCodeQLDir(): string | null { + return resolvedCodeQLDir; +} + +/** + * Reset the resolved CodeQL binary to the default (for testing only). + */ +export function resetResolvedCodeQLBinary(): void { + resolvedCodeQLDir = null; +} + /** * Sanitize a CLI argument to prevent potential issues with special characters. * @@ -163,6 +235,17 @@ function getSafeEnvironment(additionalEnv?: Record): Record { try { diff --git a/server/src/lib/cli-tool-registry.ts b/server/src/lib/cli-tool-registry.ts index 742d9531..8f4b97f9 100644 --- a/server/src/lib/cli-tool-registry.ts +++ b/server/src/lib/cli-tool-registry.ts @@ -8,22 +8,10 @@ import { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './c import { logger } from '../utils/logger'; import { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator'; import { getOrCreateLogDirectory } from './log-directory-manager'; +import { packageRootDir, resolveToolQueryPackPath, workspaceRootDir } from '../utils/package-paths'; import { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs'; -import { basename, dirname, join, resolve } from 'path'; +import { basename, dirname, isAbsolute, join, resolve } from 'path'; import { createProjectTempDir } from '../utils/temp-dir'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); -// Calculate the repository root directory -// When running from source: server/src/lib/ -> go up 3 levels to repo root -// When running from bundle: server/dist/ -> go up 2 levels to repo root -// The bundled file flattens the structure, so we detect based on path -// Normalize path separators for cross-platform compatibility (Windows uses '\', Unix uses '/') -const normalizedDir = __dirname.replace(/\\/g, '/'); -const repoRootDir = normalizedDir.includes('src/lib') - ? resolve(__dirname, '..', '..', '..') // From source: server/src/lib -> repo root - : resolve(__dirname, '..', '..'); // From bundle: server/dist -> repo root export type { CLIExecutionResult } from './cli-executor'; @@ -226,16 +214,20 @@ export function registerCLITool(server: McpServer, definition: CLIToolDefinition case 'codeql_test_extract': case 'codeql_test_run': case 'codeql_resolve_tests': - // Handle tests parameter as positional arguments for test tools + // Handle tests parameter as positional arguments for test tools. + // Resolve relative paths against workspaceRootDir since the MCP + // server's cwd may not be the repo root. if (tests && Array.isArray(tests)) { - positionalArgs = [...positionalArgs, ...tests as string[]]; + positionalArgs = [...positionalArgs, ...(tests as string[]).map( + t => isAbsolute(t) ? t : resolve(workspaceRootDir, t) + )]; } break; case 'codeql_query_run': { // Resolve database path to absolute path if it's relative if (options.database && typeof options.database === 'string' && !options.database.startsWith('/')) { - options.database = resolve(repoRootDir, options.database); + options.database = resolve(workspaceRootDir, options.database); logger.info(`Resolved database path to: ${options.database}`); } @@ -391,14 +383,19 @@ export function registerCLITool(server: McpServer, definition: CLIToolDefinition let result: CLIExecutionResult; if (command === 'codeql') { - // For pack commands, set the working directory to where qlpack.yml is located + // For pack commands, set the working directory to where qlpack.yml is located. + // Resolve to absolute path since the MCP server's cwd may differ from + // the workspace root (especially when launched by VS Code). let cwd: string | undefined; if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) { - cwd = (dir || packDir) as string; + const rawCwd = (dir || packDir) as string; + // Resolve relative paths against the workspace root, not process.cwd(), + // since the MCP server's cwd may differ (especially in VS Code). + cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd); } // Add --additional-packs for commands that need to access local test packs - const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || 'server/ql/javascript/examples/'; + const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || resolve(packageRootDir, 'ql', 'javascript', 'examples'); if (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile') { options['additional-packs'] = additionalPacksPath; } @@ -610,7 +607,7 @@ async function resolveQueryPath( try { // Determine the query pack path - use absolute path to ensure it works regardless of cwd - const defaultPackPath = resolve(repoRootDir, 'server', 'ql', queryLanguage as string, 'tools', 'src'); + const defaultPackPath = resolveToolQueryPackPath(queryLanguage as string); const packPath = queryPack as string || defaultPackPath; logger.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`); diff --git a/server/src/lib/language-server.ts b/server/src/lib/language-server.ts index f333477a..cc4391d3 100644 --- a/server/src/lib/language-server.ts +++ b/server/src/lib/language-server.ts @@ -7,9 +7,10 @@ import { spawn, ChildProcess } from 'child_process'; import { EventEmitter } from 'events'; import { setTimeout, clearTimeout } from 'timers'; import { pathToFileURL } from 'url'; -import { join } from 'path'; +import { delimiter, join } from 'path'; import { logger } from '../utils/logger'; import { getProjectTmpDir } from '../utils/temp-dir'; +import { getResolvedCodeQLDir } from './cli-executor'; export interface LSPMessage { jsonrpc: '2.0'; @@ -88,8 +89,19 @@ export class CodeQLLanguageServer extends EventEmitter { args.push(`--verbosity=${this._options.verbosity}`); } + // Build environment with CODEQL_PATH directory prepended to PATH + // (mirrors the approach in cli-executor.ts getSafeEnvironment). + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; + } + this.server = spawn('codeql', args, { - stdio: ['pipe', 'pipe', 'pipe'] + stdio: ['pipe', 'pipe', 'pipe'], + env: spawnEnv }); this.server.stderr?.on('data', (data) => { @@ -230,8 +242,8 @@ export class CodeQLLanguageServer extends EventEmitter { const initParams = { processId: process.pid, clientInfo: { - name: 'codeql-mcp-server', - version: '1.0.0' + name: 'codeql-development-mcp-server', + version: '2.23.9' }, capabilities: { textDocument: { diff --git a/server/src/lib/session-data-manager.ts b/server/src/lib/session-data-manager.ts index a5abcd23..c1a9d22b 100644 --- a/server/src/lib/session-data-manager.ts +++ b/server/src/lib/session-data-manager.ts @@ -8,6 +8,7 @@ import { JSONFileSync } from 'lowdb/node'; import { mkdirSync, writeFileSync } from 'fs'; import { join } from 'path'; import { randomUUID } from 'crypto'; +import { getPackageRootDir } from '../utils/package-paths'; import { QueryDevelopmentSession, QueryState, @@ -402,6 +403,6 @@ function parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolea // Export singleton instance with environment variable support export const sessionDataManager = new SessionDataManager({ - storageLocation: process.env.MONITORING_STORAGE_LOCATION || '.ql-mcp-tracking/', + storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getPackageRootDir(), '.ql-mcp-tracking'), enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false), }); \ No newline at end of file diff --git a/server/src/resources/language-resources.ts b/server/src/resources/language-resources.ts index 70356f63..149d6620 100644 --- a/server/src/resources/language-resources.ts +++ b/server/src/resources/language-resources.ts @@ -7,15 +7,16 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { readFileSync, existsSync } from 'fs'; import { join } from 'path'; import { LANGUAGE_RESOURCES } from '../types/language-types'; +import { workspaceRootDir } from '../utils/package-paths'; import { logger } from '../utils/logger'; /** - * Get the base path for ql resources + * Get the base path for ql resources. + * Uses the workspace root (monorepo root or package root) so that + * resource files are found regardless of the server's process.cwd(). */ function getQLBasePath(): string { - // In production, this would be the path to the ql submodule - // For now, we assume we're running from the server directory - return join(process.cwd(), '..'); + return workspaceRootDir; } /** diff --git a/server/src/tools/codeql/language-server-eval.ts b/server/src/tools/codeql/language-server-eval.ts index 36a71bc8..d3ba2999 100644 --- a/server/src/tools/codeql/language-server-eval.ts +++ b/server/src/tools/codeql/language-server-eval.ts @@ -90,9 +90,11 @@ async function getLanguageServer(options: LanguageServerOptions = {}): Promise { - console.log(`[INFO] ${new Date().toISOString()} ${message}`, ...args); + console.error(`[INFO] ${new Date().toISOString()} ${message}`, ...args); }, error: (message: string, ...args: unknown[]) => { console.error(`[ERROR] ${new Date().toISOString()} ${message}`, ...args); }, warn: (message: string, ...args: unknown[]) => { - console.warn(`[WARN] ${new Date().toISOString()} ${message}`, ...args); + console.error(`[WARN] ${new Date().toISOString()} ${message}`, ...args); }, debug: (message: string, ...args: unknown[]) => { if (process.env.DEBUG) { - console.debug(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args); + console.error(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args); } }, }; diff --git a/server/src/utils/package-paths.ts b/server/src/utils/package-paths.ts new file mode 100644 index 00000000..03a01b08 --- /dev/null +++ b/server/src/utils/package-paths.ts @@ -0,0 +1,87 @@ +/** + * Utilities for resolving filesystem paths relative to the server package root. + * + * The server can run from three different directory layouts: + * + * 1. **Source** (dev): `server/src/lib/` → packageRoot = `server/` + * 2. **Bundle in monorepo** (dev/CI): `server/dist/` → packageRoot = `server/` + * 3. **Bundle via npm** (production): `/dist/` → packageRoot = `/` + * + * In all three cases, the bundled QL tool query packs live at + * `/ql//tools/src/`. + * + * The "workspace root" (monorepo root) is one level above packageRoot when + * running from the monorepo checkout, and the packageRoot itself when running + * from an npm install (no parent monorepo). + */ + +import { dirname, resolve } from 'path'; +import { existsSync, readFileSync } from 'fs'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +/** + * Detect whether the current __dirname looks like source code (`src/lib` or + * `src/utils`) vs a bundled flat output directory (`dist/`). + */ +function isRunningFromSource(dir: string): boolean { + const normalized = dir.replace(/\\/g, '/'); + return normalized.includes('/src/'); +} + +/** + * Get the server package root directory. + * + * - From source (`server/src/utils/`): up 2 levels → `server/` + * - From bundle (`server/dist/` or `/dist/`): up 1 level → package root + */ +export function getPackageRootDir(currentDir: string = __dirname): string { + return isRunningFromSource(currentDir) + ? resolve(currentDir, '..', '..') // src/utils → server/ + : resolve(currentDir, '..'); // dist/ → package root +} + +/** + * Get the workspace root directory (monorepo root when applicable). + * + * If a `package.json` with `workspaces` exists one level above the package + * root, we're in a monorepo and that parent is the workspace root. Otherwise, + * the packageRoot itself is the workspace root (npm install scenario). + */ +export function getWorkspaceRootDir(packageRoot?: string): string { + const pkgRoot = packageRoot ?? getPackageRootDir(); + const parentDir = resolve(pkgRoot, '..'); + + // In the monorepo, the parent directory contains a package.json with workspaces + try { + const parentPkgPath = resolve(parentDir, 'package.json'); + if (existsSync(parentPkgPath)) { + const parentPkg = JSON.parse(readFileSync(parentPkgPath, 'utf8')); + if (parentPkg.workspaces) { + return parentDir; + } + } + } catch { + // Not in a monorepo — fall through + } + + return pkgRoot; +} + +/** + * Resolve the path to a tool query pack's source directory. + * + * @param language - CodeQL language identifier (e.g., "javascript", "cpp") + * @param packageRoot - Override the package root (for testing) + * @returns Absolute path to `ql//tools/src/` + */ +export function resolveToolQueryPackPath(language: string, packageRoot?: string): string { + const pkgRoot = packageRoot ?? getPackageRootDir(); + return resolve(pkgRoot, 'ql', language, 'tools', 'src'); +} + +// Pre-computed values for use throughout the server +export const packageRootDir = getPackageRootDir(); +export const workspaceRootDir = getWorkspaceRootDir(packageRootDir); diff --git a/server/src/utils/temp-dir.ts b/server/src/utils/temp-dir.ts index af8afa91..bef3a154 100644 --- a/server/src/utils/temp-dir.ts +++ b/server/src/utils/temp-dir.ts @@ -1,35 +1,21 @@ /** * Secure project-local temporary directory utilities. * - * All temporary files are created under `/.tmp/` which is + * All temporary files are created under `/.tmp/` which is * `.gitignore`d. This avoids writing to the OS temp directory * (`os.tmpdir()` / `/tmp`), which is world-readable and triggers * CWE-377 / CWE-378 (js/insecure-temporary-file). */ import { mkdirSync, mkdtempSync } from 'fs'; -import { dirname, join, resolve } from 'path'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -/** - * Repository root, calculated once at module load. - * - * - From source (`server/src/utils/`) → 3 levels up - * - From bundle (`server/dist/`) → 2 levels up - */ -const normalizedDir = __dirname.split(/[\\/]/).join('/'); -const repoRoot: string = normalizedDir.includes('src/utils') - ? resolve(__dirname, '..', '..', '..') - : resolve(__dirname, '..', '..'); +import { join } from 'path'; +import { getPackageRootDir } from './package-paths'; /** * Base directory for all project-local temporary data. * Stored under `/.tmp` and excluded from version control. */ -const PROJECT_TMP_BASE = join(repoRoot, '.tmp'); +const PROJECT_TMP_BASE = join(getPackageRootDir(), '.tmp'); /** * Return the project-local `.tmp` base directory, creating it if needed. diff --git a/server/test/src/lib/cli-executor.test.ts b/server/test/src/lib/cli-executor.test.ts index bb20eafa..f9d2b6db 100644 --- a/server/test/src/lib/cli-executor.test.ts +++ b/server/test/src/lib/cli-executor.test.ts @@ -2,13 +2,18 @@ * Tests for CLI executor utilities */ -import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest'; +import { describe, it, expect, beforeAll, afterAll, afterEach, vi } from 'vitest'; +import { mkdirSync, writeFileSync, rmSync, chmodSync } from 'fs'; +import { join } from 'path'; import { buildCodeQLArgs, buildQLTArgs, executeCLICommand, enableTestCommands, disableTestCommands, + resolveCodeQLBinary, + getResolvedCodeQLDir, + resetResolvedCodeQLBinary, sanitizeCLIArgument, sanitizeCLIArguments } from '../../../src/lib/cli-executor'; @@ -567,4 +572,137 @@ describe('executeCLICommand - Argument Sanitization', () => { expect(result.stdout).toContain('hello'); expect(result.stdout).toContain('world'); }); +}); + +describe('resolveCodeQLBinary', () => { + const originalEnv = process.env.CODEQL_PATH; + + afterEach(() => { + // Restore original env and reset cached binary + if (originalEnv === undefined) { + delete process.env.CODEQL_PATH; + } else { + process.env.CODEQL_PATH = originalEnv; + } + resetResolvedCodeQLBinary(); + }); + + it('should default to "codeql" when CODEQL_PATH is not set', () => { + delete process.env.CODEQL_PATH; + const result = resolveCodeQLBinary(); + expect(result).toBe('codeql'); + expect(getResolvedCodeQLDir()).toBeNull(); + }); + + it('should default to "codeql" when CODEQL_PATH is empty', () => { + process.env.CODEQL_PATH = ''; + const result = resolveCodeQLBinary(); + expect(result).toBe('codeql'); + expect(getResolvedCodeQLDir()).toBeNull(); + }); + + it('should return the full path and set dir to parent directory', () => { + // Create a temporary file named "codeql" to pass validation + const tmpDir = join(process.cwd(), '.tmp', 'codeql-path-test'); + const codeqlPath = join(tmpDir, 'codeql'); + mkdirSync(tmpDir, { recursive: true }); + writeFileSync(codeqlPath, '#!/bin/sh\necho test', { mode: 0o755 }); + + try { + process.env.CODEQL_PATH = codeqlPath; + const result = resolveCodeQLBinary(); + expect(result).toBe(codeqlPath); + expect(getResolvedCodeQLDir()).toBe(tmpDir); + } finally { + rmSync(tmpDir, { recursive: true, force: true }); + } + }); + + it('should reject CODEQL_PATH with wrong basename', () => { + process.env.CODEQL_PATH = '/usr/local/bin/not-codeql'; + expect(() => resolveCodeQLBinary()).toThrow('expected basename: codeql'); + }); + + it('should reject a relative CODEQL_PATH', () => { + process.env.CODEQL_PATH = 'relative/path/to/codeql'; + expect(() => resolveCodeQLBinary()).toThrow('must be an absolute path'); + }); + + it('should reject CODEQL_PATH pointing to a non-existent file', () => { + process.env.CODEQL_PATH = '/nonexistent/path/to/codeql'; + expect(() => resolveCodeQLBinary()).toThrow('does not exist'); + }); + + it('should accept a valid absolute CODEQL_PATH pointing to an existing file', () => { + // Use /bin/echo as a stand-in for an existing file named "codeql" + // We can't actually test with a real codeql binary in unit tests, + // so test the basename validation and existence check separately. + // Here we test that a non-existent but well-named path is rejected for non-existence. + process.env.CODEQL_PATH = '/tmp/nonexistent-dir/codeql'; + expect(() => resolveCodeQLBinary()).toThrow('does not exist'); + }); + + it('should cache the resolved dir via getResolvedCodeQLDir', () => { + delete process.env.CODEQL_PATH; + resolveCodeQLBinary(); + expect(getResolvedCodeQLDir()).toBeNull(); + }); + + it('should reset to default via resetResolvedCodeQLBinary', () => { + delete process.env.CODEQL_PATH; + resolveCodeQLBinary(); + resetResolvedCodeQLBinary(); + expect(getResolvedCodeQLDir()).toBeNull(); + }); + + it('should accept codeql.exe basename on Windows-style paths', () => { + // This tests basename validation only; the file won't exist. + process.env.CODEQL_PATH = '/some/path/codeql.exe'; + expect(() => resolveCodeQLBinary()).toThrow('does not exist'); + // The error should be about non-existence, NOT about an invalid basename + }); + + it('should accept codeql.cmd basename', () => { + process.env.CODEQL_PATH = '/some/path/codeql.cmd'; + expect(() => resolveCodeQLBinary()).toThrow('does not exist'); + }); +}); + +describe('CODEQL_PATH - PATH prepend integration', () => { + const originalEnv = process.env.CODEQL_PATH; + + afterEach(() => { + if (originalEnv === undefined) { + delete process.env.CODEQL_PATH; + } else { + process.env.CODEQL_PATH = originalEnv; + } + resetResolvedCodeQLBinary(); + }); + + it('should prepend CODEQL_PATH directory to child process PATH', async () => { + // Create a temporary directory with a fake "codeql" script + const tmpDir = join(process.cwd(), '.tmp', 'codeql-path-prepend-test'); + const codeqlPath = join(tmpDir, 'codeql'); + mkdirSync(tmpDir, { recursive: true }); + writeFileSync(codeqlPath, '#!/bin/sh\necho test', { mode: 0o755 }); + chmodSync(codeqlPath, 0o755); + + try { + process.env.CODEQL_PATH = codeqlPath; + resolveCodeQLBinary(); + + // Run a command that prints PATH - verify the codeql dir is prepended + const result = await executeCLICommand({ + command: 'sh', + args: ['-c', 'echo $PATH'] + }); + + expect(result.success).toBe(true); + // The PATH should start with our tmpDir + expect(result.stdout.trim().startsWith(tmpDir)).toBe(true); + } finally { + rmSync(tmpDir, { recursive: true, force: true }); + } + }); }); \ No newline at end of file diff --git a/server/test/src/utils/logger.test.ts b/server/test/src/utils/logger.test.ts index 22f56f99..7895803f 100644 --- a/server/test/src/utils/logger.test.ts +++ b/server/test/src/utils/logger.test.ts @@ -1,5 +1,8 @@ /** * Tests for logger utility + * + * All logger methods write to stderr (via console.error) because stdout is + * reserved for the MCP JSON-RPC protocol in stdio transport mode. */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; @@ -7,17 +10,12 @@ import { logger } from '../../../src/utils/logger'; describe('Logger', () => { const consoleSpy = { - log: vi.fn(), - error: vi.fn(), - warn: vi.fn(), - debug: vi.fn() + error: vi.fn() }; beforeEach(() => { - vi.spyOn(console, 'log').mockImplementation(consoleSpy.log); + consoleSpy.error.mockClear(); vi.spyOn(console, 'error').mockImplementation(consoleSpy.error); - vi.spyOn(console, 'warn').mockImplementation(consoleSpy.warn); - vi.spyOn(console, 'debug').mockImplementation(consoleSpy.debug); }); afterEach(() => { @@ -25,18 +23,18 @@ describe('Logger', () => { }); describe('info', () => { - it('should log info messages with timestamp', () => { + it('should log info messages to stderr with timestamp', () => { logger.info('Test message'); - expect(consoleSpy.log).toHaveBeenCalled(); - const call = consoleSpy.log.mock.calls[0][0]; + expect(consoleSpy.error).toHaveBeenCalled(); + const call = consoleSpy.error.mock.calls[0][0]; expect(call).toMatch(/\[INFO\] \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z Test message/); }); it('should pass additional arguments', () => { logger.info('Test', { key: 'value' }, 123); - expect(consoleSpy.log).toHaveBeenCalledWith( + expect(consoleSpy.error).toHaveBeenCalledWith( expect.stringContaining('[INFO]'), { key: 'value' }, 123 @@ -45,7 +43,7 @@ describe('Logger', () => { }); describe('error', () => { - it('should log error messages with timestamp', () => { + it('should log error messages to stderr with timestamp', () => { logger.error('Error message'); expect(consoleSpy.error).toHaveBeenCalled(); @@ -65,11 +63,11 @@ describe('Logger', () => { }); describe('warn', () => { - it('should log warning messages with timestamp', () => { + it('should log warning messages to stderr with timestamp', () => { logger.warn('Warning message'); - expect(consoleSpy.warn).toHaveBeenCalled(); - const call = consoleSpy.warn.mock.calls[0][0]; + expect(consoleSpy.error).toHaveBeenCalled(); + const call = consoleSpy.error.mock.calls[0][0]; expect(call).toMatch(/\[WARN\] \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z Warning message/); }); }); @@ -81,19 +79,20 @@ describe('Logger', () => { logger.debug('Debug message'); - expect(consoleSpy.debug).not.toHaveBeenCalled(); + // Only the beforeEach spy call should exist, not any from logger.debug + expect(consoleSpy.error).not.toHaveBeenCalled(); process.env.DEBUG = originalDebug; }); - it('should log debug messages when DEBUG is set', () => { + it('should log debug messages to stderr when DEBUG is set', () => { const originalDebug = process.env.DEBUG; process.env.DEBUG = 'true'; logger.debug('Debug message'); - expect(consoleSpy.debug).toHaveBeenCalled(); - const call = consoleSpy.debug.mock.calls[0][0]; + expect(consoleSpy.error).toHaveBeenCalled(); + const call = consoleSpy.error.mock.calls[0][0]; expect(call).toMatch(/\[DEBUG\] \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z Debug message/); process.env.DEBUG = originalDebug; diff --git a/server/test/src/utils/package-paths.test.ts b/server/test/src/utils/package-paths.test.ts new file mode 100644 index 00000000..3fbbde62 --- /dev/null +++ b/server/test/src/utils/package-paths.test.ts @@ -0,0 +1,114 @@ +/** + * Tests for package path resolution utilities. + * + * Validates that QL tool query pack paths resolve correctly across: + * - Source layout (server/src/utils/) + * - Bundle in monorepo (server/dist/) + * - Bundle via npm install (/dist/) + */ + +import { describe, it, expect } from 'vitest'; +import { resolve } from 'path'; +import { readFileSync, existsSync } from 'fs'; +import { + getPackageRootDir, + getWorkspaceRootDir, + resolveToolQueryPackPath, + packageRootDir, + workspaceRootDir, +} from '../../../src/utils/package-paths'; + +describe('getPackageRootDir', () => { + it('should resolve from source layout (src/lib/) to server/', () => { + const result = getPackageRootDir('/project/server/src/lib'); + expect(result).toBe(resolve('/project/server')); + }); + + it('should resolve from source layout (src/utils/) to server/', () => { + const result = getPackageRootDir('/project/server/src/utils'); + expect(result).toBe(resolve('/project/server')); + }); + + it('should resolve from bundle in monorepo (server/dist/) to server/', () => { + const result = getPackageRootDir('/project/server/dist'); + expect(result).toBe(resolve('/project/server')); + }); + + it('should resolve from npm install (/dist/) to /', () => { + const npmPath = '/usr/lib/node_modules/@advanced-security/codeql-development-mcp-server/dist'; + const result = getPackageRootDir(npmPath); + expect(result).toBe(resolve('/usr/lib/node_modules/@advanced-security/codeql-development-mcp-server')); + }); + + it('should handle Windows-style paths with backslashes', () => { + const winPath = 'C:\\Users\\user\\AppData\\Roaming\\npm\\node_modules\\@advanced-security\\codeql-development-mcp-server\\dist'; + const result = getPackageRootDir(winPath); + // On Unix, resolve will still work with forward slashes + expect(result).toContain('codeql-development-mcp-server'); + expect(result).not.toContain('dist'); + }); + + it('should return a value for the current runtime (__dirname default)', () => { + const result = getPackageRootDir(); + // When running tests from source, this should be the server/ directory + expect(result).toBeTruthy(); + expect(typeof result).toBe('string'); + }); +}); + +describe('getWorkspaceRootDir', () => { + it('should detect monorepo root when package.json with workspaces exists', () => { + // In our test environment, we ARE in the monorepo, so workspace root is one + // level above the package root (server/) + const result = getWorkspaceRootDir(packageRootDir); + expect(result).not.toBe(packageRootDir); + // The workspace root should contain a package.json with workspaces + const rootPkg = readFileSync(resolve(result, 'package.json'), 'utf8'); + expect(JSON.parse(rootPkg).workspaces).toBeDefined(); + }); + + it('should fall back to package root when no monorepo parent exists', () => { + // Use a path that has no monorepo parent + const result = getWorkspaceRootDir('/tmp/fake-package'); + expect(result).toBe('/tmp/fake-package'); + }); +}); + +describe('resolveToolQueryPackPath', () => { + it('should resolve JavaScript tool pack path', () => { + const result = resolveToolQueryPackPath('javascript', '/project/server'); + expect(result).toBe(resolve('/project/server/ql/javascript/tools/src')); + }); + + it('should resolve C++ tool pack path', () => { + const result = resolveToolQueryPackPath('cpp', '/project/server'); + expect(result).toBe(resolve('/project/server/ql/cpp/tools/src')); + }); + + it('should resolve correctly for npm install layout', () => { + const npmPkgRoot = '/usr/lib/node_modules/@advanced-security/codeql-development-mcp-server'; + const result = resolveToolQueryPackPath('python', npmPkgRoot); + expect(result).toBe(resolve(npmPkgRoot, 'ql/python/tools/src')); + // Critically: no 'server/' prefix in the path + expect(result).not.toContain('/server/ql/'); + }); + + it('should resolve to an existing directory for current runtime', () => { + // When running from the monorepo, the ql/ directories should exist + const result = resolveToolQueryPackPath('javascript'); + expect(existsSync(result)).toBe(true); + }); +}); + +describe('Pre-computed exports', () => { + it('packageRootDir should be the server/ directory in monorepo', () => { + expect(packageRootDir).toBeTruthy(); + // Should end with 'server' when running from monorepo + expect(packageRootDir.replace(/\\/g, '/')).toMatch(/\/server$/); + }); + + it('workspaceRootDir should be the monorepo root', () => { + expect(workspaceRootDir).toBeTruthy(); + expect(workspaceRootDir).not.toBe(packageRootDir); + }); +}); diff --git a/server/test/src/utils/temp-dir.test.ts b/server/test/src/utils/temp-dir.test.ts index 78cae0c0..ee19cb6c 100644 --- a/server/test/src/utils/temp-dir.test.ts +++ b/server/test/src/utils/temp-dir.test.ts @@ -4,18 +4,16 @@ import { describe, it, expect, afterAll } from 'vitest'; import { existsSync, rmSync, statSync } from 'fs'; -import { dirname, resolve, sep } from 'path'; -import { fileURLToPath } from 'url'; +import { resolve, sep } from 'path'; import { createProjectTempDir, getProjectTmpBase, getProjectTmpDir, } from '../../../src/utils/temp-dir'; +import { getPackageRootDir } from '../../../src/utils/package-paths'; -// Compute expected base from repo root (server/test/src/utils -> 4 levels up, then .tmp) -const __dirname = dirname(fileURLToPath(import.meta.url)); -const repoRoot = resolve(__dirname, '..', '..', '..', '..'); -const expectedBase = resolve(repoRoot, '.tmp'); +// Expected base: /.tmp (packageRoot = server/ in monorepo) +const expectedBase = resolve(getPackageRootDir(), '.tmp'); // Collect directories created during tests for cleanup const dirsToCleanup: string[] = []; From f5d358a23257b6082cf880388775be1be6e96fab Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sat, 7 Feb 2026 21:43:18 -0700 Subject: [PATCH 2/9] fix: CODEQL_PATH tests and startup validation - Fix codeql-path-tests CI job that timed out (~17min) on all three OSes due to bash pipe PID tracking bug (`$!` captured subshell PID, not server PID). Replace inline workflow steps with portable bash scripts using background watchdog + `wait` pattern (no GNU `timeout`). - Add startup-time validation (`validateCodeQLBinaryReachable`) that runs `codeql version --format=terse` before tool registration. Server now fails fast with actionable error when codeql is not on PATH and CODEQL_PATH is not set. - Add Test 3: verify server fails at startup when codeql is missing from both PATH and CODEQL_PATH. - Address 5 Copilot PR review comments: - Implement caching in `resolveCodeQLBinary()` (short-circuit on repeat calls) - Fix JSDoc in temp-dir.ts (`` -> ``) - Gate Windows backslash test to `process.platform === 'win32'` - Use `path.isAbsolute()` for cross-platform database path check - Guard `additionalPacksPath` with `existsSync()` for npm-installed layouts Scripts: server/scripts/test-codeql-path-{invalid,missing,valid}.sh Tests: 375 passed (4 new) --- .../workflows/client-integration-tests.yml | 87 ++--------- server/dist/codeql-development-mcp-server.js | 41 +++++- .../dist/codeql-development-mcp-server.js.map | 6 +- server/scripts/test-codeql-path-invalid.sh | 92 ++++++++++++ server/scripts/test-codeql-path-missing.sh | 111 ++++++++++++++ server/scripts/test-codeql-path-valid.sh | 138 ++++++++++++++++++ server/src/codeql-development-mcp-server.ts | 8 +- server/src/lib/cli-executor.ts | 49 ++++++- server/src/lib/cli-tool-registry.ts | 13 +- server/src/utils/temp-dir.ts | 2 +- server/test/src/lib/cli-executor.test.ts | 81 +++++++++- server/test/src/utils/package-paths.test.ts | 6 +- 12 files changed, 535 insertions(+), 99 deletions(-) create mode 100755 server/scripts/test-codeql-path-invalid.sh create mode 100755 server/scripts/test-codeql-path-missing.sh create mode 100755 server/scripts/test-codeql-path-valid.sh diff --git a/.github/workflows/client-integration-tests.yml b/.github/workflows/client-integration-tests.yml index 494bbe3f..aca86fa3 100644 --- a/.github/workflows/client-integration-tests.yml +++ b/.github/workflows/client-integration-tests.yml @@ -276,87 +276,19 @@ jobs: ## to a non-existent file and codeql is not on PATH. - name: CODEQL_PATH Tests - Test 1 - Fail with invalid CODEQL_PATH shell: bash - run: | - echo "=== Test 1: Server must fail when CODEQL_PATH is invalid ===" - export PATH="$CLEAN_PATH" - export CODEQL_PATH="/nonexistent/path/to/codeql" - - # Use a long-running Node process as a stdin source to prevent - # immediate EOF (which causes a clean exit instead of a crash). - # Cross-platform: works on Linux, macOS, and Windows (no mkfifo). - node -e "setTimeout(()=>{},999999)" | \ - node server/dist/codeql-development-mcp-server.js >stdout.txt 2>stderr.txt & - SERVER_PID=$! - - # Wait for the process to exit (it should fail within seconds) - sleep 5 - - if kill -0 "$SERVER_PID" 2>/dev/null; then - echo "::error::Server should have exited but is still running" - kill "$SERVER_PID" 2>/dev/null || true - wait "$SERVER_PID" 2>/dev/null || true - cat stderr.txt - exit 1 - fi - - wait "$SERVER_PID" 2>/dev/null - EXIT_CODE=$? + run: ./server/scripts/test-codeql-path-invalid.sh - echo "Exit code: $EXIT_CODE" - cat stderr.txt - - if [[ "$EXIT_CODE" -ne 0 ]] && grep -qi "does not exist" stderr.txt; then - echo "" - echo "✅ PASS: Server failed at startup with expected CODEQL_PATH error" - else - echo "" - echo "::error::Unexpected behavior (exit=$EXIT_CODE)" - exit 1 - fi + ## Test 2: The server must fail at startup when codeql is not on PATH + ## and CODEQL_PATH is not set. + - name: CODEQL_PATH Tests - Test 2 - Fail when codeql not on PATH and CODEQL_PATH not set + shell: bash + run: ./server/scripts/test-codeql-path-missing.sh - ## Test 2: The server must start without error when CODEQL_PATH points + ## Test 3: The server must start without error when CODEQL_PATH points ## to a valid CodeQL binary, even though codeql is not on PATH. - - name: CODEQL_PATH Tests - Test 2 - Start with valid CODEQL_PATH + - name: CODEQL_PATH Tests - Test 3 - Start with valid CODEQL_PATH shell: bash - run: | - echo "=== Test 2: Server must start when CODEQL_PATH is valid ===" - export PATH="$CLEAN_PATH" - export CODEQL_PATH="${{ steps.locate-codeql.outputs.codeql-binary }}" - - echo "CODEQL_PATH=$CODEQL_PATH" - echo "codeql in PATH: $(command -v codeql 2>/dev/null || echo 'not found')" - - # Use a long-running Node process as a stdin source to keep the - # STDIO transport alive. Cross-platform (no mkfifo needed). - node -e "setTimeout(()=>{},999999)" | \ - node server/dist/codeql-development-mcp-server.js >stdout.txt 2>stderr.txt & - SERVER_PID=$! - - # Give the server time to either start successfully or crash - sleep 5 - - if kill -0 "$SERVER_PID" 2>/dev/null; then - echo "✅ PASS: Server is running after 5 seconds (PID $SERVER_PID)" - echo "--- startup logs ---" - cat stderr.txt - - # Verify stderr confirms CODEQL_PATH was used - if grep -q "CODEQL_PATH" stderr.txt; then - echo "✅ Server logged CODEQL_PATH resolution" - else - echo "⚠️ CODEQL_PATH not found in stderr (non-fatal)" - fi - - # Clean up - kill "$SERVER_PID" 2>/dev/null || true - wait "$SERVER_PID" 2>/dev/null || true - else - wait "$SERVER_PID" 2>/dev/null - EXIT_CODE=$? - echo "::error::Server exited prematurely with code $EXIT_CODE" - cat stderr.txt - exit 1 - fi + run: ./server/scripts/test-codeql-path-valid.sh "${{ steps.locate-codeql.outputs.codeql-binary }}" - name: CODEQL_PATH Tests - Summary shell: bash @@ -366,6 +298,7 @@ jobs: echo "| Test | Result |" >> $GITHUB_STEP_SUMMARY echo "| ---- | ------ |" >> $GITHUB_STEP_SUMMARY echo "| Invalid CODEQL_PATH causes startup failure | ✅ Pass |" >> $GITHUB_STEP_SUMMARY + echo "| Missing codeql (no PATH, no CODEQL_PATH) causes startup failure | ✅ Pass |" >> $GITHUB_STEP_SUMMARY echo "| Valid CODEQL_PATH (no PATH) starts server | ✅ Pass |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Detail | Value |" >> $GITHUB_STEP_SUMMARY diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index e5105bd7..534d67c6 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -49,6 +49,7 @@ __export(cli_executor_exports, { resolveCodeQLBinary: () => resolveCodeQLBinary, sanitizeCLIArgument: () => sanitizeCLIArgument, sanitizeCLIArguments: () => sanitizeCLIArguments, + validateCodeQLBinaryReachable: () => validateCodeQLBinaryReachable, validateCommandExists: () => validateCommandExists }); import { execFile } from "child_process"; @@ -71,10 +72,14 @@ function isCommandAllowed(command) { return ALLOWED_COMMANDS.has(command) || testCommands !== null && testCommands.has(command); } function resolveCodeQLBinary() { + if (resolvedBinaryResult !== void 0) { + return resolvedBinaryResult; + } const envPath = process.env.CODEQL_PATH; if (!envPath) { resolvedCodeQLDir = null; - return "codeql"; + resolvedBinaryResult = "codeql"; + return resolvedBinaryResult; } const base = basename(envPath).toLowerCase(); const validBaseNames = ["codeql", "codeql.exe", "codeql.cmd"]; @@ -94,14 +99,35 @@ function resolveCodeQLBinary() { ); } resolvedCodeQLDir = dirname(envPath); + resolvedBinaryResult = envPath; logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`); - return envPath; + return resolvedBinaryResult; } function getResolvedCodeQLDir() { return resolvedCodeQLDir; } function resetResolvedCodeQLBinary() { resolvedCodeQLDir = null; + resolvedBinaryResult = void 0; +} +async function validateCodeQLBinaryReachable() { + const binary2 = resolvedBinaryResult ?? "codeql"; + const env = { ...process.env }; + if (resolvedCodeQLDir) { + env.PATH = resolvedCodeQLDir + delimiter + (env.PATH || ""); + } + try { + const { stdout } = await execFileAsync(binary2, ["version", "--format=terse"], { + env, + timeout: 15e3 + }); + return stdout.trim(); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + throw new Error( + `CodeQL CLI is not reachable (binary: ${binary2}). Ensure codeql is on PATH or set the CODEQL_PATH environment variable to the absolute path of the CodeQL CLI binary. Details: ${message}` + ); + } } function sanitizeCLIArgument(arg) { if (arg.includes("\0")) { @@ -260,7 +286,7 @@ async function validateCommandExists(command) { return false; } } -var execFileAsync, ALLOWED_COMMANDS, testCommands, SAFE_ENV_VARS, SAFE_ENV_PREFIXES, DANGEROUS_CONTROL_CHARS, resolvedCodeQLDir; +var execFileAsync, ALLOWED_COMMANDS, testCommands, SAFE_ENV_VARS, SAFE_ENV_PREFIXES, DANGEROUS_CONTROL_CHARS, resolvedCodeQLDir, resolvedBinaryResult; var init_cli_executor = __esm({ "src/lib/cli-executor.ts"() { "use strict"; @@ -845,7 +871,7 @@ function registerCLITool(server, definition) { } break; case "codeql_query_run": { - if (options.database && typeof options.database === "string" && !options.database.startsWith("/")) { + if (options.database && typeof options.database === "string" && !isAbsolute3(options.database)) { options.database = resolve3(workspaceRootDir, options.database); logger.info(`Resolved database path to: ${options.database}`); } @@ -957,8 +983,9 @@ function registerCLITool(server, definition) { const rawCwd = dir || packDir; cwd = isAbsolute3(rawCwd) ? rawCwd : resolve3(workspaceRootDir, rawCwd); } - const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || resolve3(packageRootDir, "ql", "javascript", "examples"); - if (name === "codeql_test_run" || name === "codeql_query_run" || name === "codeql_query_compile") { + const defaultExamplesPath = resolve3(packageRootDir, "ql", "javascript", "examples"); + const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || (existsSync4(defaultExamplesPath) ? defaultExamplesPath : void 0); + if (additionalPacksPath && (name === "codeql_test_run" || name === "codeql_query_run" || name === "codeql_query_compile")) { options["additional-packs"] = additionalPacksPath; } if (name === "codeql_test_run") { @@ -8050,6 +8077,8 @@ async function startServer(mode = "stdio") { logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`); const codeqlBinary = resolveCodeQLBinary(); logger.info(`CodeQL CLI binary: ${codeqlBinary}`); + const codeqlVersion = await validateCodeQLBinaryReachable(); + logger.info(`CodeQL CLI version: ${codeqlVersion}`); const server = new McpServer({ name: PACKAGE_NAME, version: VERSION diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index 4c7c5343..2e5f8225 100644 --- a/server/dist/codeql-development-mcp-server.js.map +++ b/server/dist/codeql-development-mcp-server.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/utils/logger.ts", "../src/lib/cli-executor.ts", "../src/utils/package-paths.ts", "../src/codeql-development-mcp-server.ts", "../src/tools/codeql/bqrs-decode.ts", "../src/lib/cli-tool-registry.ts", "../src/lib/query-results-evaluator.ts", "../src/lib/log-directory-manager.ts", "../src/utils/temp-dir.ts", "../src/tools/codeql/bqrs-info.ts", "../src/tools/codeql/bqrs-interpret.ts", "../src/tools/codeql/database-analyze.ts", "../src/tools/codeql/database-create.ts", "../src/tools/codeql/find-class-position.ts", "../src/tools/codeql/find-predicate-position.ts", "../src/tools/codeql/find-query-files.ts", "../src/lib/query-file-finder.ts", "../../node_modules/js-yaml/dist/js-yaml.mjs", "../src/lib/metadata-resolver.ts", "../src/tools/codeql/generate-log-summary.ts", "../src/tools/codeql/generate-query-help.ts", "../src/tools/codeql/language-server-eval.ts", "../src/lib/language-server.ts", "../src/tools/codeql/pack-install.ts", "../src/tools/codeql/pack-ls.ts", "../src/tools/codeql/profile-codeql-query.ts", "../src/tools/codeql/query-compile.ts", "../src/tools/codeql/query-format.ts", "../src/tools/codeql/query-run.ts", "../src/tools/codeql/quick-evaluate.ts", "../src/tools/codeql/register-database.ts", "../src/tools/codeql/resolve-database.ts", "../src/tools/codeql/resolve-languages.ts", "../src/tools/codeql/resolve-library-path.ts", "../src/tools/codeql/resolve-metadata.ts", "../src/tools/codeql/resolve-qlref.ts", "../src/tools/codeql/resolve-queries.ts", "../src/tools/codeql/resolve-tests.ts", "../src/tools/codeql/test-accept.ts", "../src/tools/codeql/test-extract.ts", "../src/tools/codeql/test-run.ts", "../src/tools/codeql-tools.ts", "../src/lib/validation.ts", "../src/lib/query-scaffolding.ts", "../src/lib/resources.ts", "../src/tools/codeql-resources.ts", "../src/resources/language-resources.ts", "../src/types/language-types.ts", "../src/prompts/workflow-prompts.ts", "../src/prompts/prompt-loader.ts", "../src/tools/monitoring-tools.ts", "../../node_modules/lowdb/lib/core/Low.js", "../../node_modules/lowdb/lib/adapters/node/TextFile.js", "../../node_modules/lowdb/lib/adapters/node/DataFile.js", "../../node_modules/lowdb/lib/adapters/node/JSONFile.js", "../src/lib/session-data-manager.ts", "../src/types/monitoring.ts"], - "sourcesContent": ["/**\n * Simple logger utility.\n *\n * All log output is written to stderr. In stdio transport mode, stdout is\n * reserved exclusively for the MCP JSON-RPC protocol \u2014 any non-protocol\n * bytes on stdout would corrupt the message stream.\n */\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.error(`[INFO] ${new Date().toISOString()} ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[ERROR] ${new Date().toISOString()} ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n console.error(`[WARN] ${new Date().toISOString()} ${message}`, ...args);\n },\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.error(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args);\n }\n },\n};\n", "/**\n * Generic CLI command execution utilities for CodeQL and QLT commands\n */\n\nimport { execFile } from 'child_process';\nimport { existsSync } from 'fs';\nimport { basename, delimiter, dirname, isAbsolute } from 'path';\nimport { promisify } from 'util';\nimport { logger } from '../utils/logger';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CLIExecutionResult {\n stdout: string;\n stderr: string;\n success: boolean;\n error?: string;\n exitCode?: number;\n}\n\nexport interface CLIExecutionOptions {\n command: string;\n args: string[];\n cwd?: string;\n timeout?: number;\n env?: Record;\n}\n\n// Whitelist of allowed commands to prevent arbitrary command execution\nconst ALLOWED_COMMANDS = new Set([\n 'codeql',\n 'git',\n 'node',\n 'npm',\n 'qlt',\n 'which'\n]);\n\n// Additional commands allowed in test environments\nlet testCommands: Set | null = null;\n\n// Whitelist of safe environment variables to pass to child processes\n// This prevents potentially malicious environment variables from being passed through\nconst SAFE_ENV_VARS = [\n 'HOME', // User home directory\n 'LANG', // Locale setting\n 'LC_ALL', // Locale setting\n 'LC_CTYPE', // Locale setting\n 'PATH', // Required to find executables\n 'SHELL', // User's shell (Unix)\n 'TEMP', // Temporary directory (Windows)\n 'TERM', // Terminal type (Unix)\n 'TMP', // Temporary directory (Windows)\n 'TMPDIR', // Temporary directory (Unix)\n 'USER', // Current user (Unix)\n 'USERNAME', // Current user (Windows)\n] as const;\n\n// Whitelist of safe environment variable prefixes\n// These are needed for CodeQL and Node.js functionality\nconst SAFE_ENV_PREFIXES = [\n 'CODEQL_', // CodeQL-specific variables\n 'NODE_', // Node.js-specific variables (for npm, etc.)\n] as const;\n\n// Pattern for dangerous control characters in CLI arguments\n// Rejected characters:\n// \\x01-\\x08: SOH through BS (start of heading, text, null control chars, backspace)\n// \\x0B: Vertical tab - rarely used legitimately, can cause display issues\n// \\x0C: Form feed - can cause unexpected page breaks in output\n// \\x0E-\\x1F: SO through US (shift out/in, device controls, separators)\n// Allowed characters:\n// \\x00: Null byte - handled separately for clearer error messaging\n// \\x09: Horizontal tab - commonly used in file paths and arguments\n// \\x0A: Newline (LF) - may appear in multi-line arguments\n// \\x0D: Carriage return (CR) - may appear with newlines on Windows\n// eslint-disable-next-line no-control-regex\nconst DANGEROUS_CONTROL_CHARS = /[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Enable test-specific commands for testing purposes\n * This should only be called in test environments\n */\nexport function enableTestCommands(): void {\n testCommands = new Set([\n 'cat',\n 'echo',\n 'ls',\n 'sh',\n 'sleep'\n ]);\n}\n\n/**\n * Disable test-specific commands\n */\nexport function disableTestCommands(): void {\n testCommands = null;\n}\n\n/**\n * Check if a command is allowed\n */\nfunction isCommandAllowed(command: string): boolean {\n return ALLOWED_COMMANDS.has(command) || (testCommands !== null && testCommands.has(command));\n}\n\n// Resolved CodeQL binary directory from CODEQL_PATH.\n// When set, this directory is prepended to PATH for all child processes\n// so that `execFile('codeql', ...)` finds the correct binary via execvp().\n// Using PATH lookup (rather than an absolute path) is essential because\n// execvp() handles shell-script shebangs correctly, whereas passing an\n// absolute path to execFile() can fail with ENOENT for shell scripts.\nlet resolvedCodeQLDir: string | null = null;\n\n/**\n * Resolve the CodeQL CLI binary path.\n *\n * Resolution order:\n * 1. `CODEQL_PATH` environment variable \u2014 must point to an existing file whose\n * basename is `codeql` (or `codeql.exe` / `codeql.cmd` on Windows).\n * The parent directory is prepended to PATH for child processes.\n * 2. Falls back to the bare `codeql` command (resolved via PATH at exec time).\n *\n * The resolved value is cached for the lifetime of the process. Call this once\n * at startup; subsequent calls are a no-op and return the cached value.\n */\nexport function resolveCodeQLBinary(): string {\n const envPath = process.env.CODEQL_PATH;\n\n if (!envPath) {\n resolvedCodeQLDir = null;\n return 'codeql';\n }\n\n // Validate the path points to a plausible CodeQL binary\n const base = basename(envPath).toLowerCase();\n const validBaseNames = ['codeql', 'codeql.exe', 'codeql.cmd'];\n if (!validBaseNames.includes(base)) {\n throw new Error(\n `CODEQL_PATH must point to a CodeQL CLI binary (expected basename: codeql), got: ${base}`\n );\n }\n\n // Require an absolute path to avoid ambiguity\n if (!isAbsolute(envPath)) {\n throw new Error(\n `CODEQL_PATH must be an absolute path, got: ${envPath}`\n );\n }\n\n // Verify the file exists\n if (!existsSync(envPath)) {\n throw new Error(\n `CODEQL_PATH points to a file that does not exist: ${envPath}`\n );\n }\n\n resolvedCodeQLDir = dirname(envPath);\n logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`);\n return envPath;\n}\n\n/**\n * Get the currently resolved CodeQL binary directory, or null if using PATH.\n */\nexport function getResolvedCodeQLDir(): string | null {\n return resolvedCodeQLDir;\n}\n\n/**\n * Reset the resolved CodeQL binary to the default (for testing only).\n */\nexport function resetResolvedCodeQLBinary(): void {\n resolvedCodeQLDir = null;\n}\n\n/**\n * Sanitize a CLI argument to prevent potential issues with special characters.\n * \n * While execFile() does not spawn a shell (preventing shell injection), we still\n * validate arguments to:\n * 1. Reject null bytes that could truncate strings in C-based commands\n * 2. Reject control characters that could cause unexpected behavior\n * 3. Provide defense-in-depth against potential issues\n * \n * @param arg - The argument to sanitize\n * @returns The sanitized argument\n * @throws Error if the argument contains dangerous characters\n */\nexport function sanitizeCLIArgument(arg: string): string {\n // Reject null bytes - these can truncate strings in C-based commands\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n if (arg.includes('\\0')) {\n throw new Error(`CLI argument contains null byte: argument rejected for security`);\n }\n \n // Reject control characters using the module-level constant pattern\n if (DANGEROUS_CONTROL_CHARS.test(arg)) {\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n throw new Error(`CLI argument contains control characters: argument rejected for security`);\n }\n \n return arg;\n}\n\n/**\n * Sanitize an array of CLI arguments\n * @param args - The arguments to sanitize\n * @returns The sanitized arguments\n * @throws Error if any argument contains dangerous characters\n */\nexport function sanitizeCLIArguments(args: string[]): string[] {\n return args.map(sanitizeCLIArgument);\n}\n\n/**\n * Filter environment variables to only include safe ones\n * This prevents potentially malicious environment variables from being passed to child processes\n */\nfunction getSafeEnvironment(additionalEnv?: Record): Record {\n const safeEnv: Record = {};\n \n // Copy whitelisted environment variables from process.env\n for (const key of SAFE_ENV_VARS) {\n if (process.env[key] !== undefined) {\n safeEnv[key] = process.env[key]!;\n }\n }\n \n // Copy environment variables with whitelisted prefixes\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && SAFE_ENV_PREFIXES.some(prefix => key.startsWith(prefix))) {\n safeEnv[key] = value;\n }\n }\n \n // When CODEQL_PATH was set, prepend the resolved directory to PATH so that\n // `execFile('codeql', ...)` finds the user-specified binary via execvp().\n // This approach (PATH manipulation + bare command name) is essential because\n // execvp() handles shell-script shebangs correctly, whereas passing an\n // absolute path to execFile() fails with ENOENT for shell-script launchers.\n if (resolvedCodeQLDir && safeEnv.PATH) {\n safeEnv.PATH = `${resolvedCodeQLDir}${delimiter}${safeEnv.PATH}`;\n } else if (resolvedCodeQLDir) {\n safeEnv.PATH = resolvedCodeQLDir;\n }\n \n // Merge with explicitly provided environment variables\n // These are trusted as they come from the application code, not external sources\n if (additionalEnv) {\n Object.assign(safeEnv, additionalEnv);\n }\n \n return safeEnv;\n}\n\n/**\n * Execute a CLI command and return the result.\n * \n * Security: This function uses execFile() instead of exec() to avoid shell interpretation.\n * Arguments are passed directly to the executable as an array, preventing shell injection.\n * Additional security measures include:\n * - Command whitelist validation\n * - Shell metacharacter detection in command names\n * - CLI argument sanitization (null bytes, control characters)\n * - Environment variable filtering\n */\nexport async function executeCLICommand(options: CLIExecutionOptions): Promise {\n try {\n const { command, args, cwd, timeout = 300000, env } = options; // 5 minute default timeout\n \n // Validate command is in the whitelist to prevent arbitrary command execution\n if (!isCommandAllowed(command)) {\n throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`);\n }\n \n // Validate command to ensure it doesn't contain shell metacharacters\n if (command.includes(';') || command.includes('|') || command.includes('&') || \n command.includes('$') || command.includes('`') || command.includes('\\n') ||\n command.includes('\\r')) {\n throw new Error(`Invalid command: contains shell metacharacters: ${command}`);\n }\n \n // Sanitize CLI arguments to prevent issues with special characters\n // This provides defense-in-depth even though execFile() doesn't use a shell\n const sanitizedArgs = sanitizeCLIArguments(args);\n \n logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout });\n \n const execOptions = {\n cwd,\n timeout,\n env: getSafeEnvironment(env),\n };\n \n // execFile() is used instead of exec() to avoid shell interpretation\n // Arguments are passed as an array, not interpolated into a command string\n const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions);\n\n return {\n stdout,\n stderr,\n success: true,\n exitCode: 0\n };\n\n } catch (error: unknown) {\n logger.error('CLI command execution failed:', error);\n \n const err = error as Error & { code?: number; stdout?: string; stderr?: string };\n const errorMessage = err instanceof Error ? err.message : String(error);\n const exitCode = err.code || 1;\n \n return {\n stdout: err.stdout || '',\n stderr: err.stderr || errorMessage,\n success: false,\n error: errorMessage,\n exitCode\n };\n }\n}\n\n/**\n * Build CodeQL command arguments with proper escaping\n */\nexport function buildCodeQLArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n // Single-letter parameters that should use -key=value format (with equals sign)\n // Note: CodeQL CLI uses -t=key=value format for metadata, not -t key=value\n const singleLetterParams = new Set(['t', 'o', 'v', 'q', 'h', 'J']);\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n const isSingleLetter = key.length === 1 && singleLetterParams.has(key);\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(isSingleLetter ? `-${key}` : `--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values (e.g., multiple -t flags for metadata)\n for (const item of value) {\n if (isSingleLetter) {\n // For single-letter params like -t, use -key=value format\n args.push(`-${key}=${String(item)}`);\n } else {\n // For long params, use --key=value format\n args.push(`--${key}=${String(item)}`);\n }\n }\n } else {\n // Handle string, number, and other values\n if (isSingleLetter) {\n // For single-letter params, use -key=value format\n args.push(`-${key}=${String(value)}`);\n } else {\n args.push(`--${key}=${String(value)}`);\n }\n }\n }\n \n return args;\n}\n\n/**\n * Build QLT command arguments with proper escaping\n */\nexport function buildQLTArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values\n for (const item of value) {\n args.push(`--${key}`, String(item));\n }\n } else {\n // Handle string, number, and other values\n args.push(`--${key}`, String(value));\n }\n }\n \n return args;\n}\n\n/**\n * Execute a CodeQL command.\n * Always uses the bare `codeql` command name so that execvp() PATH lookup\n * handles shell-script shebangs correctly. When CODEQL_PATH is set, the\n * resolved directory is prepended to PATH via getSafeEnvironment().\n */\nexport async function executeCodeQLCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = [],\n cwd?: string\n): Promise {\n const args = buildCodeQLArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'codeql',\n args,\n cwd\n });\n}\n\n/**\n * Execute a QLT command\n */\nexport async function executeQLTCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = []\n): Promise {\n const args = buildQLTArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'qlt',\n args\n });\n}\n\n/**\n * Get help text for a CLI command\n */\nexport async function getCommandHelp(command: string, subcommand?: string): Promise {\n const args = subcommand ? [subcommand, '--help'] : ['--help'];\n \n const result = await executeCLICommand({\n command,\n args\n });\n \n return result.stdout || result.stderr || 'No help available';\n}\n\n/**\n * Validate that a command exists on the system.\n */\nexport async function validateCommandExists(command: string): Promise {\n try {\n const result = await executeCLICommand({\n command: 'which',\n args: [command]\n });\n return result.success;\n } catch {\n return false;\n }\n}", "/**\n * Utilities for resolving filesystem paths relative to the server package root.\n *\n * The server can run from three different directory layouts:\n *\n * 1. **Source** (dev): `server/src/lib/` \u2192 packageRoot = `server/`\n * 2. **Bundle in monorepo** (dev/CI): `server/dist/` \u2192 packageRoot = `server/`\n * 3. **Bundle via npm** (production): `/dist/` \u2192 packageRoot = `/`\n *\n * In all three cases, the bundled QL tool query packs live at\n * `/ql//tools/src/`.\n *\n * The \"workspace root\" (monorepo root) is one level above packageRoot when\n * running from the monorepo checkout, and the packageRoot itself when running\n * from an npm install (no parent monorepo).\n */\n\nimport { dirname, resolve } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect whether the current __dirname looks like source code (`src/lib` or\n * `src/utils`) vs a bundled flat output directory (`dist/`).\n */\nfunction isRunningFromSource(dir: string): boolean {\n const normalized = dir.replace(/\\\\/g, '/');\n return normalized.includes('/src/');\n}\n\n/**\n * Get the server package root directory.\n *\n * - From source (`server/src/utils/`): up 2 levels \u2192 `server/`\n * - From bundle (`server/dist/` or `/dist/`): up 1 level \u2192 package root\n */\nexport function getPackageRootDir(currentDir: string = __dirname): string {\n return isRunningFromSource(currentDir)\n ? resolve(currentDir, '..', '..') // src/utils \u2192 server/\n : resolve(currentDir, '..'); // dist/ \u2192 package root\n}\n\n/**\n * Get the workspace root directory (monorepo root when applicable).\n *\n * If a `package.json` with `workspaces` exists one level above the package\n * root, we're in a monorepo and that parent is the workspace root. Otherwise,\n * the packageRoot itself is the workspace root (npm install scenario).\n */\nexport function getWorkspaceRootDir(packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n const parentDir = resolve(pkgRoot, '..');\n\n // In the monorepo, the parent directory contains a package.json with workspaces\n try {\n const parentPkgPath = resolve(parentDir, 'package.json');\n if (existsSync(parentPkgPath)) {\n const parentPkg = JSON.parse(readFileSync(parentPkgPath, 'utf8'));\n if (parentPkg.workspaces) {\n return parentDir;\n }\n }\n } catch {\n // Not in a monorepo \u2014 fall through\n }\n\n return pkgRoot;\n}\n\n/**\n * Resolve the path to a tool query pack's source directory.\n *\n * @param language - CodeQL language identifier (e.g., \"javascript\", \"cpp\")\n * @param packageRoot - Override the package root (for testing)\n * @returns Absolute path to `ql//tools/src/`\n */\nexport function resolveToolQueryPackPath(language: string, packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n return resolve(pkgRoot, 'ql', language, 'tools', 'src');\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\n", "/**\n * CodeQL Development MCP McpServer\n * Main entry point for the server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport express from 'express';\nimport cors from 'cors';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport { registerCodeQLTools, registerCodeQLResources } from './tools';\nimport { registerLanguageResources } from './resources/language-resources';\nimport { registerWorkflowPrompts } from './prompts/workflow-prompts';\nimport { registerMonitoringTools } from './tools/monitoring-tools';\nimport { sessionDataManager } from './lib/session-data-manager';\nimport { resolveCodeQLBinary } from './lib/cli-executor';\nimport { packageRootDir } from './utils/package-paths';\nimport { logger } from './utils/logger';\n\n// Load environment variables from a .env file co-located with the package root.\n// Uses the package directory (not CWD) so that npm-installed users don't\n// accidentally inherit a .env from their project.\ndotenv.config({ path: resolve(packageRootDir, '.env') });\n\nconst PACKAGE_NAME = 'codeql-development-mcp-server';\nconst VERSION = '2.23.9';\n\n/**\n * Start the MCP server\n */\nexport async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise {\n logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`);\n\n // Resolve the CodeQL CLI binary path (honors CODEQL_PATH env var).\n // This must happen before any tool registration so that all CodeQL commands\n // use the user-specified binary.\n const codeqlBinary = resolveCodeQLBinary();\n logger.info(`CodeQL CLI binary: ${codeqlBinary}`);\n\n const server = new McpServer({\n name: PACKAGE_NAME,\n version: VERSION,\n });\n\n // Register CodeQL tools (legacy high-level helpers)\n registerCodeQLTools(server);\n\n // Register CodeQL resources (static guides)\n registerCodeQLResources(server);\n\n // Register language-specific resources (AST references, security patterns)\n registerLanguageResources(server);\n\n // Register high-level workflow prompts (complete development workflows)\n registerWorkflowPrompts(server);\n\n // Register monitoring and reporting tools\n registerMonitoringTools(server);\n\n // Initialize session data manager\n await sessionDataManager.initialize();\n\n if (mode === 'stdio') {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info('McpServer started successfully on STDIO transport');\n } else {\n // HTTP mode\n const app = express();\n app.use(cors());\n app.use(express.json());\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => Math.random().toString(36).substring(7),\n });\n await server.connect(transport);\n\n app.all('/mcp', (req, res) => {\n transport.handleRequest(req, res, req.body).catch((err) => {\n logger.error('Error handling MCP request:', err);\n if (!res.headersSent) {\n res.status(500).json({ error: 'Internal McpServer Error' });\n }\n });\n });\n\n app.get('/', (_req, res) => {\n res.json({\n name: PACKAGE_NAME,\n version: VERSION,\n description: 'CodeQL Development MCP McpServer',\n status: 'running',\n });\n });\n\n const host = process.env.HTTP_HOST || 'localhost';\n const port = Number(process.env.HTTP_PORT || process.env.PORT) || 3000;\n \n // Return a promise that keeps the process alive\n return new Promise((resolve, reject) => {\n const httpServer = app.listen(port, host, () => {\n logger.info(`HTTP server listening on http://${host}:${port}/mcp`);\n resolve();\n });\n \n httpServer.on('error', (error) => {\n logger.error('HTTP server error:', error);\n reject(error);\n });\n });\n }\n\n setupGracefulShutdown(server);\n return server;\n}\n\n/**\n * Set up graceful shutdown handling\n */\nfunction setupGracefulShutdown(server: McpServer): void {\n const shutdown = async () => {\n logger.info('Shutting down server...');\n try {\n await server.close();\n logger.info('McpServer closed gracefully');\n process.exit(0);\n } catch (error) {\n logger.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\n/**\n * Main function to start the server\n */\nasync function main(): Promise {\n try {\n const transportMode = (process.env.TRANSPORT_MODE || 'stdio').toLowerCase();\n const mode: 'stdio' | 'http' = transportMode === 'http' ? 'http' : 'stdio';\n await startServer(mode);\n } catch (error) {\n logger.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\n// Start the server if this file is run directly\nconst scriptPath = process.argv[1] ? resolve(process.argv[1]) : undefined;\nif (scriptPath && import.meta.url === pathToFileURL(scriptPath).href) {\n main();\n}\n", "/**\n * CodeQL BQRS decode tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsDecodeTool: CLIToolDefinition = {\n name: 'codeql_bqrs_decode',\n description: 'Decode BQRS result files to human-readable formats',\n command: 'codeql',\n subcommand: 'bqrs decode',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to decode'),\n output: createCodeQLSchemas.output(),\n format: z.enum(['csv', 'json']).optional().describe('Output format'),\n 'max-paths': z.number().optional().describe('Maximum number of paths to output'),\n 'start-at': z.number().optional().describe('Start output at result number'),\n 'max-results': z.number().optional().describe('Maximum number of results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs decode --format=csv --output=results.csv results.bqrs',\n 'codeql bqrs decode --format=json --max-results=100 results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * Generic tool registry for creating MCP tools from CLI command definitions\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator';\nimport { getOrCreateLogDirectory } from './log-directory-manager';\nimport { packageRootDir, resolveToolQueryPackPath, workspaceRootDir } from '../utils/package-paths';\nimport { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs';\nimport { basename, dirname, isAbsolute, join, resolve } from 'path';\nimport { createProjectTempDir } from '../utils/temp-dir';\n\nexport type { CLIExecutionResult } from './cli-executor';\n\nexport interface CLIToolDefinition {\n name: string;\n description: string;\n command: 'codeql' | 'qlt';\n subcommand: string;\n inputSchema: Record;\n examples?: string[];\n resultProcessor?: (_result: CLIExecutionResult, _params: Record) => string;\n}\n\n/**\n * Default result processor that formats CLI output appropriately\n */\nexport const defaultCLIResultProcessor = (\n result: CLIExecutionResult, \n _params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n \n let output = '';\n \n if (result.stdout) {\n output += result.stdout;\n }\n \n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n \n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n \n return output;\n};\n\n/**\n * Register a CLI tool with the MCP server\n */\nexport function registerCLITool(server: McpServer, definition: CLIToolDefinition): void {\n const {\n name,\n description,\n command,\n subcommand,\n inputSchema,\n resultProcessor = defaultCLIResultProcessor\n } = definition;\n\n server.tool(\n name,\n description,\n inputSchema,\n async (params: Record) => {\n // Track temporary directories for cleanup\n const tempDirsToCleanup: string[] = [];\n \n try {\n logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params });\n\n // Separate positional arguments from named options\n // Extract tool-specific parameters that should not be passed to CLI\n // Note: format is extracted for tools that use it internally but not on CLI\n // For codeql_bqrs_interpret, codeql_bqrs_decode, codeql_generate_query-help, and codeql_database_analyze, format should be passed to CLI\n const formatShouldBePassedToCLI = name === 'codeql_bqrs_interpret' || name === 'codeql_bqrs_decode' || name === 'codeql_generate_query-help' || name === 'codeql_database_analyze';\n \n const extractedParams = formatShouldBePassedToCLI\n ? {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack,\n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n }\n : {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack, \n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n format: params.format,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n };\n\n const {\n _positional = [],\n files,\n file,\n dir,\n packDir,\n tests,\n query,\n queryName,\n queryLanguage: _queryLanguage,\n queryPack: _queryPack,\n sourceFiles,\n sourceFunction,\n targetFunction,\n format: _format,\n interpretedOutput: _interpretedOutput,\n evaluationFunction: _evaluationFunction,\n evaluationOutput: _evaluationOutput,\n directory,\n logDir: customLogDir,\n qlref,\n } = extractedParams;\n\n // Get remaining options (everything not extracted above)\n const options = {...params};\n Object.keys(extractedParams).forEach(key => delete options[key]);\n let positionalArgs = Array.isArray(_positional) ? _positional as string[] : [_positional as string];\n\n // Handle files parameter as positional arguments for certain tools\n if (files && Array.isArray(files)) {\n positionalArgs = [...positionalArgs, ...files as string[]];\n }\n\n // Handle file parameter as positional argument for BQRS tools\n if (file && name.startsWith('codeql_bqrs_')) {\n positionalArgs = [...positionalArgs, file as string];\n }\n\n // Handle qlref parameter as positional argument for resolve qlref tool\n if (qlref && name === 'codeql_resolve_qlref') {\n positionalArgs = [...positionalArgs, qlref as string];\n }\n\n // Handle database parameter as positional argument for resolve database tool\n if (options.database && name === 'codeql_resolve_database') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database parameter as positional argument for database create tool\n if (options.database && name === 'codeql_database_create') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database and queries parameters as positional arguments for database analyze tool\n if (name === 'codeql_database_analyze') {\n if (options.database) {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n if (options.queries) {\n positionalArgs = [...positionalArgs, options.queries as string];\n delete options.queries;\n }\n }\n\n // Handle query parameter as positional argument for generate query-help tool\n if (query && name === 'codeql_generate_query-help') {\n positionalArgs = [...positionalArgs, query as string];\n }\n\n // Handle dir parameter as positional argument for pack tools\n if (dir && (name === 'codeql_pack_ls')) {\n positionalArgs = [...positionalArgs, dir as string];\n }\n \n // Handle tool-specific parameters using switch pattern for better maintainability\n switch (name) {\n case 'codeql_test_accept':\n case 'codeql_test_extract':\n case 'codeql_test_run':\n case 'codeql_resolve_tests':\n // Handle tests parameter as positional arguments for test tools.\n // Resolve relative paths against workspaceRootDir since the MCP\n // server's cwd may not be the repo root.\n if (tests && Array.isArray(tests)) {\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(workspaceRootDir, t)\n )];\n }\n break;\n \n case 'codeql_query_run': {\n // Resolve database path to absolute path if it's relative\n if (options.database && typeof options.database === 'string' && !options.database.startsWith('/')) {\n options.database = resolve(workspaceRootDir, options.database);\n logger.info(`Resolved database path to: ${options.database}`);\n }\n \n // Implement query resolution logic with enhanced results processing\n const resolvedQuery = await resolveQueryPath(params, logger);\n if (resolvedQuery) {\n positionalArgs = [...positionalArgs, resolvedQuery];\n } else if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n \n // Handle external predicates for tool queries\n if (queryName === 'PrintAST' && sourceFiles) {\n // Create a CSV file with the source file paths for the external predicate\n // The external predicate expects a CSV file with one column containing file paths\n const filePaths = (sourceFiles as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir); // Track for cleanup\n csvPath = join(tempDir, 'selectedSourceFiles.csv');\n\n // Create CSV content\n const csvContent = filePaths.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`selectedSourceFiles=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphFrom queries\n if (queryName === 'CallGraphFrom' && sourceFunction) {\n const functionNames = (sourceFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'sourceFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`sourceFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphTo queries\n if (queryName === 'CallGraphTo' && targetFunction) {\n const functionNames = (targetFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'targetFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`targetFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n break;\n }\n \n case 'codeql_query_compile':\n case 'codeql_resolve_metadata':\n // Handle query parameter as positional argument for query compilation and metadata tools\n if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n break;\n \n case 'codeql_resolve_queries':\n // Handle directory parameter as positional argument\n if (directory) {\n positionalArgs = [...positionalArgs, directory as string];\n }\n break;\n \n default:\n // No special parameter handling needed for other tools\n break;\n }\n\n // Set up logging directory for query/test runs\n let queryLogDir: string | undefined;\n if (name === 'codeql_query_run' || name === 'codeql_test_run') {\n queryLogDir = getOrCreateLogDirectory(customLogDir as string | undefined);\n logger.info(`Using log directory for ${name}: ${queryLogDir}`);\n \n // Create timestamp file to track when query/test run started\n const timestampPath = join(queryLogDir, 'timestamp');\n writeFileSync(timestampPath, Date.now().toString(), 'utf8');\n \n // Set the --logdir option for CodeQL CLI\n options.logdir = queryLogDir;\n \n // Set verbosity to progress+ to generate detailed query.log/test.log\n if (!options.verbosity) {\n options.verbosity = 'progress+';\n }\n \n // For query run, also handle the deprecated evaluator-log parameter and default output\n if (name === 'codeql_query_run') {\n // If evaluator-log was explicitly provided (deprecated), use it\n // Otherwise, set it to the log directory\n if (!options['evaluator-log']) {\n options['evaluator-log'] = join(queryLogDir, 'evaluator-log.jsonl');\n }\n \n // If output was not explicitly provided, set it to the log directory\n if (!options.output) {\n options.output = join(queryLogDir, 'results.bqrs');\n }\n }\n }\n\n let result: CLIExecutionResult;\n \n if (command === 'codeql') {\n // For pack commands, set the working directory to where qlpack.yml is located.\n // Resolve to absolute path since the MCP server's cwd may differ from\n // the workspace root (especially when launched by VS Code).\n let cwd: string | undefined;\n if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) {\n const rawCwd = (dir || packDir) as string;\n // Resolve relative paths against the workspace root, not process.cwd(),\n // since the MCP server's cwd may differ (especially in VS Code).\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd);\n }\n \n // Add --additional-packs for commands that need to access local test packs\n const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || resolve(packageRootDir, 'ql', 'javascript', 'examples');\n if (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile') {\n options['additional-packs'] = additionalPacksPath;\n }\n \n // Keep test databases for codeql_test_run to allow subsequent query runs\n if (name === 'codeql_test_run') {\n options['keep-databases'] = true;\n }\n \n result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd);\n } else if (command === 'qlt') {\n result = await executeQLTCommand(subcommand, options, positionalArgs);\n } else {\n throw new Error(`Unsupported command: ${command}`);\n }\n\n // Post-execution processing for codeql_query_run\n if (name === 'codeql_query_run' && result.success && queryLogDir) {\n // Generate SARIF interpretation if results.bqrs exists\n const bqrsPath = options.output as string;\n const sarifPath = join(queryLogDir, 'results.sarif');\n \n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n \n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n \n // Process evaluation results\n result = await processQueryRunResults(result, params, logger);\n }\n\n // Process the result\n const processedResult = resultProcessor(result, params);\n\n return {\n content: [{\n type: 'text' as const,\n text: processedResult\n }],\n isError: !result.success\n };\n\n } catch (error) {\n logger.error(`Error in CLI tool ${name}:`, error);\n \n return {\n content: [{\n type: 'text' as const,\n text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}`\n }],\n isError: true\n };\n } finally {\n // Clean up temporary directories\n for (const tempDir of tempDirsToCleanup) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n logger.info(`Cleaned up temporary directory: ${tempDir}`);\n } catch (cleanupError) {\n logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError);\n }\n }\n }\n }\n );\n}\n\n/**\n * Helper function to create common CodeQL input schemas\n */\nexport const createCodeQLSchemas = {\n database: () => z.string().describe('Path to the CodeQL database'),\n \n query: () => z.string().describe('Path to the CodeQL query file (.ql)'),\n \n output: () => z.string().optional().describe('Output file path'),\n \n outputFormat: () => z.enum(['csv', 'json', 'bqrs', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n \n language: () => z.string().optional().describe('Programming language'),\n \n threads: () => z.number().optional().describe('Number of threads to use'),\n \n ram: () => z.number().optional().describe('Amount of RAM to use (MB)'),\n \n timeout: () => z.number().optional().describe('Timeout in seconds'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments'),\n \n positionalArgs: () => z.array(z.string()).optional().describe('Positional arguments')\n .transform((val) => ({ _positional: val }))\n};\n\n/**\n * Helper function to create common QLT input schemas\n */\nexport const createQLTSchemas = {\n language: () => z.string().describe('Programming language'),\n \n output: () => z.string().optional().describe('Output directory or file path'),\n \n template: () => z.string().optional().describe('Template to use'),\n \n name: () => z.string().optional().describe('Name for generated query'),\n \n description: () => z.string().optional().describe('Description for generated query'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n force: () => z.boolean().optional().describe('Force overwrite existing files'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments')\n};\n\n/**\n * Create a result processor that formats BQRS output specially\n */\nexport const createBQRSResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n // For BQRS commands, provide more context about the output\n let output = result.stdout;\n \n if (params.output) {\n output += `\\n\\nResults saved to: ${params.output}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Create a result processor that formats database creation output\n */\nexport const createDatabaseResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n let output = 'Database creation completed successfully';\n \n if (params.database || params._positional) {\n const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional);\n output += `\\n\\nDatabase location: ${dbPath}`;\n }\n \n if (result.stdout) {\n output += `\\n\\nOutput:\\n${result.stdout}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Resolve query path for codeql_query_run tool\n * If queryName and queryLanguage are provided, resolve using codeql resolve queries\n */\nasync function resolveQueryPath(\n params: Record, \n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n const { queryName, queryLanguage, queryPack, query } = params;\n \n // Validate parameter usage - queryName and query are mutually exclusive\n if (queryName && query) {\n logger.error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n throw new Error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n }\n \n // If no queryName provided, fall back to direct query parameter\n if (!queryName) {\n return query as string || null;\n }\n \n // If queryName provided but no language, we can't resolve\n if (!queryLanguage) {\n logger.error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n throw new Error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n }\n \n try {\n // Determine the query pack path - use absolute path to ensure it works regardless of cwd\n const defaultPackPath = resolveToolQueryPackPath(queryLanguage as string);\n const packPath = queryPack as string || defaultPackPath;\n \n logger.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`);\n \n // Execute codeql resolve queries to get available queries\n const { executeCodeQLCommand } = await import('./cli-executor');\n const resolveResult = await executeCodeQLCommand(\n 'resolve queries',\n { format: 'json' },\n [packPath]\n );\n \n if (!resolveResult.success) {\n logger.error('Failed to resolve queries:', resolveResult.stderr || resolveResult.error);\n throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`);\n }\n \n // Parse the JSON output to find matching queries\n let resolvedQueries: string[];\n try {\n resolvedQueries = JSON.parse(resolveResult.stdout);\n } catch (parseError) {\n logger.error('Failed to parse resolve queries output:', parseError);\n throw new Error('Failed to parse resolve queries output');\n }\n \n // Find the query that matches the requested name exactly\n const matchingQuery = resolvedQueries.find(queryPath => {\n const fileName = basename(queryPath);\n // Match exact query name: \"PrintAST\" should match \"PrintAST.ql\" only\n return fileName === `${queryName}.ql`;\n });\n\n if (!matchingQuery) {\n logger.error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\". Available queries:`, resolvedQueries.map(q => basename(q)));\n throw new Error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\"`);\n }\n \n logger.info(`Resolved query \"${queryName}\" to: ${matchingQuery}`);\n return matchingQuery;\n \n } catch (error) {\n logger.error('Error resolving query path:', error);\n throw error;\n }\n}\n\n/**\n * Interpret BQRS file using codeql bqrs interpret\n */\nasync function interpretBQRSFile(\n bqrsPath: string,\n queryPath: string,\n format: string,\n outputPath: string,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n // Extract query metadata to get id and kind\n const metadata = await extractQueryMetadata(queryPath);\n \n // Validate required metadata fields\n const missingFields = [];\n if (!metadata.id) missingFields.push('id');\n if (!metadata.kind) missingFields.push('kind');\n \n if (missingFields.length > 0) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(', ')}. Ensure the query file contains @id and @kind metadata.`\n };\n }\n \n // Sanitize metadata values to prevent command injection\n const sanitizedKind = (metadata.kind || '').replace(/[^a-zA-Z0-9_-]/g, '');\n const sanitizedId = (metadata.id || '').replace(/[^a-zA-Z0-9_/:-]/g, '');\n \n // Validate format for query kind\n const graphFormats = ['graphtext', 'dgml', 'dot'];\n if (graphFormats.includes(format) && metadata.kind !== 'graph') {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}`\n };\n }\n \n // Ensure output directory exists\n mkdirSync(dirname(outputPath), { recursive: true });\n \n // Build the codeql bqrs interpret command\n const params: Record = {\n format: format,\n output: outputPath,\n t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`]\n };\n \n logger.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`);\n \n // Execute codeql bqrs interpret\n const result = await executeCodeQLCommand(\n 'bqrs interpret',\n params,\n [bqrsPath]\n );\n \n return result;\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Failed to interpret BQRS file: ${error}`\n };\n }\n}\n\n/**\n * Get default output extension based on format\n */\nfunction getDefaultExtension(format: string): string {\n switch (format) {\n case 'sarif-latest':\n case 'sarifv2.1.0':\n return '.sarif';\n case 'csv':\n return '.csv';\n case 'graphtext':\n return '.txt';\n case 'dgml':\n return '.dgml';\n case 'dot':\n return '.dot';\n default:\n return '.txt';\n }\n}\n\n/**\n * Process query run results with optional interpretation or evaluation\n */\nasync function processQueryRunResults(\n result: CLIExecutionResult,\n params: Record,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params;\n \n // If no format or evaluationFunction specified, return as-is\n if (!format && !evaluationFunction) {\n return result;\n }\n \n // Ensure output (bqrs file) was generated\n if (!output) {\n return result;\n }\n \n const bqrsPath = output as string;\n \n // Determine the query path for metadata extraction\n let queryPath: string | null = null;\n \n if (query) {\n queryPath = query as string;\n } else if (queryName && queryLanguage) {\n // Try to resolve the query path again for evaluation\n queryPath = await resolveQueryPath(params, logger);\n }\n \n if (!queryPath) {\n logger.error('Cannot determine query path for interpretation/evaluation');\n return {\n ...result,\n stdout: result.stdout + '\\n\\nWarning: Query interpretation skipped - could not determine query path'\n };\n }\n \n // Handle new format parameter (preferred approach)\n if (format) {\n const outputFormat = format as string;\n \n // Determine output path\n let outputFilePath = interpretedOutput as string | undefined;\n if (!outputFilePath) {\n const ext = getDefaultExtension(outputFormat);\n outputFilePath = bqrsPath.replace('.bqrs', ext);\n }\n \n logger.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`);\n \n // Interpret the BQRS file\n const interpretResult = await interpretBQRSFile(\n bqrsPath,\n queryPath,\n outputFormat,\n outputFilePath,\n logger\n );\n \n if (interpretResult.success) {\n let enhancedOutput = result.stdout;\n enhancedOutput += `\\n\\nQuery results interpreted successfully with format: ${outputFormat}`;\n enhancedOutput += `\\nInterpreted output saved to: ${outputFilePath}`;\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n logger.error('Query interpretation failed:', interpretResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}`\n };\n }\n }\n \n // Handle legacy evaluationFunction parameter (deprecated)\n if (evaluationFunction) {\n logger.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`);\n logger.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`);\n \n // Perform the evaluation\n const evaluationResult: QueryEvaluationResult = await evaluateQueryResults(\n bqrsPath,\n queryPath,\n evaluationFunction as string,\n evaluationOutput as string | undefined\n );\n \n if (evaluationResult.success) {\n // Append evaluation results to the command output\n let enhancedOutput = result.stdout;\n \n if (evaluationResult.outputPath) {\n enhancedOutput += `\\n\\nQuery evaluation completed successfully.`;\n enhancedOutput += `\\nEvaluation output saved to: ${evaluationResult.outputPath}`;\n }\n \n if (evaluationResult.content) {\n enhancedOutput += `\\n\\n=== Query Results Evaluation ===\\n`;\n enhancedOutput += evaluationResult.content;\n }\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n // Evaluation failed, but don't fail the whole operation\n logger.error('Query evaluation failed:', evaluationResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query evaluation failed - ${evaluationResult.error}`\n };\n }\n }\n \n return result;\n } catch (error) {\n logger.error('Error in query results processing:', error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query processing error - ${error}`\n };\n }\n}", "/**\n * Query results evaluation functions for processing .bqrs files\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { writeFileSync, readFileSync } from 'fs';\nimport { dirname, isAbsolute } from 'path';\nimport { mkdirSync } from 'fs';\n\nexport interface QueryEvaluationResult {\n success: boolean;\n outputPath?: string;\n content?: string;\n error?: string;\n}\n\nexport interface QueryMetadata {\n kind?: string;\n name?: string;\n description?: string;\n id?: string;\n tags?: string[];\n}\n\n/**\n * Built-in evaluation functions\n */\nexport const BUILT_IN_EVALUATORS = {\n 'json-decode': 'JSON format decoder for query results',\n 'csv-decode': 'CSV format decoder for query results', \n 'mermaid-graph': 'Mermaid diagram generator for @kind graph queries (like PrintAST)',\n} as const;\n\nexport type BuiltInEvaluator = keyof typeof BUILT_IN_EVALUATORS;\n\n/**\n * Extract metadata from a CodeQL query file\n */\nexport async function extractQueryMetadata(queryPath: string): Promise {\n try {\n const queryContent = readFileSync(queryPath, 'utf-8');\n const metadata: QueryMetadata = {};\n \n // Extract metadata from comments using regex patterns\n const kindMatch = queryContent.match(/@kind\\s+([^\\s]+)/);\n if (kindMatch) metadata.kind = kindMatch[1];\n \n const nameMatch = queryContent.match(/@name\\s+(.+)/);\n if (nameMatch) metadata.name = nameMatch[1].trim();\n \n const descMatch = queryContent.match(/@description\\s+(.+)/);\n if (descMatch) metadata.description = descMatch[1].trim();\n \n const idMatch = queryContent.match(/@id\\s+(.+)/);\n if (idMatch) metadata.id = idMatch[1].trim();\n \n const tagsMatch = queryContent.match(/@tags\\s+(.+)/);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(/\\s+/).filter(t => t.length > 0);\n }\n \n return metadata;\n } catch (error) {\n logger.error('Failed to extract query metadata:', error);\n return {};\n }\n}\n\n/**\n * JSON decoder - converts .bqrs to JSON format\n */\nexport async function evaluateWithJsonDecoder(\n bqrsPath: string, \n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.json');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write JSON results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `JSON evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * CSV decoder - converts .bqrs to CSV format\n */\nexport async function evaluateWithCsvDecoder(\n bqrsPath: string,\n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'csv' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.csv');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write CSV results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `CSV evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Mermaid graph generator - converts @kind graph query results to mermaid diagrams\n */\nexport async function evaluateWithMermaidGraph(\n bqrsPath: string,\n queryPath: string,\n outputPath?: string\n): Promise {\n try {\n // First extract query metadata to confirm this is a graph query\n const metadata = await extractQueryMetadata(queryPath);\n \n if (metadata.kind !== 'graph') {\n logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`);\n return {\n success: false,\n error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`\n };\n }\n \n // Decode the BQRS file to JSON first\n const jsonResult = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!jsonResult.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}`\n };\n }\n \n // Parse the JSON results\n let queryResults;\n try {\n queryResults = JSON.parse(jsonResult.stdout);\n } catch (parseError) {\n return {\n success: false,\n error: `Failed to parse query results JSON: ${parseError}`\n };\n }\n \n // Generate mermaid diagram from graph results\n const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata);\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.md');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write markdown file with mermaid diagram\n writeFileSync(defaultOutputPath, mermaidContent);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: mermaidContent\n };\n } catch (error) {\n return {\n success: false,\n error: `Mermaid graph evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Generate mermaid diagram from CodeQL graph query results\n */\nfunction generateMermaidFromGraphResults(queryResults: unknown, metadata: QueryMetadata): string {\n const queryName = sanitizeMarkdown(metadata.name || 'CodeQL Query Results');\n const queryDesc = sanitizeMarkdown(metadata.description || 'Graph visualization of CodeQL query results');\n \n let mermaidContent = `# ${queryName}\\n\\n${queryDesc}\\n\\n`;\n \n // Handle different result structures that CodeQL graph queries can produce\n if (!queryResults || typeof queryResults !== 'object') {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Results]\\n```\\n';\n return mermaidContent;\n }\n \n // Check if results have the expected structure for graph queries\n const tuples = queryResults.tuples || queryResults;\n \n if (!Array.isArray(tuples) || tuples.length === 0) {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Graph Data]\\n```\\n';\n return mermaidContent;\n }\n \n mermaidContent += '```mermaid\\ngraph TD\\n';\n \n // Track nodes and edges to avoid duplicates\n const nodes = new Set();\n const edges = new Set();\n \n // Process each tuple in the results\n tuples.forEach((tuple: unknown, index: number) => {\n if (Array.isArray(tuple) && tuple.length >= 2) {\n // Extract source and target from tuple\n const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`);\n const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`);\n const label = tuple[2]?.toString() || '';\n \n // Add nodes\n nodes.add(source);\n nodes.add(target);\n \n // Add edge\n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n } else if (typeof tuple === 'object' && tuple !== null) {\n // Handle object-based results\n const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`);\n const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`);\n const label = tuple.label?.toString() || tuple.relation?.toString() || '';\n \n nodes.add(source);\n nodes.add(target);\n \n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n }\n });\n \n // If no edges were created, create a simple diagram showing the first few nodes\n if (edges.size === 0 && nodes.size > 0) {\n const nodeArray = Array.from(nodes).slice(0, 10); // Limit to avoid clutter\n nodeArray.forEach((node, index) => {\n if (index === 0) {\n mermaidContent += ` ${node}[${sanitizeLabel(node)}]\\n`;\n } else {\n mermaidContent += ` ${nodeArray[0]} --> ${node}\\n`;\n }\n });\n }\n \n mermaidContent += '```\\n\\n';\n \n // Add statistics\n mermaidContent += `## Query Statistics\\n\\n`;\n mermaidContent += `- Total nodes: ${nodes.size}\\n`;\n mermaidContent += `- Total edges: ${edges.size}\\n`;\n mermaidContent += `- Total tuples processed: ${tuples.length}\\n`;\n \n return mermaidContent;\n}\n\n/**\n * Sanitize node IDs for mermaid compatibility\n */\nfunction sanitizeNodeId(id: string): string {\n return id\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^(\\d)/, 'n$1') // Prefix with 'n' if starts with number\n .substring(0, 50); // Limit length\n}\n\n/**\n * Sanitize labels for mermaid compatibility\n */\nfunction sanitizeLabel(label: string): string {\n return label\n .replace(/[|\"`<>\\n\\r\\t]/g, '') // Remove problematic characters including backticks, newlines, angle brackets\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 30); // Limit length for readability\n}\n\n/**\n * Sanitize markdown content to prevent injection\n */\nfunction sanitizeMarkdown(content: string): string {\n return content\n .replace(/[<>\"`]/g, '') // Remove potentially dangerous characters\n .replace(/\\n/g, ' ') // Convert newlines to spaces\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 100); // Limit length\n}\n\n/**\n * Main evaluation function that determines which evaluator to use\n */\nexport async function evaluateQueryResults(\n bqrsPath: string,\n queryPath: string,\n evaluationFunction?: string,\n outputPath?: string\n): Promise {\n try {\n // If no evaluation function specified, default to json-decode\n const evalFunc = evaluationFunction || 'json-decode';\n \n logger.info(`Evaluating query results with function: ${evalFunc}`);\n \n // Handle built-in evaluation functions\n switch (evalFunc) {\n case 'json-decode':\n return await evaluateWithJsonDecoder(bqrsPath, outputPath);\n \n case 'csv-decode':\n return await evaluateWithCsvDecoder(bqrsPath, outputPath);\n \n case 'mermaid-graph':\n return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath);\n \n default:\n // Check if it's a path to a custom evaluation script\n if (isAbsolute(evalFunc)) {\n return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath);\n } else {\n return {\n success: false,\n error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(', ')}`\n };\n }\n }\n } catch (error) {\n return {\n success: false,\n error: `Query evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Execute custom evaluation script\n */\nasync function evaluateWithCustomScript(\n _bqrsPath: string,\n _queryPath: string,\n _scriptPath: string,\n _outputPath?: string\n): Promise {\n // TODO: Implement custom script execution\n // This would need to execute the script with bqrsPath and queryPath as arguments\n // and capture the output\n return {\n success: false,\n error: 'Custom evaluation scripts are not yet implemented'\n };\n}", "/**\n * Log directory management utilities for CodeQL query and test runs\n */\n\nimport { mkdirSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { randomBytes } from 'crypto';\nimport { getProjectTmpDir } from '../utils/temp-dir';\n\n/**\n * Ensure that a given path is within a base directory.\n * Throws an error if the path is outside the base directory.\n */\nfunction ensurePathWithinBase(baseDir: string, targetPath: string): string {\n const absBase = resolve(baseDir);\n const absTarget = resolve(targetPath);\n if (!absTarget.startsWith(absBase + '/') && absTarget !== absBase) {\n throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`);\n }\n return absTarget;\n}\n\n/**\n * Get or create a unique log directory for query/test runs\n * \n * @param logDir - Optional custom log directory from parameters\n * @returns Absolute path to the log directory\n */\nexport function getOrCreateLogDirectory(logDir?: string): string {\n // Use CODEQL_QUERY_LOG_DIR env var or default base\n const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir('query-logs');\n\n // If logDir is explicitly provided, validate it is within baseLogDir\n if (logDir) {\n const absLogDir = ensurePathWithinBase(baseLogDir, logDir);\n if (!existsSync(absLogDir)) {\n mkdirSync(absLogDir, { recursive: true });\n }\n return absLogDir;\n }\n \n // Otherwise, use baseLogDir and create a unique subdirectory\n \n // Create base directory if it doesn't exist\n if (!existsSync(baseLogDir)) {\n mkdirSync(baseLogDir, { recursive: true });\n }\n \n // Generate unique subdirectory with timestamp and random ID\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const uniqueId = randomBytes(4).toString('hex');\n const uniqueLogDir = join(baseLogDir, `query-run-${timestamp}-${uniqueId}`);\n \n mkdirSync(uniqueLogDir, { recursive: true });\n \n return uniqueLogDir;\n}\n", "/**\n * Secure project-local temporary directory utilities.\n *\n * All temporary files are created under `/.tmp/` which is\n * `.gitignore`d. This avoids writing to the OS temp directory\n * (`os.tmpdir()` / `/tmp`), which is world-readable and triggers\n * CWE-377 / CWE-378 (js/insecure-temporary-file).\n */\n\nimport { mkdirSync, mkdtempSync } from 'fs';\nimport { join } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n * Stored under `/.tmp` and excluded from version control.\n */\nconst PROJECT_TMP_BASE = join(getPackageRootDir(), '.tmp');\n\n/**\n * Return the project-local `.tmp` base directory, creating it if needed.\n */\nexport function getProjectTmpBase(): string {\n mkdirSync(PROJECT_TMP_BASE, { recursive: true });\n return PROJECT_TMP_BASE;\n}\n\n/**\n * Create a unique temporary directory under the project `.tmp` root.\n *\n * Works identically to `fs.mkdtempSync(os.tmpdir(), prefix)` but is\n * scoped to the repository.\n *\n * @param prefix - Directory name prefix (e.g. `'codeql-external-'`).\n * @returns Absolute path to the newly created directory.\n */\nexport function createProjectTempDir(prefix: string): string {\n const base = getProjectTmpBase();\n return mkdtempSync(join(base, prefix));\n}\n\n/**\n * Return a deterministic subdirectory under `.tmp/`, creating it\n * if it does not already exist.\n *\n * Useful for well-known scratch areas such as `query-logs` or `quickeval`.\n *\n * @param name - Subdirectory name (e.g. `'query-logs'`).\n * @returns Absolute path to the subdirectory.\n */\nexport function getProjectTmpDir(name: string): string {\n const dir = join(getProjectTmpBase(), name);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n", "/**\n * CodeQL BQRS info tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInfoTool: CLIToolDefinition = {\n name: 'codeql_bqrs_info',\n description: 'Get metadata and information about BQRS result files',\n command: 'codeql',\n subcommand: 'bqrs info',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to examine'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs info results.bqrs',\n 'codeql bqrs info --verbose results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * CodeQL BQRS interpret tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInterpretTool: CLIToolDefinition = {\n name: 'codeql_bqrs_interpret',\n description: 'Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)',\n command: 'codeql',\n subcommand: 'bqrs interpret',\n inputSchema: {\n file: z.string().describe('The BQRS file to interpret'),\n format: z.enum(['csv', 'sarif-latest', 'sarifv2.1.0', 'graphtext', 'dgml', 'dot'])\n .describe('Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)'),\n output: createCodeQLSchemas.output(),\n t: z.array(z.string())\n .describe('Query metadata key=value pairs. At least \"kind\" and \"id\" must be specified (e.g., [\"kind=graph\", \"id=js/print-ast\"])'),\n 'max-paths': z.number().optional()\n .describe('Maximum number of paths to produce for each alert with paths (default: 4)'),\n 'sarif-add-file-contents': z.boolean().optional()\n .describe('[SARIF only] Include full file contents for all files referenced in results'),\n 'sarif-add-snippets': z.boolean().optional()\n .describe('[SARIF only] Include code snippets for each location with context'),\n 'sarif-group-rules-by-pack': z.boolean().optional()\n .describe('[SARIF only] Place rule objects under their QL pack in tool.extensions property'),\n 'sarif-multicause-markdown': z.boolean().optional()\n .describe('[SARIF only] Include multi-cause alerts as Markdown-formatted lists'),\n 'sarif-category': z.string().optional()\n .describe('[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)'),\n 'csv-location-format': z.enum(['uri', 'line-column', 'offset-length']).optional()\n .describe('[CSV only] Format for locations in CSV output (default: line-column)'),\n 'dot-location-url-format': z.string().optional()\n .describe('[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})'),\n threads: z.number().optional()\n .describe('Number of threads for computing paths (0 = one per core, -N = leave N cores unused)'),\n 'column-kind': z.enum(['utf8', 'utf16', 'utf32', 'bytes']).optional()\n .describe('[SARIF only] Column kind for interpreting location columns'),\n 'unicode-new-lines': z.boolean().optional()\n .describe('[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs',\n 'codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs',\n 'codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs',\n 'codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs',\n 'codeql bqrs interpret --format=sarif-latest --sarif-add-snippets --sarif-category=security --output=results.sarif -t kind=path-problem -t id=go/path-injection results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};\n", "/**\n * CodeQL database analyze tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseAnalyzeTool: CLIToolDefinition = {\n name: 'codeql_database_analyze',\n description: 'Run queries or query suites against CodeQL databases',\n command: 'codeql',\n subcommand: 'database analyze',\n inputSchema: {\n database: z.string().describe('Path to the CodeQL database'),\n queries: z.string().describe('Queries or query suite to run'),\n output: z.string().optional().describe('Output file path'),\n format: z.enum(['csv', 'json', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n 'download-location': z.string().optional()\n .describe('Location to download missing dependencies'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n timeout: z.number().optional().describe('Timeout in seconds'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif',\n 'codeql database analyze mydb codeql/java-queries --format=csv'\n ]\n};", "/**\n * CodeQL database create tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createDatabaseResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseCreateTool: CLIToolDefinition = {\n name: 'codeql_database_create',\n description: 'Create a CodeQL database from source code',\n command: 'codeql',\n subcommand: 'database create',\n inputSchema: {\n database: z.string().describe('Database path/name to create'),\n language: z.string().optional().describe('Programming language(s) to extract'),\n 'source-root': z.string().optional().describe('Root directory of source code'),\n command: z.string().optional().describe('Build command for compiled languages'),\n 'build-mode': z.enum(['none', 'autobuild', 'manual']).optional()\n .describe('Build mode: none (interpreted langs), autobuild, or manual'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n overwrite: z.boolean().optional().describe('Overwrite existing database if it exists'),\n 'no-cleanup': z.boolean().optional().describe('Skip database cleanup after finalization'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database create --language=java --source-root=/path/to/project mydb',\n 'codeql database create --language=cpp --command=\"make all\" mydb',\n 'codeql database create --language=python,javascript mydb'\n ],\n resultProcessor: createDatabaseResultProcessor()\n};", "/**\n * CodeQL find class position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface ClassPosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a class name identifier in a QL file.\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findClassPosition(filepath: string, className: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Match class definition with the specific class name\n const classNameRegex = new RegExp(`\\\\bclass\\\\s+(${className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})\\\\b`);\n const match = classNameRegex.exec(line);\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The class name is in capture group 1\n const classNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = classNameStart + 1; // 1-based column numbering\n const end_col = start_col + className.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Class name '${className}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find class position tool with the MCP server\n */\nexport function registerFindClassPositionTool(server: McpServer): void {\n server.tool(\n 'find_class_position',\n 'Finds startline, startcol, endline endcol of a class for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the class to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findClassPosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding class position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find predicate position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface PredicatePosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a predicate name in a QL file.\n * Supports: \n * - predicate name(...) - predicates with no return type\n * - Type name(...) - predicates with return type (e.g., string foo())\n * - name(...) (inside class) - member predicates\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findPredicatePosition(filepath: string, predicateName: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n const escapedName = predicateName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Match predicate definition with the specific predicate name\n // Pattern 1: predicate name(...)\n const predicateKeywordRegex = new RegExp(`\\\\bpredicate\\\\s+(${escapedName})\\\\s*\\\\(`);\n let match = predicateKeywordRegex.exec(line);\n \n // Pattern 2: Type name(...) - predicates with return type\n // Matches: string foo(), int bar(), MyClass baz(), etc.\n // Must start at beginning of line (with optional whitespace) or after certain keywords\n if (!match) {\n const returnTypeRegex = new RegExp(`(?:^|\\\\s)(?:abstract\\\\s+)?(?:cached\\\\s+)?(?:private\\\\s+)?(?:deprecated\\\\s+)?(?:\\\\w+)\\\\s+(${escapedName})\\\\s*\\\\(`);\n match = returnTypeRegex.exec(line);\n }\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The predicate name is in capture group 1\n const predicateNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = predicateNameStart + 1; // 1-based column numbering\n const end_col = start_col + predicateName.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find predicate position tool with the MCP server\n */\nexport function registerFindPredicatePositionTool(server: McpServer): void {\n server.tool(\n 'find_predicate_position',\n 'Finds startline, startcol, endline endcol of a predicate for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the predicate to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findPredicatePosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding predicate position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find query files tool\n * Discovers and tracks all files related to a CodeQL query\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { findCodeQLQueryFiles } from '../../lib/query-file-finder';\nimport { logger } from '../../utils/logger';\n\n/**\n * Register the find_codeql_query_files tool\n */\nexport function registerFindCodeQLQueryFilesTool(server: McpServer): void {\n server.tool(\n 'find_codeql_query_files',\n 'Find and track all files and directories related to a CodeQL query, including resolved metadata',\n {\n queryPath: z.string().describe('Path to the CodeQL query file (.ql)'),\n language: z.string().optional().describe('Programming language (optional, will be inferred if not provided)'),\n resolveMetadata: z.boolean().optional().describe('Whether to resolve query metadata (default: true)')\n },\n async ({ queryPath, language, resolveMetadata }) => {\n try {\n const result = await findCodeQLQueryFiles(\n queryPath,\n language,\n resolveMetadata !== false // Default to true if not specified\n );\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]\n };\n } catch (error) {\n logger.error('Error finding CodeQL query files:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }\n ],\n isError: true\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query file finder utilities\n * Handles discovery and tracking of query-related files and directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { QueryFileInfo, QueryFilesResult } from '../types/codeql';\nimport { resolveQueryMetadata } from './metadata-resolver';\n\n// Supported CodeQL languages and their file extensions (alphabetically ordered)\nconst LANGUAGE_EXTENSIONS: Record = {\n actions: 'yml',\n cpp: 'cpp',\n csharp: 'cs',\n go: 'go',\n java: 'java',\n javascript: 'js',\n python: 'py',\n ruby: 'rb',\n swift: 'swift',\n typescript: 'ts'\n};\n\nconst KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS);\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n return LANGUAGE_EXTENSIONS[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Infer the language from the query file's directory structure\n */\nfunction inferLanguageFromPath(queryPath: string): string {\n const parts = queryPath.split(path.sep);\n\n for (const part of parts) {\n if (KNOWN_LANGUAGES.includes(part.toLowerCase())) {\n return part.toLowerCase();\n }\n }\n\n // Default fallback\n return 'unknown';\n}\n\n/**\n * Find the nearest qlpack.yml or codeql-pack.yml file by walking up the directory tree\n */\nfunction findNearestQlpack(startPath: string): string | null {\n let currentPath = startPath;\n const root = path.parse(currentPath).root;\n\n while (currentPath !== root) {\n // Check for codeql-pack.yml first (newer format), then qlpack.yml\n for (const packFile of ['codeql-pack.yml', 'qlpack.yml']) {\n const packPath = path.join(currentPath, packFile);\n if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) {\n return packPath;\n }\n }\n currentPath = path.dirname(currentPath);\n }\n\n return null;\n}\n\n/**\n * Read and parse qlpack.yml file\n */\nfunction readQlpackMetadata(qlpackPath: string): Record | null {\n try {\n const content = fs.readFileSync(qlpackPath, 'utf-8');\n const parsed = yaml.load(content) as Record;\n return parsed;\n } catch (_error) {\n // If we can't parse it, return null rather than failing\n return null;\n }\n}\n\n/**\n * Check if a file exists and return QueryFileInfo\n */\nfunction checkFile(filePath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n return {\n exists,\n path: filePath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: filePath // Return the path even on error\n };\n }\n}\n\n/**\n * Check if a directory exists and return QueryFileInfo\n */\nfunction checkDirectory(dirPath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n return {\n exists,\n path: dirPath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: dirPath // Return the path even on error\n };\n }\n}\n\n/**\n * Find all test code files in the test directory\n */\nfunction findTestCodeFiles(testDir: string, queryName: string, language: string): string[] {\n if (!fs.existsSync(testDir)) {\n return [];\n }\n\n try {\n const files = fs.readdirSync(testDir);\n const languageExt = getLanguageExtension(language);\n const testFiles: string[] = [];\n\n // Look for files matching the query name or other test code files\n const allValidExtensions = [...new Set([...Object.values(LANGUAGE_EXTENSIONS), 'yaml'])]; // Include yaml as alias for yml\n\n for (const file of files) {\n const filePath = path.join(testDir, file);\n const stat = fs.statSync(filePath);\n\n if (stat.isFile()) {\n // Include the primary test file matching query name\n if (file === `${queryName}.${languageExt}`) {\n testFiles.push(filePath);\n }\n // Include other code files (but not .qlref, .expected, .actual files)\n else if (!file.endsWith('.qlref') && !file.endsWith('.expected') && !file.endsWith('.actual')) {\n const ext = path.extname(file).slice(1);\n if (ext === languageExt || allValidExtensions.includes(ext)) {\n testFiles.push(filePath);\n }\n }\n }\n }\n\n return testFiles;\n } catch {\n return [];\n }\n}\n\n/**\n * Find CodeQL query files and directories based on a query file path\n * Optionally resolves metadata if the query file exists\n */\nexport async function findCodeQLQueryFiles(\n queryFilePath: string,\n language?: string,\n resolveMetadata: boolean = true\n): Promise {\n // Resolve absolute path\n const absoluteQueryPath = path.resolve(queryFilePath);\n\n // Extract query name and directory\n const queryName = path.basename(absoluteQueryPath, '.ql');\n const queryDir = path.dirname(absoluteQueryPath);\n\n // Infer language if not provided\n const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath);\n\n // Check query file itself\n const queryPath = checkFile(absoluteQueryPath);\n const queryDirectory = checkDirectory(queryDir);\n\n // Check for documentation files\n const mdPath = path.join(queryDir, `${queryName}.md`);\n const qhelpPath = path.join(queryDir, `${queryName}.qhelp`);\n const mdInfo = checkFile(mdPath);\n const qhelpInfo = checkFile(qhelpPath);\n\n const documentationPath: QueryFileInfo = mdInfo.exists ? mdInfo : (qhelpInfo.exists ? qhelpInfo : {\n exists: false,\n path: mdPath // Suggest .md as the default\n });\n\n // Check for specification file\n const qspecPath = path.join(queryDir, `${queryName}.qspec`);\n const specificationPath = checkFile(qspecPath);\n\n // Determine test directory\n // Pattern: if query is in .../src/QueryName/, test should be in .../test/QueryName/\n let testDir: string;\n if (queryDir.includes(`${path.sep}src${path.sep}`)) {\n // Find the last occurrence of /src/ and replace it with /test/\n const parts = queryDir.split(path.sep);\n const srcIndex = parts.lastIndexOf('src');\n if (srcIndex !== -1) {\n parts[srcIndex] = 'test';\n testDir = parts.join(path.sep);\n } else {\n // Fallback in case split didn't find it\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n } else {\n // Fallback: if not in src directory, construct test dir based on parent\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n const testDirectory = checkDirectory(testDir);\n\n // Check for .qlref file\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const qlrefInfo = checkFile(qlrefPath);\n\n // Find test code files\n const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage);\n\n // Check for expected results\n const expectedPath = path.join(testDir, `${queryName}.expected`);\n const expectedResultsPath = checkFile(expectedPath);\n\n // Check for actual results\n const actualPath = path.join(testDir, `${queryName}.actual`);\n const actualResultsPath = checkFile(actualPath);\n\n // Check for test database\n const testprojPath = path.join(testDir, `${queryName}.testproj`);\n const testDatabasePath = checkDirectory(testprojPath);\n\n // Determine missing files\n const missingFiles: string[] = [];\n if (!queryPath.exists) missingFiles.push(queryPath.path);\n if (!documentationPath.exists) missingFiles.push(documentationPath.path);\n if (!specificationPath.exists) missingFiles.push(specificationPath.path);\n if (!testDirectory.exists) missingFiles.push(testDirectory.path);\n if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path);\n if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`));\n if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path);\n\n const allFilesExist = missingFiles.length === 0;\n\n // Resolve metadata if requested and query file exists\n let metadata: { [key: string]: string | string[] } | undefined;\n if (resolveMetadata && queryPath.exists) {\n const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath);\n if (resolvedMetadata) {\n metadata = resolvedMetadata;\n }\n }\n\n // Resolve pack metadata and directories by finding the nearest qlpack.yml files\n let packMetadata: Record | undefined;\n const queryPackPath = findNearestQlpack(queryDir);\n const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir;\n if (queryPackPath) {\n const parsed = readQlpackMetadata(queryPackPath);\n if (parsed) {\n packMetadata = parsed;\n }\n }\n\n // Find pack directory for test files\n const testPackPath = findNearestQlpack(testDir);\n const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir;\n\n return {\n queryName,\n language: detectedLanguage,\n\n allFilesExist,\n\n files: {\n query: {\n dir: queryDirectory.path,\n doc: path.basename(documentationPath.path),\n packDir: queryPackDir,\n query: path.basename(queryPath.path),\n spec: path.basename(specificationPath.path)\n },\n test: {\n actual: path.basename(actualResultsPath.path),\n dir: testDirectory.path,\n expected: path.basename(expectedResultsPath.path),\n packDir: testPackDir,\n qlref: path.basename(qlrefInfo.path),\n testCode: testCodePaths,\n testDatabaseDir: testDatabasePath.path\n }\n },\n\n metadata,\n\n missingFiles,\n\n packMetadata,\n\n status: {\n actualResultsExist: actualResultsPath.exists,\n documentationExists: documentationPath.exists,\n expectedResultsExist: expectedResultsPath.exists,\n hasTestCode: testCodePaths.length > 0,\n qlrefExists: qlrefInfo.exists,\n queryExists: queryPath.exists,\n specificationExists: specificationPath.exists,\n testDatabaseDirExists: testDatabasePath.exists,\n testDirectoryExists: testDirectory.exists\n }\n };\n}\n", "\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n", "/**\n * CodeQL metadata resolver utilities\n * Handles resolution of query metadata using the CodeQL CLI\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * Query metadata structure returned by codeql resolve metadata\n */\nexport interface QueryMetadata {\n [key: string]: string | string[];\n}\n\n/**\n * Resolve metadata for a CodeQL query file\n * @param queryPath - Absolute or relative path to the .ql query file\n * @returns Parsed metadata object or null if resolution fails\n */\nexport async function resolveQueryMetadata(queryPath: string): Promise {\n try {\n logger.info(`Resolving metadata for query: ${queryPath}`);\n\n const result = await executeCodeQLCommand(\n 'resolve metadata',\n { format: 'json' },\n [queryPath]\n );\n\n if (!result.success) {\n logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error);\n return null;\n }\n\n // Parse the JSON output\n try {\n const metadata = JSON.parse(result.stdout);\n return metadata;\n } catch (parseError) {\n logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError);\n return null;\n }\n } catch (error) {\n logger.error(`Error resolving metadata for ${queryPath}:`, error);\n return null;\n }\n}\n", "/**\n * CodeQL generate log-summary tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateLogSummaryTool: CLIToolDefinition = {\n name: 'codeql_generate_log-summary',\n description: 'Create a summary of a structured JSON evaluator event log file',\n command: 'codeql',\n subcommand: 'generate log-summary',\n inputSchema: {\n inputLog: z.string().describe('Path to the evaluator log file to summarize'),\n outputFile: z.string().optional().describe('Path to write the summary (optional, defaults to stdout)'),\n format: z.enum(['text', 'predicates', 'overall']).optional()\n .describe('Output format: text (human-readable), predicates (JSON), or overall (stats)'),\n 'minify-output': z.boolean().optional().describe('Minify JSON output'),\n utc: z.boolean().optional().describe('Force UTC timestamps'),\n 'deduplicate-stage-summaries': z.boolean().optional().describe('Deduplicate stage summaries'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt',\n 'codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt',\n 'codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL generate query-help tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateQueryHelpTool: CLIToolDefinition = {\n name: 'codeql_generate_query-help',\n description: 'Generate query help documentation from QLDoc comments',\n command: 'codeql',\n subcommand: 'generate query-help',\n inputSchema: {\n query: z.string().describe('Path to the query file to generate help for'),\n outputFile: z.string().optional().describe('Path to write the help documentation'),\n format: z.enum(['markdown', 'text', 'html']).optional()\n .describe('Output format for the help documentation'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate query-help -- MyQuery.ql',\n 'codeql generate query-help --format=markdown -- MyQuery.ql help.md',\n 'codeql generate query-help --format=html -- MyQuery.ql help.html'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL Language Server Eval tool for MCP server\n * Provides real-time QL code validation through LSP communication\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { CodeQLLanguageServer, Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\n// Global language server instance for reuse across evaluations\nlet globalLanguageServer: CodeQLLanguageServer | null = null;\n\nexport interface LanguageServerEvalParams {\n qlCode: string;\n workspaceUri?: string;\n serverOptions?: LanguageServerOptions;\n}\n\nexport interface LanguageServerEvalResult {\n isValid: boolean;\n diagnostics: Diagnostic[];\n summary: {\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n };\n formattedOutput: string;\n}\n\n/**\n * Format diagnostics for human-readable output\n */\nfunction formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '\u2705 No issues found in QL code';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${diagnostics.length} issue(s):\\n`);\n\n diagnostics.forEach((diagnostic, index) => {\n const severityIcon = getSeverityIcon(diagnostic.severity);\n const severityName = getSeverityName(diagnostic.severity);\n const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`;\n \n lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`);\n lines.push(` ${diagnostic.message}`);\n if (diagnostic.source) {\n lines.push(` Source: ${diagnostic.source}`);\n }\n if (diagnostic.code) {\n lines.push(` Code: ${diagnostic.code}`);\n }\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n\nfunction getSeverityIcon(severity: number): string {\n switch (severity) {\n case 1: return '\u274C'; // Error\n case 2: return '\u26A0\uFE0F'; // Warning\n case 3: return '\u2139\uFE0F'; // Information\n case 4: return '\uD83D\uDCA1'; // Hint\n default: return '\u2753';\n }\n}\n\nfunction getSeverityName(severity: number): string {\n switch (severity) {\n case 1: return 'Error';\n case 2: return 'Warning';\n case 3: return 'Information';\n case 4: return 'Hint';\n default: return 'Unknown';\n }\n}\n\n/**\n * Initialize or get existing language server instance\n */\nasync function getLanguageServer(options: LanguageServerOptions = {}): Promise {\n if (globalLanguageServer && globalLanguageServer.isRunning()) {\n return globalLanguageServer;\n }\n\n // Set default options \u2014 use packageRootDir instead of process.cwd()\n // so the QL search path works regardless of where the server is launched.\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n const defaultOptions: LanguageServerOptions = {\n searchPath: resolve(pkgRoot, 'ql'),\n loglevel: 'WARN',\n ...options\n };\n\n globalLanguageServer = new CodeQLLanguageServer(defaultOptions);\n \n try {\n await globalLanguageServer.start();\n \n // Use provided workspace URI or default to ql directory under package root\n const workspaceUri = pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await globalLanguageServer.initialize(workspaceUri);\n \n logger.info('CodeQL Language Server started and initialized successfully');\n return globalLanguageServer;\n } catch (error) {\n logger.error('Failed to start language server:', error);\n globalLanguageServer = null;\n throw error;\n }\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server\n */\nexport async function evaluateQLCode({\n qlCode,\n workspaceUri: _workspaceUri,\n serverOptions = {}\n}: LanguageServerEvalParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n \n const languageServer = await getLanguageServer(serverOptions);\n \n // Generate unique URI for this evaluation\n const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href;\n \n const diagnostics = await languageServer.evaluateQL(qlCode, evalUri);\n \n // Count diagnostics by severity\n const summary = {\n errorCount: diagnostics.filter(d => d.severity === 1).length,\n warningCount: diagnostics.filter(d => d.severity === 2).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n hintCount: diagnostics.filter(d => d.severity === 4).length\n };\n \n const isValid = summary.errorCount === 0;\n const formattedOutput = formatDiagnostics(diagnostics);\n \n logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`);\n \n return {\n isValid,\n diagnostics,\n summary,\n formattedOutput\n };\n \n } catch (error) {\n logger.error('Error evaluating QL code:', error);\n throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Shutdown the global language server\n */\nexport async function shutdownLanguageServer(): Promise {\n if (globalLanguageServer) {\n logger.info('Shutting down CodeQL Language Server...');\n await globalLanguageServer.shutdown();\n globalLanguageServer = null;\n }\n}\n\n/**\n * Register the language server eval tool with the MCP server\n */\nexport function registerLanguageServerEvalTool(server: McpServer): void {\n server.tool(\n 'codeql_language_server_eval',\n 'Authoritative syntax and semantic validation of CodeQL (QL) code via the CodeQL Language Server. Compiles the query and provides real-time diagnostics with precise error locations. Use this for accurate validation; for quick heuristic checks without compilation, use validate_codeql_query instead.',\n {\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level')\n },\n async ({ ql_code, workspace_uri, search_path, log_level }) => {\n try {\n const serverOptions: LanguageServerOptions = {};\n \n if (search_path) {\n serverOptions.searchPath = search_path;\n }\n if (log_level) {\n serverOptions.loglevel = log_level;\n }\n \n const result = await evaluateQLCode({\n qlCode: ql_code,\n workspaceUri: workspace_uri,\n serverOptions\n });\n \n // Return structured result\n const responseContent = {\n isValid: result.isValid,\n summary: result.summary,\n formattedOutput: result.formattedOutput,\n diagnostics: result.diagnostics.map(d => ({\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n severity: getSeverityName(d.severity),\n message: d.message,\n code: d.code,\n source: d.source\n }))\n };\n \n return {\n content: [\n { \n type: 'text', \n text: JSON.stringify(responseContent, null, 2) \n }\n ],\n };\n \n } catch (error) {\n logger.error('Error in language server eval tool:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n \n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownLanguageServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownLanguageServer();\n });\n}", "/**\n * CodeQL Language Server manager for LSP communication\n * Manages the lifecycle and communication with the CodeQL language server process\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { setTimeout, clearTimeout } from 'timers';\nimport { pathToFileURL } from 'url';\nimport { delimiter, join } from 'path';\nimport { logger } from '../utils/logger';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\n\nexport interface LSPMessage {\n jsonrpc: '2.0';\n id?: number | string;\n method: string;\n params?: unknown;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport interface Diagnostic {\n range: {\n start: { line: number; character: number };\n end: { line: number; character: number };\n };\n severity: number; // 1=Error, 2=Warning, 3=Information, 4=Hint\n source?: string;\n message: string;\n code?: string | number;\n}\n\nexport interface PublishDiagnosticsParams {\n uri: string;\n diagnostics: Diagnostic[];\n}\n\nexport interface LanguageServerOptions {\n searchPath?: string;\n logdir?: string;\n loglevel?: 'OFF' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'ALL';\n synchronous?: boolean;\n verbosity?: 'errors' | 'warnings' | 'progress' | 'progress+' | 'progress++' | 'progress+++';\n}\n\nexport class CodeQLLanguageServer extends EventEmitter {\n private server: ChildProcess | null = null;\n private messageId = 1;\n private pendingResponses = new Map void; reject: (_error: Error) => void }>();\n private isInitialized = false;\n private messageBuffer = '';\n\n constructor(private _options: LanguageServerOptions = {}) {\n super();\n }\n\n async start(): Promise {\n if (this.server) {\n throw new Error('Language server is already running');\n }\n\n logger.info('Starting CodeQL Language Server...');\n\n const args = [\n 'execute', 'language-server',\n '--check-errors=ON_CHANGE'\n ];\n\n // Add optional arguments\n if (this._options.searchPath) {\n args.push(`--search-path=${this._options.searchPath}`);\n }\n if (this._options.logdir) {\n args.push(`--logdir=${this._options.logdir}`);\n }\n if (this._options.loglevel) {\n args.push(`--loglevel=${this._options.loglevel}`);\n }\n if (this._options.synchronous) {\n args.push('--synchronous');\n }\n if (this._options.verbosity) {\n args.push(`--verbosity=${this._options.verbosity}`);\n }\n\n // Build environment with CODEQL_PATH directory prepended to PATH\n // (mirrors the approach in cli-executor.ts getSafeEnvironment).\n const spawnEnv = { ...process.env };\n const codeqlDir = getResolvedCodeQLDir();\n if (codeqlDir && spawnEnv.PATH) {\n spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`;\n } else if (codeqlDir) {\n spawnEnv.PATH = codeqlDir;\n }\n\n this.server = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv\n });\n\n this.server.stderr?.on('data', (data) => {\n logger.debug('CodeQL LS stderr:', data.toString());\n });\n\n this.server.stdout?.on('data', (data) => {\n this.handleStdout(data);\n });\n\n this.server.on('error', (error) => {\n logger.error('CodeQL Language Server error:', error);\n this.emit('error', error);\n });\n\n this.server.on('exit', (code) => {\n logger.info('CodeQL Language Server exited with code:', code);\n this.server = null;\n this.isInitialized = false;\n this.emit('exit', code);\n });\n\n // Wait for server to be ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n private handleStdout(data: Buffer): void {\n this.messageBuffer += data.toString();\n \n let headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n while (headerEnd !== -1) {\n const header = this.messageBuffer.substring(0, headerEnd);\n const contentLengthMatch = header.match(/Content-Length: (\\d+)/);\n \n if (contentLengthMatch) {\n const contentLength = parseInt(contentLengthMatch[1]);\n const messageStart = headerEnd + 4;\n const messageEnd = messageStart + contentLength;\n \n if (this.messageBuffer.length >= messageEnd) {\n const messageContent = this.messageBuffer.substring(messageStart, messageEnd);\n this.messageBuffer = this.messageBuffer.substring(messageEnd);\n \n try {\n const message: LSPMessage = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse LSP message:', error, messageContent);\n }\n \n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid LSP header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: LSPMessage): void {\n logger.debug('Received LSP message:', message);\n\n // Handle responses to our requests\n if (message.id !== undefined && this.pendingResponses.has(Number(message.id))) {\n const pending = this.pendingResponses.get(Number(message.id))!;\n this.pendingResponses.delete(Number(message.id));\n \n if (message.error) {\n pending.reject(new Error(`LSP Error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications from server\n if (message.method === 'textDocument/publishDiagnostics') {\n this.emit('diagnostics', message.params as PublishDiagnosticsParams);\n }\n }\n\n private sendMessage(message: LSPMessage): void {\n if (!this.server?.stdin) {\n throw new Error('Language server is not running');\n }\n\n const messageStr = JSON.stringify(message);\n const contentLength = Buffer.byteLength(messageStr, 'utf8');\n const header = `Content-Length: ${contentLength}\\r\\n\\r\\n`;\n const fullMessage = header + messageStr;\n\n logger.debug('Sending LSP message:', fullMessage);\n this.server.stdin.write(fullMessage);\n }\n\n private sendRequest(method: string, params?: unknown): Promise {\n const id = this.messageId++;\n const message: LSPMessage = {\n jsonrpc: '2.0',\n id,\n method,\n params\n };\n\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n this.sendMessage(message);\n \n // Add timeout\n setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 10000); // 10 second timeout\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n const message: LSPMessage = {\n jsonrpc: '2.0',\n method,\n params\n };\n this.sendMessage(message);\n }\n\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n return;\n }\n\n logger.info('Initializing CodeQL Language Server...');\n\n const initParams = {\n processId: process.pid,\n clientInfo: {\n name: 'codeql-development-mcp-server',\n version: '2.23.9'\n },\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n didClose: true\n },\n publishDiagnostics: {}\n }\n }\n };\n\n if (workspaceUri) {\n (initParams as unknown as { workspaceFolders: unknown[] }).workspaceFolders = [{\n uri: workspaceUri,\n name: 'codeql-workspace'\n }];\n }\n\n await this.sendRequest('initialize', initParams);\n this.sendNotification('initialized', {});\n \n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n async evaluateQL(qlCode: string, uri?: string): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n\n // Default to a project-local virtual URI rather than /tmp\n const documentUri = uri || pathToFileURL(join(getProjectTmpDir('lsp-eval'), 'eval.ql')).href;\n\n return new Promise((resolve, reject) => {\n let diagnosticsReceived = false;\n const timeout = setTimeout(() => {\n if (!diagnosticsReceived) {\n this.removeAllListeners('diagnostics');\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 5000);\n\n // Listen for diagnostics\n const diagnosticsHandler = (params: PublishDiagnosticsParams) => {\n if (params.uri === documentUri) {\n diagnosticsReceived = true;\n clearTimeout(timeout);\n this.removeListener('diagnostics', diagnosticsHandler);\n\n // Close the document\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri: documentUri }\n });\n\n resolve(params.diagnostics);\n }\n };\n\n this.on('diagnostics', diagnosticsHandler);\n\n // Open the document with the QL code\n this.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri: documentUri,\n languageId: 'ql',\n version: 1,\n text: qlCode\n }\n });\n });\n }\n\n async shutdown(): Promise {\n if (!this.server) {\n return;\n }\n\n logger.info('Shutting down CodeQL Language Server...');\n\n try {\n await this.sendRequest('shutdown', {});\n this.sendNotification('exit', {});\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n }, 1000);\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL pack install tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackInstallTool: CLIToolDefinition = {\n name: 'codeql_pack_install',\n description: 'Install CodeQL pack dependencies',\n command: 'codeql',\n subcommand: 'pack install',\n inputSchema: {\n packDir: z.string().optional().describe('Directory containing qlpack.yml (default: current)'),\n force: z.boolean().optional().describe('Force reinstall of dependencies'),\n 'no-strict-mode': z.boolean().optional()\n .describe('Allow non-strict dependency resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack install',\n 'codeql pack install --force /path/to/pack',\n 'codeql pack install --no-strict-mode'\n ]\n};", "/**\n * CodeQL pack ls tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackLsTool: CLIToolDefinition = {\n name: 'codeql_pack_ls',\n description: 'List CodeQL packs under some local directory path',\n command: 'codeql',\n subcommand: 'pack ls',\n inputSchema: {\n dir: z.string().optional().describe('The root directory of the package or workspace, defaults to the current working directory'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format: text (default) or json'),\n groups: z.string().optional()\n .describe('List of CodeQL pack groups to include or exclude'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack ls -- .',\n 'codeql pack ls --format=json -- /path/to/pack-directory',\n 'codeql pack ls --format=json --groups=queries,tests -- .'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL query profiling tool\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand } from '../../lib/cli-executor';\nimport { logger } from '../../utils/logger';\nimport { writeFileSync, readFileSync, existsSync } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { mkdirSync } from 'fs';\n\ninterface EvaluatorLogEvent {\n time: string;\n type: string;\n eventId: number;\n nanoTime: number;\n [key: string]: unknown;\n}\n\ninterface PipelineNode {\n eventId: number;\n name: string;\n position?: string;\n type?: string;\n startTime: number;\n endTime: number;\n duration: number;\n resultSize?: number;\n tupleCount?: number;\n dependencies: string[];\n dependencyEventIds: number[];\n}\n\ninterface ProfileData {\n queryName: string;\n totalDuration: number;\n totalEvents: number;\n pipelines: PipelineNode[];\n}\n\n/**\n * Parse evaluator log and create profile data\n */\nfunction parseEvaluatorLog(logPath: string): ProfileData {\n const logContent = readFileSync(logPath, 'utf-8');\n \n // Split by empty lines to get each JSON object (handles both JSONL and pretty-printed JSON)\n const jsonObjects = logContent.split('\\n\\n').filter((s) => s.trim());\n const events: EvaluatorLogEvent[] = jsonObjects\n .map((obj) => {\n try {\n return JSON.parse(obj);\n } catch (_error) {\n logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`);\n return null;\n }\n })\n .filter((event): event is EvaluatorLogEvent => event !== null);\n\n // Map to track pipeline nodes by their start event ID\n const pipelineMap = new Map>();\n // Map to track dependency event IDs by predicate name\n const predicateNameToEventId = new Map();\n \n let queryName = '';\n let queryStartTime = 0;\n let queryEndTime = 0;\n\n for (const event of events) {\n switch (event.type) {\n case 'QUERY_STARTED':\n queryName = (event.queryName as string) || '';\n queryStartTime = event.nanoTime;\n break;\n\n case 'QUERY_COMPLETED':\n queryEndTime = event.nanoTime;\n break;\n\n case 'PREDICATE_STARTED': {\n const predicateName = event.predicateName as string;\n const position = event.position as string | undefined;\n const predicateType = event.predicateType as string | undefined;\n const dependencies = event.dependencies as Record | undefined;\n \n // Track this predicate's event ID by name for dependency resolution\n predicateNameToEventId.set(predicateName, event.eventId);\n \n // Get dependency event IDs\n const dependencyEventIds: number[] = [];\n const dependencyNames: string[] = [];\n if (dependencies) {\n for (const depName of Object.keys(dependencies)) {\n dependencyNames.push(depName);\n const depEventId = predicateNameToEventId.get(depName);\n if (depEventId !== undefined) {\n dependencyEventIds.push(depEventId);\n }\n }\n }\n\n pipelineMap.set(event.eventId, {\n eventId: event.eventId,\n name: predicateName,\n position,\n type: predicateType,\n startTime: event.nanoTime,\n dependencies: dependencyNames,\n dependencyEventIds,\n });\n break;\n }\n\n case 'PREDICATE_COMPLETED': {\n const startEventId = event.startEvent as number;\n const pipelineInfo = pipelineMap.get(startEventId);\n if (pipelineInfo) {\n const startEvent = events.find((e) => e.eventId === startEventId);\n if (startEvent) {\n const duration = (event.nanoTime - startEvent.nanoTime) / 1_000_000; // Convert to ms\n pipelineInfo.endTime = event.nanoTime;\n pipelineInfo.duration = duration;\n pipelineInfo.resultSize = event.resultSize as number | undefined;\n pipelineInfo.tupleCount = event.tupleCount as number | undefined;\n }\n }\n break;\n }\n }\n }\n\n // Convert to array and maintain original evaluation order (by eventId)\n const pipelines: PipelineNode[] = Array.from(pipelineMap.values())\n .filter((p): p is PipelineNode => p.duration !== undefined)\n .sort((a, b) => a.eventId - b.eventId);\n\n const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1_000_000 : 0;\n\n return {\n queryName,\n totalDuration,\n totalEvents: events.length,\n pipelines,\n };\n}\n\n/**\n * Format profile data as JSON\n */\nfunction formatAsJson(profile: ProfileData): string {\n return JSON.stringify(profile, null, 2);\n}\n\n/**\n * Format profile data as Mermaid diagram\n * Creates a graph showing the query evaluation pipelines in order of execution\n * with dependencies as edges, annotated with duration and result sizes\n */\nfunction formatAsMermaid(profile: ProfileData): string {\n const lines: string[] = [];\n\n lines.push('```mermaid');\n lines.push('graph TD');\n lines.push('');\n \n // Add query root node\n lines.push(` QUERY[\"${basename(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms\"]`);\n lines.push('');\n \n // Create nodes for each pipeline in evaluation order (already sorted by eventId)\n profile.pipelines.forEach((pipeline) => {\n const nodeId = `P${pipeline.eventId}`;\n const duration = pipeline.duration.toFixed(2);\n const resultSize = pipeline.resultSize !== undefined ? pipeline.resultSize : '?';\n // Sanitize predicate name for Mermaid\n const name = pipeline.name.replace(/[<>]/g, '').substring(0, 40);\n lines.push(` ${nodeId}[\"${name}
${duration}ms | ${resultSize} results\"]`);\n });\n \n lines.push('');\n \n // Add edges from QUERY to root pipelines (those with no dependencies)\n const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0);\n \n rootPipelines.forEach((pipeline) => {\n lines.push(` QUERY --> P${pipeline.eventId}`);\n });\n \n lines.push('');\n \n // Add edges between pipelines based on dependencies (using eventIds to preserve links)\n profile.pipelines.forEach((pipeline) => {\n pipeline.dependencyEventIds.forEach((depEventId) => {\n const duration = pipeline.duration.toFixed(2);\n lines.push(` P${depEventId} -->|\"${duration}ms\"| P${pipeline.eventId}`);\n });\n });\n \n lines.push('');\n lines.push(' classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px');\n lines.push(' classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px');\n lines.push(' class QUERY query');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Register the profile_codeql_query tool\n */\nexport function registerProfileCodeQLQueryTool(server: McpServer): void {\n server.tool(\n 'profile_codeql_query',\n 'Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file',\n {\n query: z.string().describe('Path to the .ql query file'),\n database: z.string().describe('Path to the CodeQL database directory'),\n evaluatorLog: z\n .string()\n .optional()\n .describe(\n 'Path to an existing structured JSON log (e.g., evaluator-log.jsonl) file. If not provided, the tool will run the query to generate one.'\n ),\n outputDir: z\n .string()\n .optional()\n .describe('Directory to write profiling data files (defaults to same directory as evaluator log)'),\n },\n async (params) => {\n try {\n const { query, database, evaluatorLog, outputDir } = params;\n let logPath = evaluatorLog;\n let bqrsPath: string | undefined;\n let sarifPath: string | undefined;\n\n // If evaluator log not provided, run the query to generate one\n if (!logPath) {\n logger.info('No evaluator log provided, running query to generate one');\n\n // Determine output directory\n const defaultOutputDir = outputDir || join(dirname(query as string), 'profile-output');\n mkdirSync(defaultOutputDir, { recursive: true });\n\n logPath = join(defaultOutputDir, 'evaluator-log.jsonl');\n bqrsPath = join(defaultOutputDir, 'query-results.bqrs');\n sarifPath = join(defaultOutputDir, 'query-results.sarif');\n\n // Run query with evaluator logging and tuple counting\n const queryResult = await executeCodeQLCommand(\n 'query run',\n {\n database: database as string,\n output: bqrsPath,\n 'evaluator-log': logPath,\n 'tuple-counting': true,\n 'evaluator-log-level': 5,\n },\n [query as string]\n );\n\n if (!queryResult.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to run query: ${queryResult.stderr || queryResult.error}`,\n },\n ],\n isError: true,\n };\n }\n\n // Generate SARIF interpretation\n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n\n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n }\n\n // Verify evaluator log exists\n if (!existsSync(logPath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Evaluator log not found at: ${logPath}`,\n },\n ],\n isError: true,\n };\n }\n\n // Parse the evaluator log\n logger.info(`Parsing evaluator log from: ${logPath}`);\n const profile = parseEvaluatorLog(logPath);\n\n // Determine output directory for profile\n const profileOutputDir = outputDir || dirname(logPath);\n mkdirSync(profileOutputDir, { recursive: true });\n\n // Write profile JSON file\n const jsonPath = join(profileOutputDir, 'query-evaluation-profile.json');\n const jsonContent = formatAsJson(profile);\n writeFileSync(jsonPath, jsonContent);\n logger.info(`Profile JSON written to: ${jsonPath}`);\n\n // Write profile Mermaid diagram file\n const mdPath = join(profileOutputDir, 'query-evaluation-profile.md');\n const mdContent = formatAsMermaid(profile);\n writeFileSync(mdPath, mdContent);\n logger.info(`Profile Mermaid diagram written to: ${mdPath}`);\n\n // Build response message\n const outputFiles: string[] = [\n `Profile JSON: ${jsonPath}`,\n `Profile Mermaid: ${mdPath}`,\n `Evaluator Log: ${logPath}`,\n ];\n\n if (bqrsPath) {\n outputFiles.push(`Query Results (BQRS): ${bqrsPath}`);\n }\n\n if (sarifPath && existsSync(sarifPath)) {\n outputFiles.push(`Query Results (SARIF): ${sarifPath}`);\n }\n\n const responseText = [\n 'Query profiling completed successfully!',\n '',\n 'Output Files:',\n ...outputFiles.map((f) => ` - ${f}`),\n '',\n 'Profile Summary:',\n ` - Query: ${basename(profile.queryName)}`,\n ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`,\n ` - Total Pipelines: ${profile.pipelines.length}`,\n ` - Total Events: ${profile.totalEvents}`,\n '',\n 'First 5 Pipeline Nodes (in evaluation order):',\n ...profile.pipelines.slice(0, 5).map((p, idx) => {\n return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || '?'} results)`;\n }),\n ].join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n };\n } catch (error) {\n logger.error('Error profiling CodeQL query:', error);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query compile tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryCompileTool: CLIToolDefinition = {\n name: 'codeql_query_compile',\n description: 'Compile and validate CodeQL queries',\n command: 'codeql',\n subcommand: 'query compile',\n inputSchema: {\n query: z.string().describe('Path to the CodeQL query file (.ql)'),\n database: z.string().optional().describe('Path to the CodeQL database'),\n library: z.string().optional().describe('Path to query library'),\n output: z.string().optional().describe('Output file path'),\n warnings: z.enum(['hide', 'show', 'error']).optional()\n .describe('How to handle compilation warnings'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql query compile --database=/path/to/db MyQuery.ql',\n 'codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql'\n ]\n};", "/**\n * CodeQL query format tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Custom result processor for codeql query format tool\n * Exit code 1 with --check-only means \"file would change\" - this is success for format checking\n */\nfunction formatResultProcessor(result: CLIExecutionResult, params: Record): string {\n const isCheckOnly = params['check-only'];\n const hasFormatChanges = result.exitCode === 1;\n \n if (isCheckOnly && hasFormatChanges) {\n // Mark as success for the CLI tool registry since detecting format changes is the intended behavior\n result.success = true;\n return result.stdout || result.stderr || 'File would change by autoformatting.';\n }\n \n return defaultCLIResultProcessor(result, params);\n}\n\nexport const codeqlQueryFormatTool: CLIToolDefinition = {\n name: 'codeql_query_format',\n description: 'Automatically format CodeQL source code files',\n command: 'codeql',\n subcommand: 'query format',\n inputSchema: {\n files: z.array(z.string()).describe('One or more .ql or .qll source files to format'),\n output: z.string().optional().describe('Write formatted code to this file instead of stdout'),\n 'in-place': z.boolean().optional().describe('Overwrite each input file with formatted version'),\n 'check-only': z.boolean().optional().describe('Check formatting without writing output'),\n backup: z.string().optional().describe('Backup extension when overwriting existing files'),\n 'no-syntax-errors': z.boolean().optional().describe('Ignore syntax errors and pretend file is formatted'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query format -i -- ExampleQuery.ql',\n 'codeql query format --in-place -- queries/*.ql',\n 'codeql query format --check-only -- queries/*.ql'\n ],\n resultProcessor: formatResultProcessor\n};", "/**\n * CodeQL query run tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryRunTool: CLIToolDefinition = {\n name: 'codeql_query_run',\n description: 'Execute a CodeQL query against a database. Use either \"query\" parameter for direct file path OR \"queryName\" + \"queryLanguage\" for pre-defined tool queries.',\n command: 'codeql',\n subcommand: 'query run',\n inputSchema: {\n query: z.string().optional().describe('Path to the CodeQL query file (.ql) - cannot be used with queryName'),\n queryName: z.string().optional().describe('Name of pre-defined query to run (e.g., \"PrintAST\", \"CallGraphFrom\", \"CallGraphTo\") - requires queryLanguage'),\n queryLanguage: z.string().optional().describe('Programming language for tools queries (e.g., \"javascript\", \"java\", \"python\") - required when using queryName'),\n queryPack: z.string().optional().describe('Query pack path (defaults to server/ql//tools/src/ for tool queries)'),\n sourceFiles: z.string().optional().describe('Comma-separated list of source file paths for PrintAST queries (e.g., \"src/main.js,src/utils.js\" or just \"main.js\")'),\n sourceFunction: z.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., \"main,processData\")'),\n targetFunction: z.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., \"helper,validateInput\")'),\n database: createCodeQLSchemas.database(),\n output: createCodeQLSchemas.output(),\n external: z.array(z.string()).optional()\n .describe('External predicate data: predicate=file.csv'),\n timeout: createCodeQLSchemas.timeout(),\n logDir: z.string().optional()\n .describe('Custom directory for query execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n 'evaluator-log': z.string().optional().describe('Path to save evaluator log (deprecated: use logDir instead)'),\n 'evaluator-log-minify': z.boolean().optional()\n .describe('Minimize evaluator log for smaller size'),\n 'evaluator-log-level': z.number().min(1).max(5).optional()\n .describe('Evaluator log verbosity level (1-5, default 5)'),\n 'tuple-counting': z.boolean().optional()\n .describe('Display tuple counts for each evaluation step in evaluator logs'),\n format: z.enum(['sarif-latest', 'sarifv2.1.0', 'csv', 'graphtext', 'dgml', 'dot']).optional()\n .describe('Output format for query results via codeql bqrs interpret. Defaults to sarif-latest for @kind problem/path-problem queries, graphtext for @kind graph queries. Graph formats (graphtext, dgml, dot) only work with @kind graph queries.'),\n interpretedOutput: z.string().optional()\n .describe('Output file for interpreted results (e.g., results.sarif, results.txt). If not provided, defaults based on format: .sarif for SARIF, .txt for graphtext/csv, .dgml for dgml, .dot for dot'),\n evaluationFunction: z.string().optional()\n .describe('[DEPRECATED - use format parameter instead] Built-in function for query results evaluation (e.g., \"mermaid-graph\", \"json-decode\", \"csv-decode\") or path to custom evaluation script'),\n evaluationOutput: z.string().optional()\n .describe('[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query run --database=mydb --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=src/index.js --output=results.bqrs --format=graphtext --interpreted-output=results.txt',\n 'codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif',\n 'codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=\"main.js,utils.js\" --format=graphtext',\n 'codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql'\n ]\n};", "/**\n * CodeQL quick evaluate tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { join, resolve } from 'path';\nimport { findClassPosition } from './find-class-position';\nimport { findPredicatePosition } from './find-predicate-position';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\n\nexport interface QuickEvaluateParams {\n file: string;\n db: string;\n symbol: string;\n output_path?: string;\n}\n\n/**\n * Quick evaluate either a class or a predicate in a CodeQL query.\n * This allows debugging a select portion of QL code without running the whole query.\n */\nexport async function quickEvaluate({\n file,\n db: _db,\n symbol,\n output_path\n}: QuickEvaluateParams): Promise {\n try {\n // Try to find as a class first, then as a predicate\n try {\n await findClassPosition(file, symbol);\n } catch {\n try {\n await findPredicatePosition(file, symbol);\n } catch {\n throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`);\n }\n }\n \n const resolvedOutput = resolve(output_path || join(getProjectTmpDir('quickeval'), 'quickeval.bqrs'));\n \n // For now, return the resolved output path\n // In a full implementation, this would use the CodeQL CLI or query server\n // to perform the actual quick evaluation with the position parameters\n return resolvedOutput;\n } catch (error) {\n throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the quick evaluate tool with the MCP server\n */\nexport function registerQuickEvaluateTool(server: McpServer): void {\n server.tool(\n 'quick_evaluate',\n 'Quick evaluate either a class or a predicate in a CodeQL query for debugging',\n {\n file: z.string().describe('Path to the .ql file containing the symbol'),\n db: z.string().describe('Path to the CodeQL database'),\n symbol: z.string().describe('Name of the class or predicate to evaluate'),\n output_path: z.string().optional().describe('Output path for results (defaults to project-local .tmp/quickeval/)'),\n },\n async ({ file, db, symbol, output_path }) => {\n try {\n const result = await quickEvaluate({ file, db, symbol, output_path });\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error in quick evaluate:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL register database tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { access, constants } from 'fs/promises';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger';\n\nexport interface DatabaseRegistration {\n uri: string;\n content: {\n sourceArchiveZip: string;\n dbDir: string;\n };\n}\n\n/**\n * Register a CodeQL database given a local path to the database directory.\n * Validates that the database exists and has required structure.\n * Supports both full databases (with src.zip) and test databases (with src/ folder).\n */\nexport async function registerDatabase(dbPath: string): Promise {\n try {\n const resolvedPath = resolve(dbPath);\n \n // Check if database directory exists\n await access(resolvedPath, constants.F_OK);\n \n // Check for codeql-database.yml (required for all CodeQL databases)\n const dbYmlPath = resolve(resolvedPath, 'codeql-database.yml');\n await access(dbYmlPath, constants.F_OK);\n \n // Check if src.zip exists (for full databases) OR src/ directory exists (for test databases)\n const srcZipPath = resolve(resolvedPath, 'src.zip');\n const srcDirPath = resolve(resolvedPath, 'src');\n \n let hasSrcZip = false;\n let hasSrcDir = false;\n \n try {\n await access(srcZipPath, constants.F_OK);\n hasSrcZip = true;\n } catch {\n // src.zip not found, check for src/ directory\n }\n \n if (!hasSrcZip) {\n try {\n await access(srcDirPath, constants.F_OK);\n hasSrcDir = true;\n } catch {\n // src directory not found either\n }\n }\n \n if (!hasSrcZip && !hasSrcDir) {\n throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`);\n }\n \n // For now, we just validate and return success message\n // In a full implementation, this would register with a query server\n const sourceType = hasSrcZip ? 'src.zip' : 'src/';\n return `Database registered: ${dbPath} (source: ${sourceType})`;\n } catch (error) {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === 'ENOENT') {\n if (error.message.includes('codeql-database.yml')) {\n throw new Error(`Missing required codeql-database.yml in: ${dbPath}`);\n }\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n if (errorCode === 'EACCES') {\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n }\n throw new Error(`Failed to register database: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the register database tool with the MCP server\n */\nexport function registerRegisterDatabaseTool(server: McpServer): void {\n server.tool(\n 'register_database',\n 'Register a CodeQL database given a local path to the database directory',\n {\n db_path: z.string().describe('Path to the CodeQL database directory'),\n },\n async ({ db_path }) => {\n try {\n const result = await registerDatabase(db_path);\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error registering database:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL resolve database tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveDatabaseTool: CLIToolDefinition = {\n name: 'codeql_resolve_database',\n description: 'Resolve database path and validate database structure',\n command: 'codeql',\n subcommand: 'resolve database',\n inputSchema: {\n database: z.string().describe('Database path to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for database information'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve database -- /path/to/database',\n 'codeql resolve database --format=json -- my-database',\n 'codeql resolve database --format=betterjson -- database-dir'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve languages tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLanguagesTool: CLIToolDefinition = {\n name: 'codeql_resolve_languages',\n description: 'List installed CodeQL extractor packs',\n command: 'codeql',\n subcommand: 'resolve languages',\n inputSchema: {\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for language information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve languages --format=text',\n 'codeql resolve languages --format=json',\n 'codeql resolve languages --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve library-path tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLibraryPathTool: CLIToolDefinition = {\n name: 'codeql_resolve_library-path',\n description: 'Resolve library path for CodeQL queries and libraries',\n command: 'codeql',\n subcommand: 'resolve library-path',\n inputSchema: {\n language: z.string().optional().describe('Programming language to resolve library path for'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for library path information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve library-path --language=java',\n 'codeql resolve library-path --format=json --language=python',\n 'codeql resolve library-path --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve metadata tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveMetadataTool: CLIToolDefinition = {\n name: 'codeql_resolve_metadata',\n description: 'Resolve and return the key-value metadata pairs from a CodeQL query source file.',\n command: 'codeql',\n subcommand: 'resolve metadata',\n inputSchema: {\n query: z.string().describe('Query file to resolve metadata for'),\n format: z.enum(['json']).optional()\n .describe('Output format for metadata information (always JSON, optional for future compatibility)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve metadata -- relative-path/2/MyQuery.ql',\n 'codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve qlref tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveQlrefTool: CLIToolDefinition = {\n name: 'codeql_resolve_qlref',\n description: 'Resolve qlref files to their corresponding query files',\n command: 'codeql',\n subcommand: 'resolve qlref',\n inputSchema: {\n qlref: z.string().describe('Path to the .qlref file to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for qlref resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve qlref -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=json -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=betterjson -- test/MyQuery.qlref'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve queries tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Result processor that only returns stdout for JSON formats\n * This prevents warnings/info from stderr from corrupting JSON output\n */\nconst jsonOnlyResultProcessor = (\n result: CLIExecutionResult,\n params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n\n // For JSON formats (including bylanguage), only return stdout to avoid mixing warnings with JSON\n if (params.format === 'json' || params.format === 'betterjson' || params.format === 'bylanguage') {\n return result.stdout || '[]';\n }\n\n // For text format, include warnings\n let output = '';\n\n if (result.stdout) {\n output += result.stdout;\n }\n\n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n\n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n\n return output;\n};\n\nexport const codeqlResolveQueriesTool: CLIToolDefinition = {\n name: 'codeql_resolve_queries',\n description: 'List available CodeQL queries found on the local filesystem',\n command: 'codeql',\n subcommand: 'resolve queries',\n inputSchema: {\n directory: z.string().optional().describe('Directory to search for queries'),\n language: z.string().optional().describe('Filter queries by programming language'),\n format: z.enum(['text', 'json', 'betterjson', 'bylanguage']).optional()\n .describe('Output format for query list'),\n 'additional-packs': z.union([z.string(), z.array(z.string())]).optional()\n .describe('Additional pack directories to search for CodeQL packs'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve queries',\n 'codeql resolve queries --language=java --format=json',\n 'codeql resolve queries --format=betterjson -- /path/to/queries',\n 'codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries'\n ],\n resultProcessor: jsonOnlyResultProcessor\n};", "/**\n * CodeQL resolve tests tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveTestsTool: CLIToolDefinition = {\n name: 'codeql_resolve_tests',\n description: 'Resolve the local filesystem paths of unit tests and/or queries under some base directory',\n command: 'codeql',\n subcommand: 'resolve tests',\n inputSchema: {\n tests: z.array(z.string()).optional().describe('One or more tests (.ql, .qlref files, or test directories)'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format for test list'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve tests',\n 'codeql resolve tests --format=json -- test-directory',\n 'codeql resolve tests --format=json -- test1.ql test2.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test accept tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestAcceptTool: CLIToolDefinition = {\n name: 'codeql_test_accept',\n description: 'Accept new test results as the expected baseline',\n command: 'codeql',\n subcommand: 'test accept',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref',\n 'codeql test accept -- languages/java/test/MyQuery/',\n 'codeql test accept -- languages/java/src/MyQuery/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test extract tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestExtractTool: CLIToolDefinition = {\n name: 'codeql_test_extract',\n description: 'Extract test databases for CodeQL query tests',\n command: 'codeql',\n subcommand: 'test extract',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more test directories or files'),\n language: z.string().optional().describe('Programming language for extraction'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test extract -- languages/java/test/MyQuery/',\n 'codeql test extract --language=java --threads=4 -- test-directory',\n 'codeql test extract --threads=2 --ram=2048 -- multiple/test/directories'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test run tool\n */\n\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\nimport { z } from 'zod';\n\nexport const codeqlTestRunTool: CLIToolDefinition = {\n name: 'codeql_test_run',\n description: 'Run CodeQL query tests',\n command: 'codeql',\n subcommand: 'test run',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n 'show-extractor-output': z.boolean().optional()\n .describe('Show output from extractors during test execution'),\n 'keep-databases': z.boolean().optional()\n .describe('Keep test databases after running tests'),\n 'learn': z.boolean().optional()\n .describe('Accept current output as expected for failing tests'),\n logDir: z.string().optional()\n .describe('Custom directory for test execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test run /path/to/tests',\n 'codeql test run --learn /path/to/failing/tests',\n 'codeql test run --threads=4 --keep-databases /path/to/tests',\n 'codeql test run --log-dir=/custom/log/path /path/to/tests'\n ]\n};", "/**\n * CodeQL tools registration for MCP server\n * Includes both high-level helpers and CLI command wrappers\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { validateCodeQLSyntax } from '../lib/validation';\nimport { createCodeQLQuery } from '../lib/query-scaffolding';\nimport { registerCLITool } from '../lib/cli-tool-registry';\nimport {\n codeqlBqrsDecodeTool,\n codeqlBqrsInfoTool,\n codeqlBqrsInterpretTool,\n codeqlDatabaseAnalyzeTool,\n codeqlDatabaseCreateTool,\n codeqlGenerateLogSummaryTool,\n codeqlGenerateQueryHelpTool,\n codeqlPackInstallTool,\n codeqlPackLsTool,\n codeqlQueryCompileTool,\n codeqlQueryFormatTool,\n codeqlQueryRunTool,\n codeqlResolveDatabaseTool,\n codeqlResolveLanguagesTool,\n codeqlResolveLibraryPathTool,\n codeqlResolveMetadataTool,\n codeqlResolveQlrefTool,\n codeqlResolveQueriesTool,\n codeqlResolveTestsTool,\n codeqlTestAcceptTool,\n codeqlTestExtractTool,\n codeqlTestRunTool,\n registerFindClassPositionTool,\n registerFindCodeQLQueryFilesTool,\n registerFindPredicatePositionTool,\n registerLanguageServerEvalTool,\n registerProfileCodeQLQueryTool,\n registerQuickEvaluateTool,\n registerRegisterDatabaseTool\n} from './codeql';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all CodeQL tools with the MCP server\n */\nexport function registerCodeQLTools(server: McpServer): void {\n // Register high-level helper tools\n \n // Tool: Validate CodeQL Query (heuristic-based)\n server.tool(\n 'validate_codeql_query',\n 'Quick heuristic validation for CodeQL query structure - checks for common patterns like from/where/select clauses and metadata presence. Does NOT compile the query. For authoritative validation with actual compilation, use codeql_language_server_eval instead.',\n {\n query: z.string().describe('The CodeQL query to validate'),\n language: z.string().optional().describe('Target programming language'),\n },\n async ({ query, language }) => {\n try {\n const validation = validateCodeQLSyntax(query, language);\n return {\n content: [{ type: 'text', text: JSON.stringify(validation, null, 2) }],\n };\n } catch (error) {\n logger.error('Error validating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Create CodeQL Query\n server.tool(\n 'create_codeql_query',\n 'Create directory structure and files for a new CodeQL query with tests',\n {\n basePath: z.string().describe('Base path where src/ and test/ directories will be created'),\n queryName: z.string().describe('Name of the query (e.g., MySecurityQuery)'),\n language: z.string().describe('Target programming language (e.g., javascript, python, java)'),\n description: z.string().optional().describe('Description of what the query does'),\n queryId: z.string().optional().describe('Custom query ID (defaults to language/example/queryname)'),\n },\n async ({ basePath, queryName, language, description, queryId }) => {\n try {\n const result = createCodeQLQuery({\n basePath,\n queryName,\n language,\n description,\n queryId\n });\n \n const summary = {\n success: true,\n queryPath: result.queryPath,\n testPath: result.testPath,\n qlrefPath: result.qlrefPath,\n testCodePath: result.testCodePath,\n filesCreated: result.filesCreated,\n nextSteps: [\n 'Review and customize the generated query in: ' + result.queryPath,\n 'Add test cases to: ' + result.testCodePath,\n 'Run codeql_pack_install to install dependencies',\n 'Run codeql_test_extract to create test database',\n 'Run codeql_test_run to execute tests'\n ]\n };\n \n return {\n content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }],\n };\n } catch (error) {\n logger.error('Error creating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register CLI tools (alphabetically by tool name)\n registerCLITool(server, codeqlBqrsDecodeTool);\n registerCLITool(server, codeqlBqrsInfoTool);\n registerCLITool(server, codeqlBqrsInterpretTool);\n registerCLITool(server, codeqlDatabaseAnalyzeTool);\n registerCLITool(server, codeqlDatabaseCreateTool);\n registerCLITool(server, codeqlGenerateLogSummaryTool);\n registerCLITool(server, codeqlGenerateQueryHelpTool);\n registerCLITool(server, codeqlPackInstallTool);\n registerCLITool(server, codeqlPackLsTool);\n registerCLITool(server, codeqlQueryCompileTool);\n registerCLITool(server, codeqlQueryFormatTool);\n registerCLITool(server, codeqlQueryRunTool);\n registerCLITool(server, codeqlResolveDatabaseTool);\n registerCLITool(server, codeqlResolveLanguagesTool);\n registerCLITool(server, codeqlResolveLibraryPathTool);\n registerCLITool(server, codeqlResolveMetadataTool);\n registerCLITool(server, codeqlResolveQlrefTool);\n registerCLITool(server, codeqlResolveQueriesTool);\n registerCLITool(server, codeqlResolveTestsTool);\n registerCLITool(server, codeqlTestAcceptTool);\n registerCLITool(server, codeqlTestExtractTool);\n registerCLITool(server, codeqlTestRunTool);\n\n // Register new MCP tools (inspired by JordyZomer/codeql-mcp repository)\n registerFindClassPositionTool(server);\n registerFindCodeQLQueryFilesTool(server);\n registerFindPredicatePositionTool(server);\n registerLanguageServerEvalTool(server);\n registerProfileCodeQLQueryTool(server);\n registerQuickEvaluateTool(server);\n registerRegisterDatabaseTool(server);\n}\n", "/**\n * CodeQL query validation utilities\n */\n\nimport { resolve, normalize, isAbsolute, relative } from 'path';\n\nexport interface CodeQLValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n suggestions: string[];\n}\n\n/**\n * Validates CodeQL query syntax and structure\n */\nexport function validateCodeQLSyntax(query: string, _language?: string): CodeQLValidationResult {\n const validation: CodeQLValidationResult = {\n isValid: true,\n errors: [],\n warnings: [],\n suggestions: [],\n };\n\n if (!query.trim()) {\n validation.isValid = false;\n validation.errors.push('Query cannot be empty');\n return validation;\n }\n\n if (!query.includes('from') && !query.includes('select')) {\n validation.warnings.push('Query should typically include \"from\" and \"select\" clauses');\n }\n\n if (!query.includes('@name') && !query.includes('@description')) {\n validation.suggestions.push('Consider adding @name and @description metadata');\n }\n\n return validation;\n}\n\n/**\n * Validates a file path to prevent path traversal attacks\n * @param filePath - The file path to validate\n * @param workspaceRoot - Optional workspace root directory. If not provided, allows any absolute path but still blocks traversal attempts\n * @returns The validated absolute path\n * @throws Error if the path contains path traversal sequences\n */\nexport function validateFilePath(filePath: string, workspaceRoot?: string): string {\n // Normalize the path to resolve any . or .. segments\n const normalizedPath = normalize(filePath);\n \n // Check for path traversal attempts in the normalized path\n // This blocks paths like \"../../../etc/passwd\" even after normalization\n if (normalizedPath.includes('..')) {\n throw new Error(`Invalid file path: path traversal detected in \"${filePath}\"`);\n }\n \n // Resolve to absolute path\n const absolutePath = isAbsolute(normalizedPath) \n ? normalizedPath \n : resolve(workspaceRoot || process.cwd(), normalizedPath);\n \n // If workspace root is specified, ensure the resolved path is within it\n if (workspaceRoot) {\n const relativePath = relative(workspaceRoot, absolutePath);\n \n // If relative path starts with .. or is absolute, it's outside workspace\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Invalid file path: \"${filePath}\" is outside the workspace root`);\n }\n }\n \n return absolutePath;\n}", "/**\n * CodeQL query scaffolding utilities\n * Handles creation of query directory structure and files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface QueryScaffoldingOptions {\n basePath: string;\n queryName: string;\n language: string;\n description?: string;\n queryId?: string;\n}\n\nexport interface QueryScaffoldingResult {\n queryPath: string;\n testPath: string;\n qlrefPath: string;\n testCodePath: string;\n filesCreated: string[];\n}\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n const extensions: Record = {\n javascript: 'js',\n typescript: 'ts',\n python: 'py',\n java: 'java',\n csharp: 'cs',\n cpp: 'cpp',\n go: 'go',\n ruby: 'rb',\n actions: 'yml'\n };\n return extensions[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Generate query template content\n */\nfunction generateQueryTemplate(\n queryName: string,\n language: string,\n description?: string,\n queryId?: string\n): string {\n const desc = description || `${queryName} query`;\n const id = queryId || `${language}/example/${queryName.toLowerCase()}`;\n \n return `/**\n * @id ${id}\n * @name ${queryName}\n * @description ${desc}\n * @kind problem\n * @precision medium\n * @problem.severity warning\n */\n\nimport ${language}\n\n// TODO: Implement query logic\nfrom File f\nwhere f.getBaseName() = \"${queryName}.${getLanguageExtension(language)}\"\nselect f, \"TODO: Add query logic\"\n`;\n}\n\n/**\n * Create the directory structure and files for a new CodeQL query\n */\nexport function createCodeQLQuery(options: QueryScaffoldingOptions): QueryScaffoldingResult {\n const { basePath, queryName, language, description, queryId } = options;\n \n // Resolve absolute paths\n const absoluteBasePath = path.resolve(basePath);\n \n // Define paths with intermediate directory\n const srcDir = path.join(absoluteBasePath, 'src', queryName);\n const testDir = path.join(absoluteBasePath, 'test', queryName);\n \n const queryPath = path.join(srcDir, `${queryName}.ql`);\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const testCodePath = path.join(testDir, `${queryName}.${getLanguageExtension(language)}`);\n \n const filesCreated: string[] = [];\n \n try {\n // Create directories (recursive: true is a no-op if they already exist)\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(testDir, { recursive: true });\n \n // Create files atomically using 'wx' flag (exclusive create) to avoid\n // TOCTOU race between existsSync check and writeFileSync (CWE-367).\n // The 'wx' flag fails with EEXIST if the file already exists.\n try {\n const queryContent = generateQueryTemplate(queryName, language, description, queryId);\n fs.writeFileSync(queryPath, queryContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(queryPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const qlrefContent = `${queryName}/${queryName}.ql\\n`;\n fs.writeFileSync(qlrefPath, qlrefContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(qlrefPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const testCodeContent = `// Test code for ${queryName}\\n// TODO: Add test cases\\n`;\n fs.writeFileSync(testCodePath, testCodeContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(testCodePath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n return {\n queryPath,\n testPath: testDir,\n qlrefPath,\n testCodePath,\n filesCreated\n };\n } catch (error) {\n throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n", "/**\n * CodeQL learning resources utilities\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the getting started guide content\n */\nexport function getGettingStartedGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/getting-started.md'), 'utf-8');\n } catch {\n return 'Getting started guide not available';\n }\n}\n\n/**\n * Get the query basics guide content\n */\nexport function getQueryBasicsGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/query-basics.md'), 'utf-8');\n } catch {\n return 'Query basics guide not available';\n }\n}\n\n/**\n * Get the security templates content\n */\nexport function getSecurityTemplates(): string {\n try {\n return readFileSync(join(__dirname, '../resources/security-templates.md'), 'utf-8');\n } catch {\n return 'Security templates not available';\n }\n}\n\n/**\n * Get the performance patterns content\n */\nexport function getPerformancePatterns(): string {\n try {\n return readFileSync(join(__dirname, '../resources/performance-patterns.md'), 'utf-8');\n } catch {\n return 'Performance patterns not available';\n }\n}", "/**\n * CodeQL resources registration for MCP server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getGettingStartedGuide,\n getQueryBasicsGuide,\n getSecurityTemplates,\n getPerformancePatterns,\n} from '../lib/resources';\n\n/**\n * Register all CodeQL resources with the MCP server\n */\nexport function registerCodeQLResources(server: McpServer): void {\n // Getting Started Guide\n server.resource(\n 'CodeQL Getting Started',\n 'codeql://learning/getting-started',\n {\n description: 'Comprehensive introduction to CodeQL for beginners',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/getting-started',\n mimeType: 'text/markdown',\n text: getGettingStartedGuide(),\n },\n ],\n };\n }\n );\n\n // Query Basics Guide\n server.resource(\n 'CodeQL Query Basics',\n 'codeql://learning/query-basics',\n {\n description: 'Learn the fundamentals of writing CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/query-basics',\n mimeType: 'text/markdown',\n text: getQueryBasicsGuide(),\n },\n ],\n };\n }\n );\n\n // Security Templates\n server.resource(\n 'CodeQL Security Templates',\n 'codeql://templates/security',\n {\n description: 'Ready-to-use security query templates',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://templates/security',\n mimeType: 'text/markdown',\n text: getSecurityTemplates(),\n },\n ],\n };\n }\n );\n\n // Performance Patterns\n server.resource(\n 'CodeQL Performance Patterns',\n 'codeql://patterns/performance',\n {\n description: 'Best practices for writing efficient CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://patterns/performance',\n mimeType: 'text/markdown',\n text: getPerformancePatterns(),\n },\n ],\n };\n }\n );\n}\n", "/**\n * Language-specific resources implementation\n * Dynamically loads and serves language-specific AST references and security patterns\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { LANGUAGE_RESOURCES } from '../types/language-types';\nimport { workspaceRootDir } from '../utils/package-paths';\nimport { logger } from '../utils/logger';\n\n/**\n * Get the base path for ql resources.\n * Uses the workspace root (monorepo root or package root) so that\n * resource files are found regardless of the server's process.cwd().\n */\nfunction getQLBasePath(): string {\n return workspaceRootDir;\n}\n\n/**\n * Load content from a resource file\n */\nfunction loadResourceContent(relativePath: string): string | null {\n try {\n const fullPath = join(getQLBasePath(), relativePath);\n \n if (!existsSync(fullPath)) {\n logger.warn(`Resource file not found: ${fullPath}`);\n return null;\n }\n \n return readFileSync(fullPath, 'utf-8');\n } catch (error) {\n logger.error(`Error loading resource file ${relativePath}:`, error);\n return null;\n }\n}\n\n/**\n * Register language-specific AST resources\n */\nexport function registerLanguageASTResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.astFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/ast`;\n \n server.resource(\n `${langResource.language.toUpperCase()} AST Reference`,\n resourceUri,\n {\n description: `CodeQL AST class reference for ${langResource.language} programs`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.astFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} AST Reference\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register language-specific security pattern resources\n */\nexport function registerLanguageSecurityResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.securityFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/security`;\n \n server.resource(\n `${langResource.language.toUpperCase()} Security Patterns`,\n resourceUri,\n {\n description: `CodeQL security query patterns and framework modeling for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.securityFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} Security Patterns\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register additional language-specific resources (like Go's dataflow patterns)\n */\nexport function registerLanguageAdditionalResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.additionalFiles) continue;\n \n for (const [resourceType, filePath] of Object.entries(langResource.additionalFiles)) {\n const resourceUri = `codeql://languages/${langResource.language}/${resourceType}`;\n \n server.resource(\n `${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}`,\n resourceUri,\n {\n description: `CodeQL ${resourceType.replace('-', ' ')} guide for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(filePath);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n }\n}\n\n/**\n * Register all language-specific resources\n */\nexport function registerLanguageResources(server: McpServer): void {\n logger.info('Registering language-specific resources...');\n \n // Register AST references for all languages\n registerLanguageASTResources(server);\n \n // Register security patterns for languages that have them\n registerLanguageSecurityResources(server);\n \n // Register additional resources (like Go's dataflow patterns)\n registerLanguageAdditionalResources(server);\n \n logger.info(`Registered resources for ${LANGUAGE_RESOURCES.length} languages`);\n}", "/**\n * Type definitions and constants for language-specific resources\n */\n\n// Language mappings to resource files\nexport interface LanguageResource {\n language: string;\n astFile?: string;\n securityFile?: string;\n additionalFiles?: Record;\n}\n\nexport const LANGUAGE_RESOURCES: LanguageResource[] = [\n {\n language: 'actions',\n astFile: 'ql/languages/actions/tools/dev/actions_ast.prompt.md'\n },\n {\n language: 'cpp',\n astFile: 'ql/languages/cpp/tools/dev/cpp_ast.prompt.md',\n securityFile: 'ql/languages/cpp/tools/dev/cpp_security_query_guide.prompt.md'\n },\n {\n language: 'csharp',\n astFile: 'ql/languages/csharp/tools/dev/csharp_ast.prompt.md',\n securityFile: 'ql/languages/csharp/tools/dev/csharp_security_query_guide.prompt.md'\n },\n {\n language: 'go',\n astFile: 'ql/languages/go/tools/dev/go_ast.prompt.md',\n securityFile: 'ql/languages/go/tools/dev/go_security_query_guide.prompt.md',\n additionalFiles: {\n 'dataflow': 'ql/languages/go/tools/dev/go_dataflow.prompt.md',\n 'library-modeling': 'ql/languages/go/tools/dev/go_library_modeling.prompt.md',\n 'basic-queries': 'ql/languages/go/tools/dev/go_basic_queries.prompt.md'\n }\n },\n {\n language: 'java',\n astFile: 'ql/languages/java/tools/dev/java_ast.prompt.md'\n },\n {\n language: 'javascript',\n astFile: 'ql/languages/javascript/tools/dev/javascript_ast.prompt.md',\n securityFile: 'ql/languages/javascript/tools/dev/javascript_security_query_guide.prompt.md'\n },\n {\n language: 'python',\n astFile: 'ql/languages/python/tools/dev/python_ast.prompt.md',\n securityFile: 'ql/languages/python/tools/dev/python_security_query_guide.prompt.md'\n },\n {\n language: 'ql',\n astFile: 'ql/languages/ql/tools/dev/ql_ast.prompt.md'\n },\n {\n language: 'ruby',\n astFile: 'ql/languages/ruby/tools/dev/ruby_ast.prompt.md'\n }\n];", "/**\n * MCP Server workflow prompts for CodeQL development\n *\n * All prompt content is loaded from .prompt.md files in this directory.\n * This file only handles prompt registration and parameter processing.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { basename } from 'path';\nimport { loadPromptTemplate, processPromptTemplate } from './prompt-loader';\nimport { logger } from '../utils/logger';\n\n/** Supported CodeQL languages for tools queries */\nexport const SUPPORTED_LANGUAGES = [\n 'actions',\n 'cpp',\n 'csharp',\n 'go',\n 'java',\n 'javascript',\n 'python',\n 'ruby',\n 'swift'\n] as const;\n\n/**\n * Schema for workshop_creation_workflow prompt parameters.\n * Uses z.coerce.number() for numStages to handle string inputs from VSCode slash commands.\n */\nexport const workshopCreationWorkflowSchema = z.object({\n queryPath: z\n .string()\n .describe('Path to the production-grade CodeQL query (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n workshopName: z\n .string()\n .optional()\n .describe('Name for the workshop directory'),\n numStages: z\n .coerce.number()\n .optional()\n .describe('Number of incremental stages (default: 4-8)')\n});\n\n/**\n * Register MCP workflow prompts\n *\n * Each prompt loads its content from a corresponding .prompt.md file\n * and processes any parameter substitutions.\n */\nexport function registerWorkflowPrompts(server: McpServer): void {\n // Test-Driven Development Prompt\n server.prompt(\n 'test_driven_development',\n 'Test-driven development workflow for CodeQL queries using MCP tools',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n queryName: queryName || '[QueryName]'\n });\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `## Context\\n\\n- **Language**: ${language}\\n${queryName ? `- **Query Name**: ${queryName}\\n` : ''}\\n${content}`\n }\n }\n ]\n };\n }\n );\n\n // Tools Query Workflow Prompt\n server.prompt(\n 'tools_query_workflow',\n 'Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n database: z.string().describe('Path to the CodeQL database'),\n sourceFiles: z\n .string()\n .optional()\n .describe(\n 'Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'\n ),\n sourceFunction: z\n .string()\n .optional()\n .describe(\n 'Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'\n ),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")')\n },\n async ({\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n }) => {\n const template = loadPromptTemplate('tools-query-workflow.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n database\n });\n\n const contextSection = buildToolsQueryContext(\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + content\n }\n }\n ]\n };\n }\n );\n\n // Workshop Creation Workflow Prompt\n server.prompt(\n 'workshop_creation_workflow',\n 'Guide for creating CodeQL query development workshops from production-grade queries',\n workshopCreationWorkflowSchema.shape,\n async ({ queryPath, language, workshopName, numStages }) => {\n const template = loadPromptTemplate('workshop-creation-workflow.prompt.md');\n\n // Derive workshop name from query path if not provided\n const derivedName =\n workshopName ||\n basename(queryPath)\n .replace(/\\.(ql|qlref)$/, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') ||\n 'codeql-workshop';\n\n const contextSection = buildWorkshopContext(\n queryPath,\n language,\n derivedName,\n numStages\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Basic Prompt - Test-Driven Development Checklist\n server.prompt(\n 'ql_tdd_basic',\n 'Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (language || queryName) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Advanced Prompt - Advanced Techniques with AST/CFG/CallGraph\n server.prompt(\n 'ql_tdd_advanced',\n 'Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop'),\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis')\n },\n async ({ language, queryName, database }) => {\n const template = loadPromptTemplate('ql-tdd-advanced.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (database) {\n contextSection += `- **Database**: ${database}\\n`;\n }\n if (language || queryName || database) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank False Positives Prompt\n server.prompt(\n 'sarif_rank_false_positives',\n 'Analyze SARIF results to identify likely false positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-false-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank True Positives Prompt\n server.prompt(\n 'sarif_rank_true_positives',\n 'Analyze SARIF results to identify likely true positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-true-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Explain CodeQL Query Prompt (for workshop learning content)\n server.prompt(\n 'explain_codeql_query',\n 'Generate detailed explanation of a CodeQL query for workshop learning content - uses MCP tools to gather context and produces both verbal explanations and mermaid evaluation diagrams',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling')\n },\n async ({ queryPath, language, databasePath }) => {\n const template = loadPromptTemplate('explain-codeql-query.prompt.md');\n\n let contextSection = '## Query to Explain\\n\\n';\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n contextSection += `- **Language**: ${language}\\n`;\n if (databasePath) {\n contextSection += `- **Database Path**: ${databasePath}\\n`;\n }\n contextSection += '\\n';\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Document CodeQL Query Prompt\n server.prompt(\n 'document_codeql_query',\n 'Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query')\n },\n async ({ queryPath, language }) => {\n const template = loadPromptTemplate('document-codeql-query.prompt.md');\n\n const contextSection = `## Query to Document\n\n- **Query Path**: ${queryPath}\n- **Language**: ${language}\n\n`;\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n logger.info('Registered 9 workflow prompts');\n}\n\n/**\n * Build context section for tools query workflow\n */\nexport function buildToolsQueryContext(\n language: string,\n database: string,\n sourceFiles?: string,\n sourceFunction?: string,\n targetFunction?: string\n): string {\n const lines = [\n '## Your Context',\n '',\n `- **Language**: ${language}`,\n `- **Database**: ${database}`\n ];\n\n if (sourceFiles) {\n lines.push(`- **Source Files**: ${sourceFiles}`);\n }\n if (sourceFunction) {\n lines.push(`- **Source Function**: ${sourceFunction}`);\n }\n if (targetFunction) {\n lines.push(`- **Target Function**: ${targetFunction}`);\n }\n\n lines.push('', '## Recommended Next Steps', '');\n\n if (sourceFiles) {\n lines.push(\n `1. Run \\`codeql_query_run\\` with queryName=\"PrintAST\", sourceFiles=\"${sourceFiles}\"`\n );\n } else {\n lines.push('1. Identify source files to analyze with PrintAST');\n }\n\n if (sourceFunction) {\n lines.push(\n `2. Run \\`codeql_query_run\\` with queryName=\"PrintCFG\" or \"CallGraphFrom\", sourceFunction=\"${sourceFunction}\"`\n );\n } else {\n lines.push(\n '2. Identify key functions for CFG or call graph analysis'\n );\n }\n\n if (targetFunction) {\n lines.push(\n `3. Run \\`codeql_query_run\\` with queryName=\"CallGraphTo\", targetFunction=\"${targetFunction}\"`\n );\n } else {\n lines.push('3. Identify target functions to find callers');\n }\n\n lines.push('', '');\n return lines.join('\\n');\n}\n\n/**\n * Build context section for workshop creation workflow\n */\nexport function buildWorkshopContext(\n queryPath: string,\n language: string,\n workshopName: string,\n numStages?: number\n): string {\n return `## Your Workshop Context\n\n- **Target Query**: ${queryPath}\n- **Language**: ${language}\n- **Workshop Name**: ${workshopName}\n- **Suggested Stages**: ${numStages || '4-8 (auto-detect based on query complexity)'}\n\n## Immediate Actions\n\n1. **Locate query files**: Use \\`find_codeql_query_files\\` with queryPath=\"${queryPath}\"\n2. **Understand query for learning content**: Use the \\`explain_codeql_query\\` prompt with queryPath=\"${queryPath}\" and language=\"${language}\"\n3. **Document each workshop stage**: Use the \\`document_codeql_query\\` prompt to create/update documentation for each solution query\n4. **Verify tests pass**: Use \\`codeql_test_run\\` on existing tests\n5. **Run tools queries**: Generate AST/CFG understanding for workshop materials\n\n`;\n}\n", "/**\n * Utility functions for loading prompt template files\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Load a prompt template from a .prompt.md file\n */\nexport function loadPromptTemplate(promptFileName: string): string {\n try {\n const promptPath = join(__dirname, promptFileName);\n return readFileSync(promptPath, 'utf-8');\n } catch (error) {\n return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n}\n\n/**\n * Process prompt template by replacing placeholders with actual values\n */\nexport function processPromptTemplate(template: string, variables: Record): string {\n let processed = template;\n \n // Replace variables in the format {{variable}} or {variable}\n for (const [key, value] of Object.entries(variables)) {\n const patterns = [\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'),\n new RegExp(`\\\\{${key}\\\\}`, 'g')\n ];\n \n for (const pattern of patterns) {\n processed = processed.replace(pattern, value);\n }\n }\n \n return processed;\n}", "/**\n * Monitoring Tools - MCP tool implementations for session management and reporting\n * Provides the MCP Tool APIs specified in the monitoring specification\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport { sessionDataManager } from '../lib/session-data-manager';\nimport {\n QueryDevelopmentSession,\n SessionFilter,\n QualityScoreRecord,\n ComparisonReport,\n AggregateReport,\n ExportResult,\n FunctionalTestResult,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all monitoring and reporting tools with the MCP server\n * Note: These tools are opt-in and disabled by default for end-users.\n * Set enableMonitoringTools: true in monitoring config to enable them.\n */\nexport function registerMonitoringTools(server: McpServer): void {\n const config = sessionDataManager.getConfig();\n \n // Check if monitoring tools are enabled (opt-in, disabled by default)\n if (!config.enableMonitoringTools) {\n logger.info('Monitoring tools are disabled (opt-in). Set enableMonitoringTools: true to enable session_* tools.');\n return;\n }\n\n // Session Management Tools - session_start removed per feedback (auto-creation instead)\n registerSessionEndTool(server);\n registerSessionGetTool(server);\n registerSessionListTool(server);\n registerSessionUpdateStateTool(server);\n\n // Session Analytics Tools\n registerSessionGetCallHistoryTool(server);\n registerSessionGetTestHistoryTool(server);\n registerSessionGetScoreHistoryTool(server);\n registerSessionCalculateCurrentScoreTool(server);\n\n // Batch Operations Tools\n registerSessionsCompareTool(server);\n registerSessionsAggregateTool(server);\n registerSessionsExportTool(server);\n\n // Note: Functional Testing Support Tools are internal only, not exposed as MCP tools\n\n logger.info('Registered monitoring and reporting tools');\n}\n\n/**\n * Session Management Tools\n */\n\n// session_start tool removed - sessions are now auto-created when needed\n// Sessions are automatically created when MCP tools are called with queryPath\n// If explicit session creation is needed, provide sessionId=null and it will auto-create\n\nfunction registerSessionEndTool(server: McpServer): void {\n server.tool(\n 'session_end',\n 'End a query development session with final status',\n {\n sessionId: z.string().describe('ID of the session to end'),\n status: z.enum(['completed', 'failed', 'abandoned']).describe('Final status of the session'),\n },\n async ({ sessionId, status }) => {\n try {\n const session = await sessionDataManager.endSession(sessionId, status);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error ending session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error ending session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTool(server: McpServer): void {\n server.tool(\n 'session_get',\n 'Get complete details of a specific query development session',\n {\n sessionId: z.string().describe('ID of the session to retrieve'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionListTool(server: McpServer): void {\n server.tool(\n 'session_list',\n 'List query development sessions with optional filtering',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const sessionList = {\n totalSessions: sessions.length,\n sessions: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n language: s.language,\n status: s.status,\n startTime: s.startTime,\n endTime: s.endTime,\n mcpCallsCount: s.mcpCalls.length,\n testExecutionsCount: s.testExecutions.length,\n currentScore: s.qualityScores.length > 0 \n ? s.qualityScores[s.qualityScores.length - 1].overallScore \n : null,\n })),\n };\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(sessionList, null, 2),\n },\n ],\n recommendations: generateListRecommendations(sessions),\n };\n } catch (error) {\n logger.error('Error listing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error listing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionUpdateStateTool(server: McpServer): void {\n server.tool(\n 'session_update_state',\n 'Update the current state of a query development session',\n {\n sessionId: z.string().describe('ID of the session to update'),\n filesPresent: z.array(z.string()).optional().describe('List of files present in the query development'),\n compilationStatus: z.enum(['unknown', 'success', 'failed']).optional().describe('Current compilation status'),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']).optional().describe('Current test status'),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']).optional().describe('Documentation status'),\n },\n async ({ sessionId, filesPresent, compilationStatus, testStatus, documentationStatus }) => {\n try {\n const stateUpdate: Record = {};\n if (filesPresent !== undefined) stateUpdate.filesPresent = filesPresent;\n if (compilationStatus !== undefined) stateUpdate.compilationStatus = compilationStatus;\n if (testStatus !== undefined) stateUpdate.testStatus = testStatus;\n if (documentationStatus !== undefined) stateUpdate.documentationStatus = documentationStatus;\n\n const session = await sessionDataManager.updateSessionState(sessionId, stateUpdate);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n recommendations: generateRecommendations(session, 'session_update_state'),\n };\n } catch (error) {\n logger.error('Error updating session state:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error updating session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Session Analytics Tools\n */\n\nfunction registerSessionGetCallHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_call_history',\n 'Get MCP call history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of calls to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let calls = [...session.mcpCalls].reverse(); // Most recent first\n if (limit && limit > 0) {\n calls = calls.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalCalls: session.mcpCalls.length,\n callHistory: calls,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting call history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting call history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTestHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_test_history',\n 'Get test execution history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of test executions to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let tests = [...session.testExecutions].reverse(); // Most recent first\n if (limit && limit > 0) {\n tests = tests.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalTests: session.testExecutions.length,\n testHistory: tests,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting test history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting test history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetScoreHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_score_history',\n 'Get quality score history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of scores to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let scores = [...session.qualityScores].reverse(); // Most recent first\n if (limit && limit > 0) {\n scores = scores.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalScores: session.qualityScores.length,\n scoreHistory: scores,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting score history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting score history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionCalculateCurrentScoreTool(server: McpServer): void {\n server.tool(\n 'session_calculate_current_score',\n 'Calculate current quality score for a session based on its state',\n {\n sessionId: z.string().describe('ID of the session'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n // Calculate quality score based on current state\n const scoreRecord = calculateQualityScore(session);\n \n // Add the score to the session\n await sessionDataManager.addQualityScore(sessionId, scoreRecord);\n \n // Get updated session with new score\n const updatedSession = await sessionDataManager.getSession(sessionId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(scoreRecord, null, 2),\n },\n ],\n recommendations: generateRecommendations(updatedSession, 'session_calculate_current_score'),\n };\n } catch (error) {\n logger.error('Error calculating current score:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error calculating current score: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Batch Operations Tools\n */\n\nfunction registerSessionsCompareTool(server: McpServer): void {\n server.tool(\n 'sessions_compare',\n 'Compare multiple query development sessions across specified dimensions',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to compare'),\n dimensions: z.array(z.string()).optional().describe('Specific dimensions to compare (default: all)'),\n },\n async ({ sessionIds, dimensions }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for comparison',\n },\n ],\n isError: true,\n };\n }\n\n const comparison = await compareSessions(validSessions, dimensions);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(comparison, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error comparing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error comparing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsAggregateTool(server: McpServer): void {\n server.tool(\n 'sessions_aggregate',\n 'Generate aggregate insights from multiple sessions based on filters',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const aggregate = await aggregateSessions(sessions, filters);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(aggregate, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error aggregating sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error aggregating sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsExportTool(server: McpServer): void {\n server.tool(\n 'sessions_export',\n 'Export session data in specified format for external analysis',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to export'),\n format: z.enum(['json', 'html', 'markdown']).optional().default('json').describe('Export format'),\n },\n async ({ sessionIds, format = 'json' }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for export',\n },\n ],\n isError: true,\n };\n }\n\n const exportResult = await exportSessions(validSessions, format);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(exportResult, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error exporting sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error exporting sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Helper Functions\n */\n\n/**\n * Calculate quality score for a session based on current state and history\n */\nfunction calculateQualityScore(session: QueryDevelopmentSession): QualityScoreRecord {\n const timestamp = new Date().toISOString();\n \n // Calculate syntactic correctness (25%)\n const syntacticCorrectness = session.currentState.compilationStatus === 'success' ? 100 :\n session.currentState.compilationStatus === 'failed' ? 0 : 50;\n\n // Calculate test coverage and results (30%)\n const testCoverageResults = session.currentState.testStatus === 'passing' ? 100 :\n session.currentState.testStatus === 'failing' ? 25 :\n session.currentState.testStatus === 'no_tests' ? 0 : 50;\n\n // Calculate documentation quality (20%)\n const documentationQuality = session.currentState.documentationStatus === 'present' ? 100 :\n session.currentState.documentationStatus === 'incomplete' ? 60 :\n session.currentState.documentationStatus === 'missing' ? 0 : 50;\n\n // Calculate functional correctness (25%) - based on successful test runs\n const successfulTests = session.testExecutions.filter(t => t.success && t.type === 'test_run').length;\n const totalTests = session.testExecutions.filter(t => t.type === 'test_run').length;\n const functionalCorrectness = totalTests > 0 ? (successfulTests / totalTests) * 100 : 50;\n\n // Calculate overall score\n const overallScore = Math.round(\n (syntacticCorrectness * 0.25) +\n (testCoverageResults * 0.30) +\n (documentationQuality * 0.20) +\n (functionalCorrectness * 0.25)\n );\n\n // Determine grade\n const grade = overallScore >= 90 ? 'A' :\n overallScore >= 80 ? 'B' :\n overallScore >= 70 ? 'C' :\n overallScore >= 60 ? 'D' : 'F';\n\n // Generate recommendations\n const recommendations: string[] = [];\n if (syntacticCorrectness < 100) {\n recommendations.push('Fix compilation errors to improve syntactic correctness');\n }\n if (testCoverageResults < 70) {\n recommendations.push('Add comprehensive tests and ensure they pass');\n }\n if (documentationQuality < 80) {\n recommendations.push('Add or improve query documentation with examples');\n }\n if (functionalCorrectness < 80) {\n recommendations.push('Improve test pass rate and verify query logic');\n }\n\n return {\n scoreId: randomUUID(),\n timestamp,\n overallScore,\n dimensions: {\n syntacticCorrectness,\n testCoverageResults,\n documentationQuality,\n functionalCorrectness,\n },\n grade,\n recommendations,\n };\n}\n\n/**\n * Compare multiple sessions\n */\nasync function compareSessions(\n sessions: QueryDevelopmentSession[],\n dimensions?: string[]\n): Promise {\n const timestamp = new Date().toISOString();\n const sessionIds = sessions.map(s => s.sessionId);\n \n const results: Record = {\n sessionCount: sessions.length,\n sessionOverview: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n status: s.status,\n mcpCallsCount: s.mcpCalls.length,\n duration: s.endTime ? \n new Date(s.endTime).getTime() - new Date(s.startTime).getTime() : \n new Date().getTime() - new Date(s.startTime).getTime(),\n currentScore: s.qualityScores.length > 0 ? \n s.qualityScores[s.qualityScores.length - 1].overallScore : null,\n })),\n };\n\n if (!dimensions || dimensions.includes('quality')) {\n const qualityScores = sessions.map(s => \n s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1] : null\n );\n results.qualityComparison = {\n averageScore: qualityScores\n .filter(q => q !== null)\n .reduce((sum, q) => sum + q!.overallScore, 0) / qualityScores.filter(q => q !== null).length,\n scoreRange: {\n min: Math.min(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n max: Math.max(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n },\n };\n }\n\n if (!dimensions || dimensions.includes('activity')) {\n results.activityComparison = {\n totalMCPCalls: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0),\n averageCallsPerSession: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length,\n mostActiveTool: getMostUsedTool(sessions),\n };\n }\n\n return {\n sessionIds,\n dimensions: dimensions || ['all'],\n timestamp,\n results,\n };\n}\n\n/**\n * Aggregate insights from multiple sessions\n */\nasync function aggregateSessions(\n sessions: QueryDevelopmentSession[],\n filters: SessionFilter\n): Promise {\n const timestamp = new Date().toISOString();\n \n const completedSessions = sessions.filter(s => s.status === 'completed');\n const successRate = sessions.length > 0 ? completedSessions.length / sessions.length : 0;\n \n const qualityScores = sessions\n .map(s => s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1].overallScore : null)\n .filter(score => score !== null) as number[];\n \n const averageQualityScore = qualityScores.length > 0 ? \n qualityScores.reduce((sum, score) => sum + score, 0) / qualityScores.length : 0;\n\n const commonPatterns = identifyCommonPatterns(sessions);\n const recommendations = generateAggregateRecommendations(sessions);\n\n return {\n filters,\n timestamp,\n totalSessions: sessions.length,\n successRate,\n averageQualityScore,\n commonPatterns,\n recommendations,\n };\n}\n\n/**\n * Export sessions in specified format\n */\nasync function exportSessions(\n sessions: QueryDevelopmentSession[],\n format: 'json' | 'html' | 'markdown'\n): Promise {\n const timestamp = new Date().toISOString();\n const filename = `session-export-${timestamp.replace(/[:.]/g, '-')}.${format}`;\n \n let content: string;\n \n switch (format) {\n case 'json':\n content = JSON.stringify(sessions, null, 2);\n break;\n case 'html':\n content = generateHTMLReport(sessions);\n break;\n case 'markdown':\n content = generateMarkdownReport(sessions);\n break;\n }\n\n return {\n format,\n filename,\n content,\n timestamp,\n };\n}\n\n/**\n * Utility functions\n */\n\nfunction getMostUsedTool(sessions: QueryDevelopmentSession[]): string {\n const toolCounts: Record = {};\n \n sessions.forEach(session => {\n session.mcpCalls.forEach(call => {\n toolCounts[call.toolName] = (toolCounts[call.toolName] || 0) + 1;\n });\n });\n\n return Object.entries(toolCounts)\n .sort(([, a], [, b]) => b - a)[0]?.[0] || 'none';\n}\n\nfunction identifyCommonPatterns(sessions: QueryDevelopmentSession[]): string[] {\n const patterns: string[] = [];\n \n const commonTools = getMostUsedTool(sessions);\n if (commonTools && commonTools !== 'none') {\n patterns.push(`Most commonly used tool: ${commonTools}`);\n }\n\n const completionRate = sessions.filter(s => s.status === 'completed').length / sessions.length;\n if (completionRate > 0.8) {\n patterns.push('High completion rate indicates effective workflow');\n } else if (completionRate < 0.5) {\n patterns.push('Low completion rate suggests workflow issues');\n }\n\n return patterns;\n}\n\nfunction generateAggregateRecommendations(sessions: QueryDevelopmentSession[]): string[] {\n const recommendations: string[] = [];\n \n const failedSessions = sessions.filter(s => s.status === 'failed');\n if (failedSessions.length > sessions.length * 0.3) {\n recommendations.push('High failure rate - consider improving error handling and guidance');\n }\n\n const averageCallsPerSession = sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length;\n if (averageCallsPerSession > 20) {\n recommendations.push('High number of MCP calls per session - consider workflow optimization');\n }\n\n return recommendations;\n}\n\nfunction generateHTMLReport(sessions: QueryDevelopmentSession[]): string {\n const html = `\n\n\n\n Session Export Report\n \n\n\n

Query Development Sessions Report

\n

Generated: ${new Date().toISOString()}

\n

Total Sessions: ${sessions.length}

\n \n ${sessions.map(session => `\n
\n

Session: ${session.sessionId}

\n

Query Path: ${session.queryPath}

\n

Status: ${session.status}

\n

Language: ${session.language}

\n

Start Time: ${session.startTime}

\n

MCP Calls: ${session.mcpCalls.length}

\n

Test Executions: ${session.testExecutions.length}

\n

Quality Scores: ${session.qualityScores.length}

\n
\n `).join('')}\n\n`;\n \n return html;\n}\n\nfunction generateMarkdownReport(sessions: QueryDevelopmentSession[]): string {\n const md = `# Query Development Sessions Report\n\nGenerated: ${new Date().toISOString()}\nTotal Sessions: ${sessions.length}\n\n## Session Summary\n\n| Session ID | Query Path | Status | Language | MCP Calls | Test Executions |\n|------------|-----------|--------|----------|-----------|-----------------|\n${sessions.map(session => \n `| ${session.sessionId} | ${session.queryPath} | ${session.status} | ${session.language} | ${session.mcpCalls.length} | ${session.testExecutions.length} |`\n).join('\\n')}\n\n## Detailed Sessions\n\n${sessions.map(session => `\n### Session: ${session.sessionId}\n\n- **Query Path:** ${session.queryPath}\n- **Status:** ${session.status}\n- **Language:** ${session.language}\n- **Start Time:** ${session.startTime}\n- **End Time:** ${session.endTime || 'N/A'}\n- **MCP Calls:** ${session.mcpCalls.length}\n- **Test Executions:** ${session.testExecutions.length}\n- **Quality Scores:** ${session.qualityScores.length}\n\n${session.recommendations.length > 0 ? `\n**Current Recommendations:**\n${session.recommendations.map(rec => `- ${rec}`).join('\\n')}\n` : ''}\n`).join('\\n')}`;\n\n return md;\n}\n\nfunction _calculateAverageDuration(sessions: QueryDevelopmentSession[]): number {\n const completedSessions = sessions.filter(s => s.endTime);\n if (completedSessions.length === 0) return 0;\n\n const totalDuration = completedSessions.reduce((sum, session) => {\n return sum + (new Date(session.endTime!).getTime() - new Date(session.startTime).getTime());\n }, 0);\n\n return totalDuration / completedSessions.length;\n}\n\nfunction _identifyFailureReasons(results: FunctionalTestResult[]): string[] {\n const failedResults = results.filter(r => !r.passed);\n const reasons: Record = {};\n\n failedResults.forEach(result => {\n Object.entries(result.criteria).forEach(([criterion, passed]) => {\n if (!passed) {\n reasons[criterion] = (reasons[criterion] || 0) + 1;\n }\n });\n });\n\n return Object.entries(reasons)\n .sort(([, a], [, b]) => b - a)\n .map(([reason, count]) => `${reason}: ${count} sessions`);\n}\n\n/**\n * Generate recommendations for MCP tool responses\n * Returns a map of MCP primitive paths to recommendation reasons\n */\nfunction generateRecommendations(\n session: QueryDevelopmentSession | null,\n currentTool: string\n): Record {\n if (!session) {\n return {};\n }\n\n const recommendations: Record = {};\n\n // Session state-based recommendations\n if (session.currentState.compilationStatus === 'failed') {\n recommendations['codeql_query_format'] = 'Format query to fix potential syntax issues';\n recommendations['codeql_query_compile'] = 'Recompile after fixing syntax errors';\n } else if (session.currentState.compilationStatus === 'success') {\n if (session.currentState.testStatus === 'unknown' || session.currentState.testStatus === 'no_tests') {\n recommendations['codeql_test_run'] = 'Run tests to validate query functionality';\n } else if (session.currentState.testStatus === 'failing') {\n recommendations['session_get_test_history'] = 'Review test failures to identify issues';\n recommendations['codeql_query_compile'] = 'Verify query logic matches test expectations';\n } else if (session.currentState.testStatus === 'passing') {\n recommendations['session_calculate_current_score'] = 'Calculate quality score for completed query';\n }\n }\n\n // Tool-specific follow-up recommendations\n switch (currentTool) {\n case 'session_get':\n if (session.mcpCalls.length === 0) {\n recommendations['codeql_query_compile'] = 'Start development by compiling the query';\n }\n break;\n case 'session_end':\n if (session.status === 'completed') {\n recommendations['sessions_export'] = 'Export session data for analysis';\n }\n break;\n case 'session_calculate_current_score': {\n const latestScore = session.qualityScores[session.qualityScores.length - 1];\n if (latestScore && latestScore.overallScore < 80) {\n if (latestScore.dimensions.syntacticCorrectness < 100) {\n recommendations['codeql_query_format'] = 'Improve syntax and formatting';\n }\n if (latestScore.dimensions.testCoverageResults < 70) {\n recommendations['codeql_test_run'] = 'Improve test coverage and results';\n }\n }\n break;\n }\n case 'session_update_state':\n // Recommend next logical step based on updated state\n if (session.currentState.compilationStatus === 'success' && session.currentState.testStatus === 'unknown') {\n recommendations['codeql_test_run'] = 'Run tests now that compilation is successful';\n }\n break;\n }\n\n return recommendations;\n}\n\n/**\n * Generate recommendations for session list results\n */\nfunction generateListRecommendations(sessions: QueryDevelopmentSession[]): Record {\n const recommendations: Record = {};\n\n const activeSessions = sessions.filter(s => s.status === 'active');\n const completedSessions = sessions.filter(s => s.status === 'completed');\n\n if (activeSessions.length > 0) {\n recommendations['session_get'] = `Review details of ${activeSessions.length} active session(s)`;\n }\n\n if (completedSessions.length > 1) {\n recommendations['sessions_compare'] = 'Compare completed sessions to identify patterns';\n recommendations['sessions_aggregate'] = 'Generate aggregate insights from multiple sessions';\n }\n\n if (sessions.length > 5) {\n recommendations['sessions_export'] = 'Export session data for comprehensive analysis';\n }\n\n return recommendations;\n}", "function checkArgs(adapter, defaultData) {\n if (adapter === undefined)\n throw new Error('lowdb: missing adapter');\n if (defaultData === undefined)\n throw new Error('lowdb: missing default data');\n}\nexport class Low {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n async read() {\n const data = await this.adapter.read();\n if (data)\n this.data = data;\n }\n async write() {\n if (this.data)\n await this.adapter.write(this.data);\n }\n async update(fn) {\n fn(this.data);\n await this.write();\n }\n}\nexport class LowSync {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n read() {\n const data = this.adapter.read();\n if (data)\n this.data = data;\n }\n write() {\n if (this.data)\n this.adapter.write(this.data);\n }\n update(fn) {\n fn(this.data);\n this.write();\n }\n}\n", "import { readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Writer } from 'steno';\nexport class TextFile {\n #filename;\n #writer;\n constructor(filename) {\n this.#filename = filename;\n this.#writer = new Writer(filename);\n }\n async read() {\n let data;\n try {\n data = await readFile(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n return this.#writer.write(str);\n }\n}\nexport class TextFileSync {\n #tempFilename;\n #filename;\n constructor(filename) {\n this.#filename = filename;\n const f = filename.toString();\n this.#tempFilename = path.join(path.dirname(f), `.${path.basename(f)}.tmp`);\n }\n read() {\n let data;\n try {\n data = readFileSync(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n writeFileSync(this.#tempFilename, str);\n renameSync(this.#tempFilename, this.#filename);\n }\n}\n", "import { TextFile, TextFileSync } from './TextFile.js';\nexport class DataFile {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFile(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n async read() {\n const data = await this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n return this.#adapter.write(this.#stringify(obj));\n }\n}\nexport class DataFileSync {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFileSync(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n read() {\n const data = this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n this.#adapter.write(this.#stringify(obj));\n }\n}\n", "import { DataFile, DataFileSync } from './DataFile.js';\nexport class JSONFile extends DataFile {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\nexport class JSONFileSync extends DataFileSync {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\n", "/**\n * Session Data Management\n * Provides unified JSON storage and session lifecycle management using lowdb\n */\n\nimport { Low } from 'lowdb';\nimport { JSONFileSync } from 'lowdb/node';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport { getPackageRootDir } from '../utils/package-paths';\nimport {\n QueryDevelopmentSession,\n QueryState,\n MCPCallRecord,\n TestExecutionRecord,\n QualityScoreRecord,\n SessionFilter,\n MonitoringConfig,\n MonitoringConfigSchema,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Database schema for lowdb - sessions only\n */\ninterface SessionDatabase {\n sessions: QueryDevelopmentSession[];\n}\n\n/**\n * Session Data Manager - handles all session persistence and lifecycle\n */\nexport class SessionDataManager {\n private db: Low;\n private config: MonitoringConfig;\n private storageDir: string;\n\n constructor(configOverrides: Partial = {}) {\n this.config = MonitoringConfigSchema.parse({\n ...MonitoringConfigSchema.parse({}),\n ...configOverrides,\n });\n\n this.storageDir = this.config.storageLocation;\n this.ensureStorageDirectory();\n\n const adapter = new JSONFileSync(join(this.storageDir, 'sessions.json'));\n this.db = new Low(adapter, {\n sessions: [],\n });\n\n this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n async initialize(): Promise {\n await this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n private async initializeDatabase(): Promise {\n try {\n await this.db.read();\n \n logger.info(`Session data manager initialized with ${this.db.data.sessions.length} sessions`);\n } catch (error) {\n logger.error('Failed to initialize session database:', error);\n throw error;\n }\n }\n\n /**\n * Ensure storage directory structure exists\n */\n private ensureStorageDirectory(): void {\n try {\n // mkdirSync with recursive: true is a no-op if directories already exist\n mkdirSync(this.storageDir, { recursive: true });\n\n // Create subdirectories\n const subdirs = ['sessions-archive', 'exports'];\n for (const subdir of subdirs) {\n mkdirSync(join(this.storageDir, subdir), { recursive: true });\n }\n\n // Use 'wx' flag (exclusive create) to atomically create config only\n // if it doesn't exist, avoiding TOCTOU race (CWE-367).\n const configPath = join(this.storageDir, 'config.json');\n try {\n writeFileSync(configPath, JSON.stringify(this.config, null, 2), { flag: 'wx' });\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n\n logger.debug(`Storage directory initialized: ${this.storageDir}`);\n } catch (error) {\n logger.error('Failed to create storage directory:', error);\n throw error;\n }\n }\n\n /**\n * Start a new query development session\n */\n async startSession(\n queryPath: string,\n language?: string,\n queryType?: string,\n description?: string\n ): Promise {\n const sessionId = randomUUID();\n const startTime = new Date().toISOString();\n\n const session: QueryDevelopmentSession = {\n sessionId,\n queryPath,\n language: language || 'unknown',\n queryType,\n description,\n startTime,\n status: 'active',\n mcpCalls: [],\n testExecutions: [],\n qualityScores: [],\n currentState: {\n filesPresent: [],\n compilationStatus: 'unknown',\n testStatus: 'unknown',\n documentationStatus: 'unknown',\n lastActivity: startTime,\n },\n recommendations: [],\n };\n\n await this.db.read();\n this.db.data.sessions.push(session);\n await this.db.write();\n\n logger.info(`Started new session: ${sessionId} for query: ${queryPath}`);\n return sessionId;\n }\n\n /**\n * End a session with final status\n */\n async endSession(\n sessionId: string,\n status: 'completed' | 'failed' | 'abandoned'\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.status = status;\n session.endTime = new Date().toISOString();\n session.currentState.lastActivity = session.endTime;\n\n await this.db.write();\n\n // Archive completed session if enabled\n if (this.config.archiveCompletedSessions && status === 'completed') {\n await this.archiveSession(sessionId);\n }\n\n logger.info(`Ended session: ${sessionId} with status: ${status}`);\n return session;\n }\n\n /**\n * Get a specific session by ID\n */\n async getSession(sessionId: string): Promise {\n await this.db.read();\n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n return session || null;\n }\n\n /**\n * List sessions with optional filtering\n */\n async listSessions(filters?: SessionFilter): Promise {\n await this.db.read();\n let sessions = [...this.db.data.sessions];\n\n if (filters) {\n if (filters.queryPath) {\n sessions = sessions.filter(s => s.queryPath.includes(filters.queryPath!));\n }\n if (filters.status) {\n sessions = sessions.filter(s => s.status === filters.status);\n }\n if (filters.language) {\n sessions = sessions.filter(s => s.language === filters.language);\n }\n if (filters.queryType) {\n sessions = sessions.filter(s => s.queryType === filters.queryType);\n }\n if (filters.dateRange) {\n const [start, end] = filters.dateRange;\n sessions = sessions.filter(s => \n s.startTime >= start && s.startTime <= end\n );\n }\n }\n\n return sessions;\n }\n\n /**\n * Update session state\n */\n async updateSessionState(\n sessionId: string,\n stateUpdate: Partial\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.currentState = {\n ...session.currentState,\n ...stateUpdate,\n lastActivity: new Date().toISOString(),\n };\n\n await this.db.write();\n return session;\n }\n\n /**\n * Add MCP call record to session\n */\n async addMCPCall(sessionId: string, callRecord: MCPCallRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for MCP call: ${sessionId}`);\n return;\n }\n\n session.mcpCalls.push(callRecord);\n session.currentState.lastActivity = callRecord.timestamp;\n\n // Update next suggested tool if provided\n if (callRecord.nextSuggestedTool) {\n session.nextSuggestedTool = callRecord.nextSuggestedTool;\n }\n\n await this.db.write();\n }\n\n /**\n * Add test execution record to session\n */\n async addTestExecution(sessionId: string, testRecord: TestExecutionRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for test execution: ${sessionId}`);\n return;\n }\n\n session.testExecutions.push(testRecord);\n session.currentState.lastActivity = testRecord.timestamp;\n\n // Update compilation/test status based on execution\n if (testRecord.type === 'compilation') {\n session.currentState.compilationStatus = testRecord.success ? 'success' : 'failed';\n } else if (testRecord.type === 'test_run') {\n session.currentState.testStatus = testRecord.success ? 'passing' : 'failing';\n }\n\n await this.db.write();\n }\n\n /**\n * Add quality score record to session\n */\n async addQualityScore(sessionId: string, scoreRecord: QualityScoreRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for quality score: ${sessionId}`);\n return;\n }\n\n session.qualityScores.push(scoreRecord);\n session.currentState.lastActivity = scoreRecord.timestamp;\n session.recommendations = scoreRecord.recommendations;\n\n await this.db.write();\n }\n\n /**\n * Archive a completed session to monthly file\n */\n private async archiveSession(sessionId: string): Promise {\n try {\n const session = await this.getSession(sessionId);\n if (!session) return;\n\n const date = new Date(session.endTime || session.startTime);\n const monthDir = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;\n const archiveDir = join(this.storageDir, 'sessions-archive', monthDir);\n\n mkdirSync(archiveDir, { recursive: true });\n\n const archiveFile = join(archiveDir, `${sessionId}.json`);\n writeFileSync(archiveFile, JSON.stringify(session, null, 2));\n\n // Remove from active sessions\n await this.db.read();\n this.db.data.sessions = this.db.data.sessions.filter(s => s.sessionId !== sessionId);\n await this.db.write();\n\n logger.info(`Archived session: ${sessionId} to ${archiveFile}`);\n } catch (error) {\n logger.error(`Failed to archive session ${sessionId}:`, error);\n }\n }\n\n /**\n * Get active sessions for a specific query path\n */\n async getActiveSessionsForQuery(queryPath: string): Promise {\n await this.db.read();\n return this.db.data.sessions.filter(s => \n s.queryPath === queryPath && s.status === 'active'\n );\n }\n\n /**\n * Clean up old sessions based on retention policy\n */\n async cleanupOldSessions(): Promise {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);\n const cutoffTimestamp = cutoffDate.toISOString();\n\n await this.db.read();\n const sessionsToRemove = this.db.data.sessions.filter(s => \n s.endTime && s.endTime < cutoffTimestamp\n );\n\n if (sessionsToRemove.length > 0) {\n this.db.data.sessions = this.db.data.sessions.filter(s => \n !s.endTime || s.endTime >= cutoffTimestamp\n );\n await this.db.write();\n\n logger.info(`Cleaned up ${sessionsToRemove.length} old sessions`);\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): MonitoringConfig {\n return this.config;\n }\n\n /**\n * Update configuration\n */\n async updateConfig(configUpdate: Partial): Promise {\n this.config = MonitoringConfigSchema.parse({\n ...this.config,\n ...configUpdate,\n });\n\n // Update config.json file only\n const configPath = join(this.storageDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(this.config, null, 2));\n\n logger.info('Updated monitoring configuration');\n }\n}\n\n/**\n * Parse boolean environment variable\n */\nfunction parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolean {\n if (envVar === undefined) return defaultValue;\n return envVar.toLowerCase() === 'true' || envVar === '1';\n}\n\n// Export singleton instance with environment variable support\nexport const sessionDataManager = new SessionDataManager({\n storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getPackageRootDir(), '.ql-mcp-tracking'),\n enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false),\n});", "import { z } from 'zod';\n\n/**\n * Monitoring and Reporting types for CodeQL Development MCP Server\n * Based on the specification in docs/mcp-server-monitoring-and-reporting.md\n */\n\n/**\n * MCP Call Record - captures individual MCP tool calls\n */\nexport const MCPCallRecordSchema = z.object({\n callId: z.string(),\n timestamp: z.string(), // ISO timestamp\n toolName: z.string(),\n parameters: z.record(z.any()),\n result: z.any(),\n success: z.boolean(),\n duration: z.number(), // milliseconds\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type MCPCallRecord = z.infer;\n\n/**\n * Test Execution Record - captures query compilation and test runs\n */\nexport const TestExecutionRecordSchema = z.object({\n executionId: z.string(),\n timestamp: z.string(),\n type: z.enum(['compilation', 'test_run', 'database_build']),\n success: z.boolean(),\n details: z.record(z.any()),\n metrics: z.object({\n passRate: z.number().optional(),\n coverage: z.number().optional(),\n performance: z.number().optional(),\n }).optional(),\n});\n\nexport type TestExecutionRecord = z.infer;\n\n/**\n * Quality Score Record - multi-dimensional quality assessment\n */\nexport const QualityScoreRecordSchema = z.object({\n scoreId: z.string(),\n timestamp: z.string(),\n overallScore: z.number().min(0).max(100), // 0-100\n dimensions: z.object({\n syntacticCorrectness: z.number().min(0).max(100),\n testCoverageResults: z.number().min(0).max(100),\n documentationQuality: z.number().min(0).max(100),\n functionalCorrectness: z.number().min(0).max(100),\n }),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n recommendations: z.array(z.string()),\n});\n\nexport type QualityScoreRecord = z.infer;\n\n/**\n * Query State - current state of the query development\n */\nexport const QueryStateSchema = z.object({\n filesPresent: z.array(z.string()),\n compilationStatus: z.enum(['unknown', 'success', 'failed']),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']),\n lastActivity: z.string(), // ISO timestamp\n});\n\nexport type QueryState = z.infer;\n\n/**\n * Query Development Session - main data structure for tracking\n */\nexport const QueryDevelopmentSessionSchema = z.object({\n // Session Metadata\n sessionId: z.string(),\n queryPath: z.string(),\n language: z.string(),\n queryType: z.string().optional(),\n description: z.string().optional(),\n startTime: z.string(), // ISO timestamp\n endTime: z.string().optional(), // ISO timestamp\n status: z.enum(['active', 'completed', 'failed', 'abandoned']),\n\n // MCP Call History\n mcpCalls: z.array(MCPCallRecordSchema),\n\n // Test Execution Records\n testExecutions: z.array(TestExecutionRecordSchema),\n\n // Quality Metrics\n qualityScores: z.array(QualityScoreRecordSchema),\n\n // Development State\n currentState: QueryStateSchema,\n recommendations: z.array(z.string()),\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type QueryDevelopmentSession = z.infer;\n\n/**\n * Session Filter for listing and searching\n */\nexport const SessionFilterSchema = z.object({\n queryPath: z.string().optional(),\n status: z.string().optional(),\n dateRange: z.tuple([z.string(), z.string()]).optional(),\n language: z.string().optional(),\n queryType: z.string().optional(),\n});\n\nexport type SessionFilter = z.infer;\n\n/**\n * Comparison Report for analyzing multiple sessions\n */\nexport const ComparisonReportSchema = z.object({\n sessionIds: z.array(z.string()),\n dimensions: z.array(z.string()),\n timestamp: z.string(),\n results: z.record(z.any()),\n});\n\nexport type ComparisonReport = z.infer;\n\n/**\n * Aggregate Report for batch analysis\n */\nexport const AggregateReportSchema = z.object({\n filters: SessionFilterSchema,\n timestamp: z.string(),\n totalSessions: z.number(),\n successRate: z.number(),\n averageQualityScore: z.number(),\n commonPatterns: z.array(z.string()),\n recommendations: z.array(z.string()),\n});\n\nexport type AggregateReport = z.infer;\n\n/**\n * Export Result for data export operations\n */\nexport const ExportResultSchema = z.object({\n format: z.enum(['json', 'html', 'markdown']),\n filename: z.string(),\n content: z.string(),\n timestamp: z.string(),\n});\n\nexport type ExportResult = z.infer;\n\n/**\n * Functional Test Result for automated testing\n */\nexport const FunctionalTestResultSchema = z.object({\n sessionId: z.string(),\n queryPath: z.string(),\n passed: z.boolean(),\n criteria: z.record(z.any()),\n details: z.record(z.any()),\n timestamp: z.string(),\n});\n\nexport type FunctionalTestResult = z.infer;\n\n/**\n * Test Report for comprehensive test analysis\n */\nexport const TestReportSchema = z.object({\n sessionIds: z.array(z.string()),\n criteria: z.record(z.any()),\n timestamp: z.string(),\n overallPassRate: z.number(),\n results: z.array(FunctionalTestResultSchema),\n summary: z.record(z.any()),\n});\n\nexport type TestReport = z.infer;\n\n/**\n * Monitoring Configuration\n */\nexport const MonitoringConfigSchema = z.object({\n storageLocation: z.string().default('.ql-mcp-tracking/'),\n autoTrackSessions: z.boolean().default(true),\n retentionDays: z.number().default(90),\n includeCallParameters: z.boolean().default(true),\n includeCallResults: z.boolean().default(true),\n maxActiveSessionsPerQuery: z.number().default(3),\n scoringFrequency: z.enum(['per_call', 'periodic', 'manual']).default('per_call'),\n archiveCompletedSessions: z.boolean().default(true),\n enableRecommendations: z.boolean().default(true),\n enableMonitoringTools: z.boolean().default(false), // Opt-in: session_* tools disabled by default for end-users\n});\n\nexport type MonitoringConfig = z.infer;"], - "mappings": "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", - "names": ["dirname", "existsSync", "readFileSync", "resolve", "pathToFileURL", "z", "dirname", "isAbsolute", "mkdirSync", "existsSync", "join", "resolve", "mkdirSync", "resolve", "existsSync", "mkdirSync", "timestamp", "join", "writeFileSync", "existsSync", "mkdirSync", "basename", "dirname", "isAbsolute", "join", "resolve", "isAbsolute", "resolve", "join", "writeFileSync", "existsSync", "logger", "executeCodeQLCommand", "basename", "mkdirSync", "dirname", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "readFile", "z", "exception", "map", "schema", "type", "extend", "str", "string", "z", "z", "z", "z", "z", "z", "setTimeout", "delimiter", "join", "delimiter", "resolve", "setTimeout", "join", "join", "resolve", "pathToFileURL", "z", "z", "z", "z", "z", "z", "writeFileSync", "readFileSync", "existsSync", "join", "dirname", "basename", "mkdirSync", "z", "z", "z", "z", "z", "z", "join", "resolve", "resolve", "join", "z", "z", "resolve", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "fs", "path", "getLanguageExtension", "z", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "readFileSync", "existsSync", "join", "join", "existsSync", "readFileSync", "z", "basename", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "z", "basename", "z", "randomUUID", "readFileSync", "writeFileSync", "path", "path", "readFileSync", "str", "writeFileSync", "parse", "mkdirSync", "writeFileSync", "join", "z", "join", "mkdirSync", "writeFileSync", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] + "sourcesContent": ["/**\n * Simple logger utility.\n *\n * All log output is written to stderr. In stdio transport mode, stdout is\n * reserved exclusively for the MCP JSON-RPC protocol \u2014 any non-protocol\n * bytes on stdout would corrupt the message stream.\n */\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.error(`[INFO] ${new Date().toISOString()} ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[ERROR] ${new Date().toISOString()} ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n console.error(`[WARN] ${new Date().toISOString()} ${message}`, ...args);\n },\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.error(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args);\n }\n },\n};\n", "/**\n * Generic CLI command execution utilities for CodeQL and QLT commands\n */\n\nimport { execFile } from 'child_process';\nimport { existsSync } from 'fs';\nimport { basename, delimiter, dirname, isAbsolute } from 'path';\nimport { promisify } from 'util';\nimport { logger } from '../utils/logger';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CLIExecutionResult {\n stdout: string;\n stderr: string;\n success: boolean;\n error?: string;\n exitCode?: number;\n}\n\nexport interface CLIExecutionOptions {\n command: string;\n args: string[];\n cwd?: string;\n timeout?: number;\n env?: Record;\n}\n\n// Whitelist of allowed commands to prevent arbitrary command execution\nconst ALLOWED_COMMANDS = new Set([\n 'codeql',\n 'git',\n 'node',\n 'npm',\n 'qlt',\n 'which'\n]);\n\n// Additional commands allowed in test environments\nlet testCommands: Set | null = null;\n\n// Whitelist of safe environment variables to pass to child processes\n// This prevents potentially malicious environment variables from being passed through\nconst SAFE_ENV_VARS = [\n 'HOME', // User home directory\n 'LANG', // Locale setting\n 'LC_ALL', // Locale setting\n 'LC_CTYPE', // Locale setting\n 'PATH', // Required to find executables\n 'SHELL', // User's shell (Unix)\n 'TEMP', // Temporary directory (Windows)\n 'TERM', // Terminal type (Unix)\n 'TMP', // Temporary directory (Windows)\n 'TMPDIR', // Temporary directory (Unix)\n 'USER', // Current user (Unix)\n 'USERNAME', // Current user (Windows)\n] as const;\n\n// Whitelist of safe environment variable prefixes\n// These are needed for CodeQL and Node.js functionality\nconst SAFE_ENV_PREFIXES = [\n 'CODEQL_', // CodeQL-specific variables\n 'NODE_', // Node.js-specific variables (for npm, etc.)\n] as const;\n\n// Pattern for dangerous control characters in CLI arguments\n// Rejected characters:\n// \\x01-\\x08: SOH through BS (start of heading, text, null control chars, backspace)\n// \\x0B: Vertical tab - rarely used legitimately, can cause display issues\n// \\x0C: Form feed - can cause unexpected page breaks in output\n// \\x0E-\\x1F: SO through US (shift out/in, device controls, separators)\n// Allowed characters:\n// \\x00: Null byte - handled separately for clearer error messaging\n// \\x09: Horizontal tab - commonly used in file paths and arguments\n// \\x0A: Newline (LF) - may appear in multi-line arguments\n// \\x0D: Carriage return (CR) - may appear with newlines on Windows\n// eslint-disable-next-line no-control-regex\nconst DANGEROUS_CONTROL_CHARS = /[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Enable test-specific commands for testing purposes\n * This should only be called in test environments\n */\nexport function enableTestCommands(): void {\n testCommands = new Set([\n 'cat',\n 'echo',\n 'ls',\n 'sh',\n 'sleep'\n ]);\n}\n\n/**\n * Disable test-specific commands\n */\nexport function disableTestCommands(): void {\n testCommands = null;\n}\n\n/**\n * Check if a command is allowed\n */\nfunction isCommandAllowed(command: string): boolean {\n return ALLOWED_COMMANDS.has(command) || (testCommands !== null && testCommands.has(command));\n}\n\n// Resolved CodeQL binary directory from CODEQL_PATH.\n// When set, this directory is prepended to PATH for all child processes\n// so that `execFile('codeql', ...)` finds the correct binary via execvp().\n// Using PATH lookup (rather than an absolute path) is essential because\n// execvp() handles shell-script shebangs correctly, whereas passing an\n// absolute path to execFile() can fail with ENOENT for shell scripts.\nlet resolvedCodeQLDir: string | null = null;\n\n// Cached result from resolveCodeQLBinary(). `undefined` means not yet resolved.\nlet resolvedBinaryResult: string | undefined;\n\n/**\n * Resolve the CodeQL CLI binary path.\n *\n * Resolution order:\n * 1. `CODEQL_PATH` environment variable \u2014 must point to an existing file whose\n * basename is `codeql` (or `codeql.exe` / `codeql.cmd` on Windows).\n * The parent directory is prepended to PATH for child processes.\n * 2. Falls back to the bare `codeql` command (resolved via PATH at exec time).\n *\n * The resolved value is cached for the lifetime of the process. Call this once\n * at startup; subsequent calls are a no-op and return the cached value.\n */\nexport function resolveCodeQLBinary(): string {\n // Short-circuit if already resolved\n if (resolvedBinaryResult !== undefined) {\n return resolvedBinaryResult;\n }\n\n const envPath = process.env.CODEQL_PATH;\n\n if (!envPath) {\n resolvedCodeQLDir = null;\n resolvedBinaryResult = 'codeql';\n return resolvedBinaryResult;\n }\n\n // Validate the path points to a plausible CodeQL binary\n const base = basename(envPath).toLowerCase();\n const validBaseNames = ['codeql', 'codeql.exe', 'codeql.cmd'];\n if (!validBaseNames.includes(base)) {\n throw new Error(\n `CODEQL_PATH must point to a CodeQL CLI binary (expected basename: codeql), got: ${base}`\n );\n }\n\n // Require an absolute path to avoid ambiguity\n if (!isAbsolute(envPath)) {\n throw new Error(\n `CODEQL_PATH must be an absolute path, got: ${envPath}`\n );\n }\n\n // Verify the file exists\n if (!existsSync(envPath)) {\n throw new Error(\n `CODEQL_PATH points to a file that does not exist: ${envPath}`\n );\n }\n\n resolvedCodeQLDir = dirname(envPath);\n resolvedBinaryResult = envPath;\n logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`);\n return resolvedBinaryResult;\n}\n\n/**\n * Get the currently resolved CodeQL binary directory, or null if using PATH.\n */\nexport function getResolvedCodeQLDir(): string | null {\n return resolvedCodeQLDir;\n}\n\n/**\n * Reset the resolved CodeQL binary to the default (for testing only).\n */\nexport function resetResolvedCodeQLBinary(): void {\n resolvedCodeQLDir = null;\n resolvedBinaryResult = undefined;\n}\n\n/**\n * Validate that the resolved CodeQL binary is actually callable.\n *\n * Runs `codeql version --format=terse` and verifies the process exits\n * successfully. This catches the case where `CODEQL_PATH` is unset and\n * `codeql` is not on PATH \u2014 the server would otherwise start normally\n * but every tool invocation would fail.\n *\n * @returns The version string reported by the CodeQL CLI.\n * @throws Error if the binary is not reachable or returns a non-zero exit code.\n */\nexport async function validateCodeQLBinaryReachable(): Promise {\n const binary = resolvedBinaryResult ?? 'codeql';\n const env = { ...process.env };\n if (resolvedCodeQLDir) {\n env.PATH = resolvedCodeQLDir + delimiter + (env.PATH || '');\n }\n\n try {\n const { stdout } = await execFileAsync(binary, ['version', '--format=terse'], {\n env,\n timeout: 15_000,\n });\n return stdout.trim();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `CodeQL CLI is not reachable (binary: ${binary}). ` +\n `Ensure codeql is on PATH or set the CODEQL_PATH environment variable ` +\n `to the absolute path of the CodeQL CLI binary. Details: ${message}`\n );\n }\n}\n\n/**\n * Sanitize a CLI argument to prevent potential issues with special characters.\n * \n * While execFile() does not spawn a shell (preventing shell injection), we still\n * validate arguments to:\n * 1. Reject null bytes that could truncate strings in C-based commands\n * 2. Reject control characters that could cause unexpected behavior\n * 3. Provide defense-in-depth against potential issues\n * \n * @param arg - The argument to sanitize\n * @returns The sanitized argument\n * @throws Error if the argument contains dangerous characters\n */\nexport function sanitizeCLIArgument(arg: string): string {\n // Reject null bytes - these can truncate strings in C-based commands\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n if (arg.includes('\\0')) {\n throw new Error(`CLI argument contains null byte: argument rejected for security`);\n }\n \n // Reject control characters using the module-level constant pattern\n if (DANGEROUS_CONTROL_CHARS.test(arg)) {\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n throw new Error(`CLI argument contains control characters: argument rejected for security`);\n }\n \n return arg;\n}\n\n/**\n * Sanitize an array of CLI arguments\n * @param args - The arguments to sanitize\n * @returns The sanitized arguments\n * @throws Error if any argument contains dangerous characters\n */\nexport function sanitizeCLIArguments(args: string[]): string[] {\n return args.map(sanitizeCLIArgument);\n}\n\n/**\n * Filter environment variables to only include safe ones\n * This prevents potentially malicious environment variables from being passed to child processes\n */\nfunction getSafeEnvironment(additionalEnv?: Record): Record {\n const safeEnv: Record = {};\n \n // Copy whitelisted environment variables from process.env\n for (const key of SAFE_ENV_VARS) {\n if (process.env[key] !== undefined) {\n safeEnv[key] = process.env[key]!;\n }\n }\n \n // Copy environment variables with whitelisted prefixes\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && SAFE_ENV_PREFIXES.some(prefix => key.startsWith(prefix))) {\n safeEnv[key] = value;\n }\n }\n \n // When CODEQL_PATH was set, prepend the resolved directory to PATH so that\n // `execFile('codeql', ...)` finds the user-specified binary via execvp().\n // This approach (PATH manipulation + bare command name) is essential because\n // execvp() handles shell-script shebangs correctly, whereas passing an\n // absolute path to execFile() fails with ENOENT for shell-script launchers.\n if (resolvedCodeQLDir && safeEnv.PATH) {\n safeEnv.PATH = `${resolvedCodeQLDir}${delimiter}${safeEnv.PATH}`;\n } else if (resolvedCodeQLDir) {\n safeEnv.PATH = resolvedCodeQLDir;\n }\n \n // Merge with explicitly provided environment variables\n // These are trusted as they come from the application code, not external sources\n if (additionalEnv) {\n Object.assign(safeEnv, additionalEnv);\n }\n \n return safeEnv;\n}\n\n/**\n * Execute a CLI command and return the result.\n * \n * Security: This function uses execFile() instead of exec() to avoid shell interpretation.\n * Arguments are passed directly to the executable as an array, preventing shell injection.\n * Additional security measures include:\n * - Command whitelist validation\n * - Shell metacharacter detection in command names\n * - CLI argument sanitization (null bytes, control characters)\n * - Environment variable filtering\n */\nexport async function executeCLICommand(options: CLIExecutionOptions): Promise {\n try {\n const { command, args, cwd, timeout = 300000, env } = options; // 5 minute default timeout\n \n // Validate command is in the whitelist to prevent arbitrary command execution\n if (!isCommandAllowed(command)) {\n throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`);\n }\n \n // Validate command to ensure it doesn't contain shell metacharacters\n if (command.includes(';') || command.includes('|') || command.includes('&') || \n command.includes('$') || command.includes('`') || command.includes('\\n') ||\n command.includes('\\r')) {\n throw new Error(`Invalid command: contains shell metacharacters: ${command}`);\n }\n \n // Sanitize CLI arguments to prevent issues with special characters\n // This provides defense-in-depth even though execFile() doesn't use a shell\n const sanitizedArgs = sanitizeCLIArguments(args);\n \n logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout });\n \n const execOptions = {\n cwd,\n timeout,\n env: getSafeEnvironment(env),\n };\n \n // execFile() is used instead of exec() to avoid shell interpretation\n // Arguments are passed as an array, not interpolated into a command string\n const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions);\n\n return {\n stdout,\n stderr,\n success: true,\n exitCode: 0\n };\n\n } catch (error: unknown) {\n logger.error('CLI command execution failed:', error);\n \n const err = error as Error & { code?: number; stdout?: string; stderr?: string };\n const errorMessage = err instanceof Error ? err.message : String(error);\n const exitCode = err.code || 1;\n \n return {\n stdout: err.stdout || '',\n stderr: err.stderr || errorMessage,\n success: false,\n error: errorMessage,\n exitCode\n };\n }\n}\n\n/**\n * Build CodeQL command arguments with proper escaping\n */\nexport function buildCodeQLArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n // Single-letter parameters that should use -key=value format (with equals sign)\n // Note: CodeQL CLI uses -t=key=value format for metadata, not -t key=value\n const singleLetterParams = new Set(['t', 'o', 'v', 'q', 'h', 'J']);\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n const isSingleLetter = key.length === 1 && singleLetterParams.has(key);\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(isSingleLetter ? `-${key}` : `--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values (e.g., multiple -t flags for metadata)\n for (const item of value) {\n if (isSingleLetter) {\n // For single-letter params like -t, use -key=value format\n args.push(`-${key}=${String(item)}`);\n } else {\n // For long params, use --key=value format\n args.push(`--${key}=${String(item)}`);\n }\n }\n } else {\n // Handle string, number, and other values\n if (isSingleLetter) {\n // For single-letter params, use -key=value format\n args.push(`-${key}=${String(value)}`);\n } else {\n args.push(`--${key}=${String(value)}`);\n }\n }\n }\n \n return args;\n}\n\n/**\n * Build QLT command arguments with proper escaping\n */\nexport function buildQLTArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values\n for (const item of value) {\n args.push(`--${key}`, String(item));\n }\n } else {\n // Handle string, number, and other values\n args.push(`--${key}`, String(value));\n }\n }\n \n return args;\n}\n\n/**\n * Execute a CodeQL command.\n * Always uses the bare `codeql` command name so that execvp() PATH lookup\n * handles shell-script shebangs correctly. When CODEQL_PATH is set, the\n * resolved directory is prepended to PATH via getSafeEnvironment().\n */\nexport async function executeCodeQLCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = [],\n cwd?: string\n): Promise {\n const args = buildCodeQLArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'codeql',\n args,\n cwd\n });\n}\n\n/**\n * Execute a QLT command\n */\nexport async function executeQLTCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = []\n): Promise {\n const args = buildQLTArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'qlt',\n args\n });\n}\n\n/**\n * Get help text for a CLI command\n */\nexport async function getCommandHelp(command: string, subcommand?: string): Promise {\n const args = subcommand ? [subcommand, '--help'] : ['--help'];\n \n const result = await executeCLICommand({\n command,\n args\n });\n \n return result.stdout || result.stderr || 'No help available';\n}\n\n/**\n * Validate that a command exists on the system.\n */\nexport async function validateCommandExists(command: string): Promise {\n try {\n const result = await executeCLICommand({\n command: 'which',\n args: [command]\n });\n return result.success;\n } catch {\n return false;\n }\n}", "/**\n * Utilities for resolving filesystem paths relative to the server package root.\n *\n * The server can run from three different directory layouts:\n *\n * 1. **Source** (dev): `server/src/lib/` \u2192 packageRoot = `server/`\n * 2. **Bundle in monorepo** (dev/CI): `server/dist/` \u2192 packageRoot = `server/`\n * 3. **Bundle via npm** (production): `/dist/` \u2192 packageRoot = `/`\n *\n * In all three cases, the bundled QL tool query packs live at\n * `/ql//tools/src/`.\n *\n * The \"workspace root\" (monorepo root) is one level above packageRoot when\n * running from the monorepo checkout, and the packageRoot itself when running\n * from an npm install (no parent monorepo).\n */\n\nimport { dirname, resolve } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect whether the current __dirname looks like source code (`src/lib` or\n * `src/utils`) vs a bundled flat output directory (`dist/`).\n */\nfunction isRunningFromSource(dir: string): boolean {\n const normalized = dir.replace(/\\\\/g, '/');\n return normalized.includes('/src/');\n}\n\n/**\n * Get the server package root directory.\n *\n * - From source (`server/src/utils/`): up 2 levels \u2192 `server/`\n * - From bundle (`server/dist/` or `/dist/`): up 1 level \u2192 package root\n */\nexport function getPackageRootDir(currentDir: string = __dirname): string {\n return isRunningFromSource(currentDir)\n ? resolve(currentDir, '..', '..') // src/utils \u2192 server/\n : resolve(currentDir, '..'); // dist/ \u2192 package root\n}\n\n/**\n * Get the workspace root directory (monorepo root when applicable).\n *\n * If a `package.json` with `workspaces` exists one level above the package\n * root, we're in a monorepo and that parent is the workspace root. Otherwise,\n * the packageRoot itself is the workspace root (npm install scenario).\n */\nexport function getWorkspaceRootDir(packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n const parentDir = resolve(pkgRoot, '..');\n\n // In the monorepo, the parent directory contains a package.json with workspaces\n try {\n const parentPkgPath = resolve(parentDir, 'package.json');\n if (existsSync(parentPkgPath)) {\n const parentPkg = JSON.parse(readFileSync(parentPkgPath, 'utf8'));\n if (parentPkg.workspaces) {\n return parentDir;\n }\n }\n } catch {\n // Not in a monorepo \u2014 fall through\n }\n\n return pkgRoot;\n}\n\n/**\n * Resolve the path to a tool query pack's source directory.\n *\n * @param language - CodeQL language identifier (e.g., \"javascript\", \"cpp\")\n * @param packageRoot - Override the package root (for testing)\n * @returns Absolute path to `ql//tools/src/`\n */\nexport function resolveToolQueryPackPath(language: string, packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n return resolve(pkgRoot, 'ql', language, 'tools', 'src');\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\n", "/**\n * CodeQL Development MCP McpServer\n * Main entry point for the server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport express from 'express';\nimport cors from 'cors';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport { registerCodeQLTools, registerCodeQLResources } from './tools';\nimport { registerLanguageResources } from './resources/language-resources';\nimport { registerWorkflowPrompts } from './prompts/workflow-prompts';\nimport { registerMonitoringTools } from './tools/monitoring-tools';\nimport { sessionDataManager } from './lib/session-data-manager';\nimport { resolveCodeQLBinary, validateCodeQLBinaryReachable } from './lib/cli-executor';\nimport { packageRootDir } from './utils/package-paths';\nimport { logger } from './utils/logger';\n\n// Load environment variables from a .env file co-located with the package root.\n// Uses the package directory (not CWD) so that npm-installed users don't\n// accidentally inherit a .env from their project.\ndotenv.config({ path: resolve(packageRootDir, '.env') });\n\nconst PACKAGE_NAME = 'codeql-development-mcp-server';\nconst VERSION = '2.23.9';\n\n/**\n * Start the MCP server\n */\nexport async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise {\n logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`);\n\n // Resolve the CodeQL CLI binary path (honors CODEQL_PATH env var).\n // This must happen before any tool registration so that all CodeQL commands\n // use the user-specified binary.\n const codeqlBinary = resolveCodeQLBinary();\n logger.info(`CodeQL CLI binary: ${codeqlBinary}`);\n\n // Validate that the resolved binary is actually callable. This catches\n // misconfigurations early (e.g. codeql not on PATH and CODEQL_PATH unset)\n // instead of failing silently and producing confusing tool-level errors.\n const codeqlVersion = await validateCodeQLBinaryReachable();\n logger.info(`CodeQL CLI version: ${codeqlVersion}`);\n\n const server = new McpServer({\n name: PACKAGE_NAME,\n version: VERSION,\n });\n\n // Register CodeQL tools (legacy high-level helpers)\n registerCodeQLTools(server);\n\n // Register CodeQL resources (static guides)\n registerCodeQLResources(server);\n\n // Register language-specific resources (AST references, security patterns)\n registerLanguageResources(server);\n\n // Register high-level workflow prompts (complete development workflows)\n registerWorkflowPrompts(server);\n\n // Register monitoring and reporting tools\n registerMonitoringTools(server);\n\n // Initialize session data manager\n await sessionDataManager.initialize();\n\n if (mode === 'stdio') {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info('McpServer started successfully on STDIO transport');\n } else {\n // HTTP mode\n const app = express();\n app.use(cors());\n app.use(express.json());\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => Math.random().toString(36).substring(7),\n });\n await server.connect(transport);\n\n app.all('/mcp', (req, res) => {\n transport.handleRequest(req, res, req.body).catch((err) => {\n logger.error('Error handling MCP request:', err);\n if (!res.headersSent) {\n res.status(500).json({ error: 'Internal McpServer Error' });\n }\n });\n });\n\n app.get('/', (_req, res) => {\n res.json({\n name: PACKAGE_NAME,\n version: VERSION,\n description: 'CodeQL Development MCP McpServer',\n status: 'running',\n });\n });\n\n const host = process.env.HTTP_HOST || 'localhost';\n const port = Number(process.env.HTTP_PORT || process.env.PORT) || 3000;\n \n // Return a promise that keeps the process alive\n return new Promise((resolve, reject) => {\n const httpServer = app.listen(port, host, () => {\n logger.info(`HTTP server listening on http://${host}:${port}/mcp`);\n resolve();\n });\n \n httpServer.on('error', (error) => {\n logger.error('HTTP server error:', error);\n reject(error);\n });\n });\n }\n\n setupGracefulShutdown(server);\n return server;\n}\n\n/**\n * Set up graceful shutdown handling\n */\nfunction setupGracefulShutdown(server: McpServer): void {\n const shutdown = async () => {\n logger.info('Shutting down server...');\n try {\n await server.close();\n logger.info('McpServer closed gracefully');\n process.exit(0);\n } catch (error) {\n logger.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\n/**\n * Main function to start the server\n */\nasync function main(): Promise {\n try {\n const transportMode = (process.env.TRANSPORT_MODE || 'stdio').toLowerCase();\n const mode: 'stdio' | 'http' = transportMode === 'http' ? 'http' : 'stdio';\n await startServer(mode);\n } catch (error) {\n logger.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\n// Start the server if this file is run directly\nconst scriptPath = process.argv[1] ? resolve(process.argv[1]) : undefined;\nif (scriptPath && import.meta.url === pathToFileURL(scriptPath).href) {\n main();\n}\n", "/**\n * CodeQL BQRS decode tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsDecodeTool: CLIToolDefinition = {\n name: 'codeql_bqrs_decode',\n description: 'Decode BQRS result files to human-readable formats',\n command: 'codeql',\n subcommand: 'bqrs decode',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to decode'),\n output: createCodeQLSchemas.output(),\n format: z.enum(['csv', 'json']).optional().describe('Output format'),\n 'max-paths': z.number().optional().describe('Maximum number of paths to output'),\n 'start-at': z.number().optional().describe('Start output at result number'),\n 'max-results': z.number().optional().describe('Maximum number of results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs decode --format=csv --output=results.csv results.bqrs',\n 'codeql bqrs decode --format=json --max-results=100 results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * Generic tool registry for creating MCP tools from CLI command definitions\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator';\nimport { getOrCreateLogDirectory } from './log-directory-manager';\nimport { packageRootDir, resolveToolQueryPackPath, workspaceRootDir } from '../utils/package-paths';\nimport { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs';\nimport { basename, dirname, isAbsolute, join, resolve } from 'path';\nimport { createProjectTempDir } from '../utils/temp-dir';\n\nexport type { CLIExecutionResult } from './cli-executor';\n\nexport interface CLIToolDefinition {\n name: string;\n description: string;\n command: 'codeql' | 'qlt';\n subcommand: string;\n inputSchema: Record;\n examples?: string[];\n resultProcessor?: (_result: CLIExecutionResult, _params: Record) => string;\n}\n\n/**\n * Default result processor that formats CLI output appropriately\n */\nexport const defaultCLIResultProcessor = (\n result: CLIExecutionResult, \n _params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n \n let output = '';\n \n if (result.stdout) {\n output += result.stdout;\n }\n \n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n \n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n \n return output;\n};\n\n/**\n * Register a CLI tool with the MCP server\n */\nexport function registerCLITool(server: McpServer, definition: CLIToolDefinition): void {\n const {\n name,\n description,\n command,\n subcommand,\n inputSchema,\n resultProcessor = defaultCLIResultProcessor\n } = definition;\n\n server.tool(\n name,\n description,\n inputSchema,\n async (params: Record) => {\n // Track temporary directories for cleanup\n const tempDirsToCleanup: string[] = [];\n \n try {\n logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params });\n\n // Separate positional arguments from named options\n // Extract tool-specific parameters that should not be passed to CLI\n // Note: format is extracted for tools that use it internally but not on CLI\n // For codeql_bqrs_interpret, codeql_bqrs_decode, codeql_generate_query-help, and codeql_database_analyze, format should be passed to CLI\n const formatShouldBePassedToCLI = name === 'codeql_bqrs_interpret' || name === 'codeql_bqrs_decode' || name === 'codeql_generate_query-help' || name === 'codeql_database_analyze';\n \n const extractedParams = formatShouldBePassedToCLI\n ? {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack,\n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n }\n : {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack, \n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n format: params.format,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n };\n\n const {\n _positional = [],\n files,\n file,\n dir,\n packDir,\n tests,\n query,\n queryName,\n queryLanguage: _queryLanguage,\n queryPack: _queryPack,\n sourceFiles,\n sourceFunction,\n targetFunction,\n format: _format,\n interpretedOutput: _interpretedOutput,\n evaluationFunction: _evaluationFunction,\n evaluationOutput: _evaluationOutput,\n directory,\n logDir: customLogDir,\n qlref,\n } = extractedParams;\n\n // Get remaining options (everything not extracted above)\n const options = {...params};\n Object.keys(extractedParams).forEach(key => delete options[key]);\n let positionalArgs = Array.isArray(_positional) ? _positional as string[] : [_positional as string];\n\n // Handle files parameter as positional arguments for certain tools\n if (files && Array.isArray(files)) {\n positionalArgs = [...positionalArgs, ...files as string[]];\n }\n\n // Handle file parameter as positional argument for BQRS tools\n if (file && name.startsWith('codeql_bqrs_')) {\n positionalArgs = [...positionalArgs, file as string];\n }\n\n // Handle qlref parameter as positional argument for resolve qlref tool\n if (qlref && name === 'codeql_resolve_qlref') {\n positionalArgs = [...positionalArgs, qlref as string];\n }\n\n // Handle database parameter as positional argument for resolve database tool\n if (options.database && name === 'codeql_resolve_database') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database parameter as positional argument for database create tool\n if (options.database && name === 'codeql_database_create') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database and queries parameters as positional arguments for database analyze tool\n if (name === 'codeql_database_analyze') {\n if (options.database) {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n if (options.queries) {\n positionalArgs = [...positionalArgs, options.queries as string];\n delete options.queries;\n }\n }\n\n // Handle query parameter as positional argument for generate query-help tool\n if (query && name === 'codeql_generate_query-help') {\n positionalArgs = [...positionalArgs, query as string];\n }\n\n // Handle dir parameter as positional argument for pack tools\n if (dir && (name === 'codeql_pack_ls')) {\n positionalArgs = [...positionalArgs, dir as string];\n }\n \n // Handle tool-specific parameters using switch pattern for better maintainability\n switch (name) {\n case 'codeql_test_accept':\n case 'codeql_test_extract':\n case 'codeql_test_run':\n case 'codeql_resolve_tests':\n // Handle tests parameter as positional arguments for test tools.\n // Resolve relative paths against workspaceRootDir since the MCP\n // server's cwd may not be the repo root.\n if (tests && Array.isArray(tests)) {\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(workspaceRootDir, t)\n )];\n }\n break;\n \n case 'codeql_query_run': {\n // Resolve database path to absolute path if it's relative\n if (options.database && typeof options.database === 'string' && !isAbsolute(options.database)) {\n options.database = resolve(workspaceRootDir, options.database);\n logger.info(`Resolved database path to: ${options.database}`);\n }\n \n // Implement query resolution logic with enhanced results processing\n const resolvedQuery = await resolveQueryPath(params, logger);\n if (resolvedQuery) {\n positionalArgs = [...positionalArgs, resolvedQuery];\n } else if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n \n // Handle external predicates for tool queries\n if (queryName === 'PrintAST' && sourceFiles) {\n // Create a CSV file with the source file paths for the external predicate\n // The external predicate expects a CSV file with one column containing file paths\n const filePaths = (sourceFiles as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir); // Track for cleanup\n csvPath = join(tempDir, 'selectedSourceFiles.csv');\n\n // Create CSV content\n const csvContent = filePaths.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`selectedSourceFiles=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphFrom queries\n if (queryName === 'CallGraphFrom' && sourceFunction) {\n const functionNames = (sourceFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'sourceFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`sourceFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphTo queries\n if (queryName === 'CallGraphTo' && targetFunction) {\n const functionNames = (targetFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'targetFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`targetFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n break;\n }\n \n case 'codeql_query_compile':\n case 'codeql_resolve_metadata':\n // Handle query parameter as positional argument for query compilation and metadata tools\n if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n break;\n \n case 'codeql_resolve_queries':\n // Handle directory parameter as positional argument\n if (directory) {\n positionalArgs = [...positionalArgs, directory as string];\n }\n break;\n \n default:\n // No special parameter handling needed for other tools\n break;\n }\n\n // Set up logging directory for query/test runs\n let queryLogDir: string | undefined;\n if (name === 'codeql_query_run' || name === 'codeql_test_run') {\n queryLogDir = getOrCreateLogDirectory(customLogDir as string | undefined);\n logger.info(`Using log directory for ${name}: ${queryLogDir}`);\n \n // Create timestamp file to track when query/test run started\n const timestampPath = join(queryLogDir, 'timestamp');\n writeFileSync(timestampPath, Date.now().toString(), 'utf8');\n \n // Set the --logdir option for CodeQL CLI\n options.logdir = queryLogDir;\n \n // Set verbosity to progress+ to generate detailed query.log/test.log\n if (!options.verbosity) {\n options.verbosity = 'progress+';\n }\n \n // For query run, also handle the deprecated evaluator-log parameter and default output\n if (name === 'codeql_query_run') {\n // If evaluator-log was explicitly provided (deprecated), use it\n // Otherwise, set it to the log directory\n if (!options['evaluator-log']) {\n options['evaluator-log'] = join(queryLogDir, 'evaluator-log.jsonl');\n }\n \n // If output was not explicitly provided, set it to the log directory\n if (!options.output) {\n options.output = join(queryLogDir, 'results.bqrs');\n }\n }\n }\n\n let result: CLIExecutionResult;\n \n if (command === 'codeql') {\n // For pack commands, set the working directory to where qlpack.yml is located.\n // Resolve to absolute path since the MCP server's cwd may differ from\n // the workspace root (especially when launched by VS Code).\n let cwd: string | undefined;\n if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) {\n const rawCwd = (dir || packDir) as string;\n // Resolve relative paths against the workspace root, not process.cwd(),\n // since the MCP server's cwd may differ (especially in VS Code).\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd);\n }\n \n // Add --additional-packs for commands that need to access local test packs.\n // Only set the default examples path when it actually exists on disk\n // (it may be absent in npm-installed layouts where ql/javascript/examples/\n // is not included in the published package).\n const defaultExamplesPath = resolve(packageRootDir, 'ql', 'javascript', 'examples');\n const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS\n || (existsSync(defaultExamplesPath) ? defaultExamplesPath : undefined);\n if (additionalPacksPath && (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile')) {\n options['additional-packs'] = additionalPacksPath;\n }\n \n // Keep test databases for codeql_test_run to allow subsequent query runs\n if (name === 'codeql_test_run') {\n options['keep-databases'] = true;\n }\n \n result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd);\n } else if (command === 'qlt') {\n result = await executeQLTCommand(subcommand, options, positionalArgs);\n } else {\n throw new Error(`Unsupported command: ${command}`);\n }\n\n // Post-execution processing for codeql_query_run\n if (name === 'codeql_query_run' && result.success && queryLogDir) {\n // Generate SARIF interpretation if results.bqrs exists\n const bqrsPath = options.output as string;\n const sarifPath = join(queryLogDir, 'results.sarif');\n \n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n \n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n \n // Process evaluation results\n result = await processQueryRunResults(result, params, logger);\n }\n\n // Process the result\n const processedResult = resultProcessor(result, params);\n\n return {\n content: [{\n type: 'text' as const,\n text: processedResult\n }],\n isError: !result.success\n };\n\n } catch (error) {\n logger.error(`Error in CLI tool ${name}:`, error);\n \n return {\n content: [{\n type: 'text' as const,\n text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}`\n }],\n isError: true\n };\n } finally {\n // Clean up temporary directories\n for (const tempDir of tempDirsToCleanup) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n logger.info(`Cleaned up temporary directory: ${tempDir}`);\n } catch (cleanupError) {\n logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError);\n }\n }\n }\n }\n );\n}\n\n/**\n * Helper function to create common CodeQL input schemas\n */\nexport const createCodeQLSchemas = {\n database: () => z.string().describe('Path to the CodeQL database'),\n \n query: () => z.string().describe('Path to the CodeQL query file (.ql)'),\n \n output: () => z.string().optional().describe('Output file path'),\n \n outputFormat: () => z.enum(['csv', 'json', 'bqrs', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n \n language: () => z.string().optional().describe('Programming language'),\n \n threads: () => z.number().optional().describe('Number of threads to use'),\n \n ram: () => z.number().optional().describe('Amount of RAM to use (MB)'),\n \n timeout: () => z.number().optional().describe('Timeout in seconds'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments'),\n \n positionalArgs: () => z.array(z.string()).optional().describe('Positional arguments')\n .transform((val) => ({ _positional: val }))\n};\n\n/**\n * Helper function to create common QLT input schemas\n */\nexport const createQLTSchemas = {\n language: () => z.string().describe('Programming language'),\n \n output: () => z.string().optional().describe('Output directory or file path'),\n \n template: () => z.string().optional().describe('Template to use'),\n \n name: () => z.string().optional().describe('Name for generated query'),\n \n description: () => z.string().optional().describe('Description for generated query'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n force: () => z.boolean().optional().describe('Force overwrite existing files'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments')\n};\n\n/**\n * Create a result processor that formats BQRS output specially\n */\nexport const createBQRSResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n // For BQRS commands, provide more context about the output\n let output = result.stdout;\n \n if (params.output) {\n output += `\\n\\nResults saved to: ${params.output}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Create a result processor that formats database creation output\n */\nexport const createDatabaseResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n let output = 'Database creation completed successfully';\n \n if (params.database || params._positional) {\n const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional);\n output += `\\n\\nDatabase location: ${dbPath}`;\n }\n \n if (result.stdout) {\n output += `\\n\\nOutput:\\n${result.stdout}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Resolve query path for codeql_query_run tool\n * If queryName and queryLanguage are provided, resolve using codeql resolve queries\n */\nasync function resolveQueryPath(\n params: Record, \n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n const { queryName, queryLanguage, queryPack, query } = params;\n \n // Validate parameter usage - queryName and query are mutually exclusive\n if (queryName && query) {\n logger.error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n throw new Error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n }\n \n // If no queryName provided, fall back to direct query parameter\n if (!queryName) {\n return query as string || null;\n }\n \n // If queryName provided but no language, we can't resolve\n if (!queryLanguage) {\n logger.error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n throw new Error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n }\n \n try {\n // Determine the query pack path - use absolute path to ensure it works regardless of cwd\n const defaultPackPath = resolveToolQueryPackPath(queryLanguage as string);\n const packPath = queryPack as string || defaultPackPath;\n \n logger.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`);\n \n // Execute codeql resolve queries to get available queries\n const { executeCodeQLCommand } = await import('./cli-executor');\n const resolveResult = await executeCodeQLCommand(\n 'resolve queries',\n { format: 'json' },\n [packPath]\n );\n \n if (!resolveResult.success) {\n logger.error('Failed to resolve queries:', resolveResult.stderr || resolveResult.error);\n throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`);\n }\n \n // Parse the JSON output to find matching queries\n let resolvedQueries: string[];\n try {\n resolvedQueries = JSON.parse(resolveResult.stdout);\n } catch (parseError) {\n logger.error('Failed to parse resolve queries output:', parseError);\n throw new Error('Failed to parse resolve queries output');\n }\n \n // Find the query that matches the requested name exactly\n const matchingQuery = resolvedQueries.find(queryPath => {\n const fileName = basename(queryPath);\n // Match exact query name: \"PrintAST\" should match \"PrintAST.ql\" only\n return fileName === `${queryName}.ql`;\n });\n\n if (!matchingQuery) {\n logger.error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\". Available queries:`, resolvedQueries.map(q => basename(q)));\n throw new Error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\"`);\n }\n \n logger.info(`Resolved query \"${queryName}\" to: ${matchingQuery}`);\n return matchingQuery;\n \n } catch (error) {\n logger.error('Error resolving query path:', error);\n throw error;\n }\n}\n\n/**\n * Interpret BQRS file using codeql bqrs interpret\n */\nasync function interpretBQRSFile(\n bqrsPath: string,\n queryPath: string,\n format: string,\n outputPath: string,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n // Extract query metadata to get id and kind\n const metadata = await extractQueryMetadata(queryPath);\n \n // Validate required metadata fields\n const missingFields = [];\n if (!metadata.id) missingFields.push('id');\n if (!metadata.kind) missingFields.push('kind');\n \n if (missingFields.length > 0) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(', ')}. Ensure the query file contains @id and @kind metadata.`\n };\n }\n \n // Sanitize metadata values to prevent command injection\n const sanitizedKind = (metadata.kind || '').replace(/[^a-zA-Z0-9_-]/g, '');\n const sanitizedId = (metadata.id || '').replace(/[^a-zA-Z0-9_/:-]/g, '');\n \n // Validate format for query kind\n const graphFormats = ['graphtext', 'dgml', 'dot'];\n if (graphFormats.includes(format) && metadata.kind !== 'graph') {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}`\n };\n }\n \n // Ensure output directory exists\n mkdirSync(dirname(outputPath), { recursive: true });\n \n // Build the codeql bqrs interpret command\n const params: Record = {\n format: format,\n output: outputPath,\n t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`]\n };\n \n logger.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`);\n \n // Execute codeql bqrs interpret\n const result = await executeCodeQLCommand(\n 'bqrs interpret',\n params,\n [bqrsPath]\n );\n \n return result;\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Failed to interpret BQRS file: ${error}`\n };\n }\n}\n\n/**\n * Get default output extension based on format\n */\nfunction getDefaultExtension(format: string): string {\n switch (format) {\n case 'sarif-latest':\n case 'sarifv2.1.0':\n return '.sarif';\n case 'csv':\n return '.csv';\n case 'graphtext':\n return '.txt';\n case 'dgml':\n return '.dgml';\n case 'dot':\n return '.dot';\n default:\n return '.txt';\n }\n}\n\n/**\n * Process query run results with optional interpretation or evaluation\n */\nasync function processQueryRunResults(\n result: CLIExecutionResult,\n params: Record,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params;\n \n // If no format or evaluationFunction specified, return as-is\n if (!format && !evaluationFunction) {\n return result;\n }\n \n // Ensure output (bqrs file) was generated\n if (!output) {\n return result;\n }\n \n const bqrsPath = output as string;\n \n // Determine the query path for metadata extraction\n let queryPath: string | null = null;\n \n if (query) {\n queryPath = query as string;\n } else if (queryName && queryLanguage) {\n // Try to resolve the query path again for evaluation\n queryPath = await resolveQueryPath(params, logger);\n }\n \n if (!queryPath) {\n logger.error('Cannot determine query path for interpretation/evaluation');\n return {\n ...result,\n stdout: result.stdout + '\\n\\nWarning: Query interpretation skipped - could not determine query path'\n };\n }\n \n // Handle new format parameter (preferred approach)\n if (format) {\n const outputFormat = format as string;\n \n // Determine output path\n let outputFilePath = interpretedOutput as string | undefined;\n if (!outputFilePath) {\n const ext = getDefaultExtension(outputFormat);\n outputFilePath = bqrsPath.replace('.bqrs', ext);\n }\n \n logger.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`);\n \n // Interpret the BQRS file\n const interpretResult = await interpretBQRSFile(\n bqrsPath,\n queryPath,\n outputFormat,\n outputFilePath,\n logger\n );\n \n if (interpretResult.success) {\n let enhancedOutput = result.stdout;\n enhancedOutput += `\\n\\nQuery results interpreted successfully with format: ${outputFormat}`;\n enhancedOutput += `\\nInterpreted output saved to: ${outputFilePath}`;\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n logger.error('Query interpretation failed:', interpretResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}`\n };\n }\n }\n \n // Handle legacy evaluationFunction parameter (deprecated)\n if (evaluationFunction) {\n logger.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`);\n logger.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`);\n \n // Perform the evaluation\n const evaluationResult: QueryEvaluationResult = await evaluateQueryResults(\n bqrsPath,\n queryPath,\n evaluationFunction as string,\n evaluationOutput as string | undefined\n );\n \n if (evaluationResult.success) {\n // Append evaluation results to the command output\n let enhancedOutput = result.stdout;\n \n if (evaluationResult.outputPath) {\n enhancedOutput += `\\n\\nQuery evaluation completed successfully.`;\n enhancedOutput += `\\nEvaluation output saved to: ${evaluationResult.outputPath}`;\n }\n \n if (evaluationResult.content) {\n enhancedOutput += `\\n\\n=== Query Results Evaluation ===\\n`;\n enhancedOutput += evaluationResult.content;\n }\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n // Evaluation failed, but don't fail the whole operation\n logger.error('Query evaluation failed:', evaluationResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query evaluation failed - ${evaluationResult.error}`\n };\n }\n }\n \n return result;\n } catch (error) {\n logger.error('Error in query results processing:', error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query processing error - ${error}`\n };\n }\n}", "/**\n * Query results evaluation functions for processing .bqrs files\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { writeFileSync, readFileSync } from 'fs';\nimport { dirname, isAbsolute } from 'path';\nimport { mkdirSync } from 'fs';\n\nexport interface QueryEvaluationResult {\n success: boolean;\n outputPath?: string;\n content?: string;\n error?: string;\n}\n\nexport interface QueryMetadata {\n kind?: string;\n name?: string;\n description?: string;\n id?: string;\n tags?: string[];\n}\n\n/**\n * Built-in evaluation functions\n */\nexport const BUILT_IN_EVALUATORS = {\n 'json-decode': 'JSON format decoder for query results',\n 'csv-decode': 'CSV format decoder for query results', \n 'mermaid-graph': 'Mermaid diagram generator for @kind graph queries (like PrintAST)',\n} as const;\n\nexport type BuiltInEvaluator = keyof typeof BUILT_IN_EVALUATORS;\n\n/**\n * Extract metadata from a CodeQL query file\n */\nexport async function extractQueryMetadata(queryPath: string): Promise {\n try {\n const queryContent = readFileSync(queryPath, 'utf-8');\n const metadata: QueryMetadata = {};\n \n // Extract metadata from comments using regex patterns\n const kindMatch = queryContent.match(/@kind\\s+([^\\s]+)/);\n if (kindMatch) metadata.kind = kindMatch[1];\n \n const nameMatch = queryContent.match(/@name\\s+(.+)/);\n if (nameMatch) metadata.name = nameMatch[1].trim();\n \n const descMatch = queryContent.match(/@description\\s+(.+)/);\n if (descMatch) metadata.description = descMatch[1].trim();\n \n const idMatch = queryContent.match(/@id\\s+(.+)/);\n if (idMatch) metadata.id = idMatch[1].trim();\n \n const tagsMatch = queryContent.match(/@tags\\s+(.+)/);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(/\\s+/).filter(t => t.length > 0);\n }\n \n return metadata;\n } catch (error) {\n logger.error('Failed to extract query metadata:', error);\n return {};\n }\n}\n\n/**\n * JSON decoder - converts .bqrs to JSON format\n */\nexport async function evaluateWithJsonDecoder(\n bqrsPath: string, \n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.json');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write JSON results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `JSON evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * CSV decoder - converts .bqrs to CSV format\n */\nexport async function evaluateWithCsvDecoder(\n bqrsPath: string,\n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'csv' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.csv');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write CSV results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `CSV evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Mermaid graph generator - converts @kind graph query results to mermaid diagrams\n */\nexport async function evaluateWithMermaidGraph(\n bqrsPath: string,\n queryPath: string,\n outputPath?: string\n): Promise {\n try {\n // First extract query metadata to confirm this is a graph query\n const metadata = await extractQueryMetadata(queryPath);\n \n if (metadata.kind !== 'graph') {\n logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`);\n return {\n success: false,\n error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`\n };\n }\n \n // Decode the BQRS file to JSON first\n const jsonResult = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!jsonResult.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}`\n };\n }\n \n // Parse the JSON results\n let queryResults;\n try {\n queryResults = JSON.parse(jsonResult.stdout);\n } catch (parseError) {\n return {\n success: false,\n error: `Failed to parse query results JSON: ${parseError}`\n };\n }\n \n // Generate mermaid diagram from graph results\n const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata);\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.md');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write markdown file with mermaid diagram\n writeFileSync(defaultOutputPath, mermaidContent);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: mermaidContent\n };\n } catch (error) {\n return {\n success: false,\n error: `Mermaid graph evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Generate mermaid diagram from CodeQL graph query results\n */\nfunction generateMermaidFromGraphResults(queryResults: unknown, metadata: QueryMetadata): string {\n const queryName = sanitizeMarkdown(metadata.name || 'CodeQL Query Results');\n const queryDesc = sanitizeMarkdown(metadata.description || 'Graph visualization of CodeQL query results');\n \n let mermaidContent = `# ${queryName}\\n\\n${queryDesc}\\n\\n`;\n \n // Handle different result structures that CodeQL graph queries can produce\n if (!queryResults || typeof queryResults !== 'object') {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Results]\\n```\\n';\n return mermaidContent;\n }\n \n // Check if results have the expected structure for graph queries\n const tuples = queryResults.tuples || queryResults;\n \n if (!Array.isArray(tuples) || tuples.length === 0) {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Graph Data]\\n```\\n';\n return mermaidContent;\n }\n \n mermaidContent += '```mermaid\\ngraph TD\\n';\n \n // Track nodes and edges to avoid duplicates\n const nodes = new Set();\n const edges = new Set();\n \n // Process each tuple in the results\n tuples.forEach((tuple: unknown, index: number) => {\n if (Array.isArray(tuple) && tuple.length >= 2) {\n // Extract source and target from tuple\n const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`);\n const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`);\n const label = tuple[2]?.toString() || '';\n \n // Add nodes\n nodes.add(source);\n nodes.add(target);\n \n // Add edge\n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n } else if (typeof tuple === 'object' && tuple !== null) {\n // Handle object-based results\n const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`);\n const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`);\n const label = tuple.label?.toString() || tuple.relation?.toString() || '';\n \n nodes.add(source);\n nodes.add(target);\n \n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n }\n });\n \n // If no edges were created, create a simple diagram showing the first few nodes\n if (edges.size === 0 && nodes.size > 0) {\n const nodeArray = Array.from(nodes).slice(0, 10); // Limit to avoid clutter\n nodeArray.forEach((node, index) => {\n if (index === 0) {\n mermaidContent += ` ${node}[${sanitizeLabel(node)}]\\n`;\n } else {\n mermaidContent += ` ${nodeArray[0]} --> ${node}\\n`;\n }\n });\n }\n \n mermaidContent += '```\\n\\n';\n \n // Add statistics\n mermaidContent += `## Query Statistics\\n\\n`;\n mermaidContent += `- Total nodes: ${nodes.size}\\n`;\n mermaidContent += `- Total edges: ${edges.size}\\n`;\n mermaidContent += `- Total tuples processed: ${tuples.length}\\n`;\n \n return mermaidContent;\n}\n\n/**\n * Sanitize node IDs for mermaid compatibility\n */\nfunction sanitizeNodeId(id: string): string {\n return id\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^(\\d)/, 'n$1') // Prefix with 'n' if starts with number\n .substring(0, 50); // Limit length\n}\n\n/**\n * Sanitize labels for mermaid compatibility\n */\nfunction sanitizeLabel(label: string): string {\n return label\n .replace(/[|\"`<>\\n\\r\\t]/g, '') // Remove problematic characters including backticks, newlines, angle brackets\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 30); // Limit length for readability\n}\n\n/**\n * Sanitize markdown content to prevent injection\n */\nfunction sanitizeMarkdown(content: string): string {\n return content\n .replace(/[<>\"`]/g, '') // Remove potentially dangerous characters\n .replace(/\\n/g, ' ') // Convert newlines to spaces\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 100); // Limit length\n}\n\n/**\n * Main evaluation function that determines which evaluator to use\n */\nexport async function evaluateQueryResults(\n bqrsPath: string,\n queryPath: string,\n evaluationFunction?: string,\n outputPath?: string\n): Promise {\n try {\n // If no evaluation function specified, default to json-decode\n const evalFunc = evaluationFunction || 'json-decode';\n \n logger.info(`Evaluating query results with function: ${evalFunc}`);\n \n // Handle built-in evaluation functions\n switch (evalFunc) {\n case 'json-decode':\n return await evaluateWithJsonDecoder(bqrsPath, outputPath);\n \n case 'csv-decode':\n return await evaluateWithCsvDecoder(bqrsPath, outputPath);\n \n case 'mermaid-graph':\n return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath);\n \n default:\n // Check if it's a path to a custom evaluation script\n if (isAbsolute(evalFunc)) {\n return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath);\n } else {\n return {\n success: false,\n error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(', ')}`\n };\n }\n }\n } catch (error) {\n return {\n success: false,\n error: `Query evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Execute custom evaluation script\n */\nasync function evaluateWithCustomScript(\n _bqrsPath: string,\n _queryPath: string,\n _scriptPath: string,\n _outputPath?: string\n): Promise {\n // TODO: Implement custom script execution\n // This would need to execute the script with bqrsPath and queryPath as arguments\n // and capture the output\n return {\n success: false,\n error: 'Custom evaluation scripts are not yet implemented'\n };\n}", "/**\n * Log directory management utilities for CodeQL query and test runs\n */\n\nimport { mkdirSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { randomBytes } from 'crypto';\nimport { getProjectTmpDir } from '../utils/temp-dir';\n\n/**\n * Ensure that a given path is within a base directory.\n * Throws an error if the path is outside the base directory.\n */\nfunction ensurePathWithinBase(baseDir: string, targetPath: string): string {\n const absBase = resolve(baseDir);\n const absTarget = resolve(targetPath);\n if (!absTarget.startsWith(absBase + '/') && absTarget !== absBase) {\n throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`);\n }\n return absTarget;\n}\n\n/**\n * Get or create a unique log directory for query/test runs\n * \n * @param logDir - Optional custom log directory from parameters\n * @returns Absolute path to the log directory\n */\nexport function getOrCreateLogDirectory(logDir?: string): string {\n // Use CODEQL_QUERY_LOG_DIR env var or default base\n const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir('query-logs');\n\n // If logDir is explicitly provided, validate it is within baseLogDir\n if (logDir) {\n const absLogDir = ensurePathWithinBase(baseLogDir, logDir);\n if (!existsSync(absLogDir)) {\n mkdirSync(absLogDir, { recursive: true });\n }\n return absLogDir;\n }\n \n // Otherwise, use baseLogDir and create a unique subdirectory\n \n // Create base directory if it doesn't exist\n if (!existsSync(baseLogDir)) {\n mkdirSync(baseLogDir, { recursive: true });\n }\n \n // Generate unique subdirectory with timestamp and random ID\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const uniqueId = randomBytes(4).toString('hex');\n const uniqueLogDir = join(baseLogDir, `query-run-${timestamp}-${uniqueId}`);\n \n mkdirSync(uniqueLogDir, { recursive: true });\n \n return uniqueLogDir;\n}\n", "/**\n * Secure project-local temporary directory utilities.\n *\n * All temporary files are created under `/.tmp/` which is\n * `.gitignore`d. This avoids writing to the OS temp directory\n * (`os.tmpdir()` / `/tmp`), which is world-readable and triggers\n * CWE-377 / CWE-378 (js/insecure-temporary-file).\n */\n\nimport { mkdirSync, mkdtempSync } from 'fs';\nimport { join } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n * Stored under `/.tmp` and excluded from version control.\n */\nconst PROJECT_TMP_BASE = join(getPackageRootDir(), '.tmp');\n\n/**\n * Return the project-local `.tmp` base directory, creating it if needed.\n */\nexport function getProjectTmpBase(): string {\n mkdirSync(PROJECT_TMP_BASE, { recursive: true });\n return PROJECT_TMP_BASE;\n}\n\n/**\n * Create a unique temporary directory under the project `.tmp` root.\n *\n * Works identically to `fs.mkdtempSync(os.tmpdir(), prefix)` but is\n * scoped to the repository.\n *\n * @param prefix - Directory name prefix (e.g. `'codeql-external-'`).\n * @returns Absolute path to the newly created directory.\n */\nexport function createProjectTempDir(prefix: string): string {\n const base = getProjectTmpBase();\n return mkdtempSync(join(base, prefix));\n}\n\n/**\n * Return a deterministic subdirectory under `.tmp/`, creating it\n * if it does not already exist.\n *\n * Useful for well-known scratch areas such as `query-logs` or `quickeval`.\n *\n * @param name - Subdirectory name (e.g. `'query-logs'`).\n * @returns Absolute path to the subdirectory.\n */\nexport function getProjectTmpDir(name: string): string {\n const dir = join(getProjectTmpBase(), name);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n", "/**\n * CodeQL BQRS info tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInfoTool: CLIToolDefinition = {\n name: 'codeql_bqrs_info',\n description: 'Get metadata and information about BQRS result files',\n command: 'codeql',\n subcommand: 'bqrs info',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to examine'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs info results.bqrs',\n 'codeql bqrs info --verbose results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * CodeQL BQRS interpret tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInterpretTool: CLIToolDefinition = {\n name: 'codeql_bqrs_interpret',\n description: 'Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)',\n command: 'codeql',\n subcommand: 'bqrs interpret',\n inputSchema: {\n file: z.string().describe('The BQRS file to interpret'),\n format: z.enum(['csv', 'sarif-latest', 'sarifv2.1.0', 'graphtext', 'dgml', 'dot'])\n .describe('Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)'),\n output: createCodeQLSchemas.output(),\n t: z.array(z.string())\n .describe('Query metadata key=value pairs. At least \"kind\" and \"id\" must be specified (e.g., [\"kind=graph\", \"id=js/print-ast\"])'),\n 'max-paths': z.number().optional()\n .describe('Maximum number of paths to produce for each alert with paths (default: 4)'),\n 'sarif-add-file-contents': z.boolean().optional()\n .describe('[SARIF only] Include full file contents for all files referenced in results'),\n 'sarif-add-snippets': z.boolean().optional()\n .describe('[SARIF only] Include code snippets for each location with context'),\n 'sarif-group-rules-by-pack': z.boolean().optional()\n .describe('[SARIF only] Place rule objects under their QL pack in tool.extensions property'),\n 'sarif-multicause-markdown': z.boolean().optional()\n .describe('[SARIF only] Include multi-cause alerts as Markdown-formatted lists'),\n 'sarif-category': z.string().optional()\n .describe('[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)'),\n 'csv-location-format': z.enum(['uri', 'line-column', 'offset-length']).optional()\n .describe('[CSV only] Format for locations in CSV output (default: line-column)'),\n 'dot-location-url-format': z.string().optional()\n .describe('[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})'),\n threads: z.number().optional()\n .describe('Number of threads for computing paths (0 = one per core, -N = leave N cores unused)'),\n 'column-kind': z.enum(['utf8', 'utf16', 'utf32', 'bytes']).optional()\n .describe('[SARIF only] Column kind for interpreting location columns'),\n 'unicode-new-lines': z.boolean().optional()\n .describe('[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs',\n 'codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs',\n 'codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs',\n 'codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs',\n 'codeql bqrs interpret --format=sarif-latest --sarif-add-snippets --sarif-category=security --output=results.sarif -t kind=path-problem -t id=go/path-injection results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};\n", "/**\n * CodeQL database analyze tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseAnalyzeTool: CLIToolDefinition = {\n name: 'codeql_database_analyze',\n description: 'Run queries or query suites against CodeQL databases',\n command: 'codeql',\n subcommand: 'database analyze',\n inputSchema: {\n database: z.string().describe('Path to the CodeQL database'),\n queries: z.string().describe('Queries or query suite to run'),\n output: z.string().optional().describe('Output file path'),\n format: z.enum(['csv', 'json', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n 'download-location': z.string().optional()\n .describe('Location to download missing dependencies'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n timeout: z.number().optional().describe('Timeout in seconds'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif',\n 'codeql database analyze mydb codeql/java-queries --format=csv'\n ]\n};", "/**\n * CodeQL database create tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createDatabaseResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseCreateTool: CLIToolDefinition = {\n name: 'codeql_database_create',\n description: 'Create a CodeQL database from source code',\n command: 'codeql',\n subcommand: 'database create',\n inputSchema: {\n database: z.string().describe('Database path/name to create'),\n language: z.string().optional().describe('Programming language(s) to extract'),\n 'source-root': z.string().optional().describe('Root directory of source code'),\n command: z.string().optional().describe('Build command for compiled languages'),\n 'build-mode': z.enum(['none', 'autobuild', 'manual']).optional()\n .describe('Build mode: none (interpreted langs), autobuild, or manual'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n overwrite: z.boolean().optional().describe('Overwrite existing database if it exists'),\n 'no-cleanup': z.boolean().optional().describe('Skip database cleanup after finalization'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database create --language=java --source-root=/path/to/project mydb',\n 'codeql database create --language=cpp --command=\"make all\" mydb',\n 'codeql database create --language=python,javascript mydb'\n ],\n resultProcessor: createDatabaseResultProcessor()\n};", "/**\n * CodeQL find class position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface ClassPosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a class name identifier in a QL file.\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findClassPosition(filepath: string, className: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Match class definition with the specific class name\n const classNameRegex = new RegExp(`\\\\bclass\\\\s+(${className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})\\\\b`);\n const match = classNameRegex.exec(line);\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The class name is in capture group 1\n const classNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = classNameStart + 1; // 1-based column numbering\n const end_col = start_col + className.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Class name '${className}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find class position tool with the MCP server\n */\nexport function registerFindClassPositionTool(server: McpServer): void {\n server.tool(\n 'find_class_position',\n 'Finds startline, startcol, endline endcol of a class for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the class to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findClassPosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding class position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find predicate position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface PredicatePosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a predicate name in a QL file.\n * Supports: \n * - predicate name(...) - predicates with no return type\n * - Type name(...) - predicates with return type (e.g., string foo())\n * - name(...) (inside class) - member predicates\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findPredicatePosition(filepath: string, predicateName: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n const escapedName = predicateName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Match predicate definition with the specific predicate name\n // Pattern 1: predicate name(...)\n const predicateKeywordRegex = new RegExp(`\\\\bpredicate\\\\s+(${escapedName})\\\\s*\\\\(`);\n let match = predicateKeywordRegex.exec(line);\n \n // Pattern 2: Type name(...) - predicates with return type\n // Matches: string foo(), int bar(), MyClass baz(), etc.\n // Must start at beginning of line (with optional whitespace) or after certain keywords\n if (!match) {\n const returnTypeRegex = new RegExp(`(?:^|\\\\s)(?:abstract\\\\s+)?(?:cached\\\\s+)?(?:private\\\\s+)?(?:deprecated\\\\s+)?(?:\\\\w+)\\\\s+(${escapedName})\\\\s*\\\\(`);\n match = returnTypeRegex.exec(line);\n }\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The predicate name is in capture group 1\n const predicateNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = predicateNameStart + 1; // 1-based column numbering\n const end_col = start_col + predicateName.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find predicate position tool with the MCP server\n */\nexport function registerFindPredicatePositionTool(server: McpServer): void {\n server.tool(\n 'find_predicate_position',\n 'Finds startline, startcol, endline endcol of a predicate for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the predicate to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findPredicatePosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding predicate position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find query files tool\n * Discovers and tracks all files related to a CodeQL query\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { findCodeQLQueryFiles } from '../../lib/query-file-finder';\nimport { logger } from '../../utils/logger';\n\n/**\n * Register the find_codeql_query_files tool\n */\nexport function registerFindCodeQLQueryFilesTool(server: McpServer): void {\n server.tool(\n 'find_codeql_query_files',\n 'Find and track all files and directories related to a CodeQL query, including resolved metadata',\n {\n queryPath: z.string().describe('Path to the CodeQL query file (.ql)'),\n language: z.string().optional().describe('Programming language (optional, will be inferred if not provided)'),\n resolveMetadata: z.boolean().optional().describe('Whether to resolve query metadata (default: true)')\n },\n async ({ queryPath, language, resolveMetadata }) => {\n try {\n const result = await findCodeQLQueryFiles(\n queryPath,\n language,\n resolveMetadata !== false // Default to true if not specified\n );\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]\n };\n } catch (error) {\n logger.error('Error finding CodeQL query files:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }\n ],\n isError: true\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query file finder utilities\n * Handles discovery and tracking of query-related files and directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { QueryFileInfo, QueryFilesResult } from '../types/codeql';\nimport { resolveQueryMetadata } from './metadata-resolver';\n\n// Supported CodeQL languages and their file extensions (alphabetically ordered)\nconst LANGUAGE_EXTENSIONS: Record = {\n actions: 'yml',\n cpp: 'cpp',\n csharp: 'cs',\n go: 'go',\n java: 'java',\n javascript: 'js',\n python: 'py',\n ruby: 'rb',\n swift: 'swift',\n typescript: 'ts'\n};\n\nconst KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS);\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n return LANGUAGE_EXTENSIONS[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Infer the language from the query file's directory structure\n */\nfunction inferLanguageFromPath(queryPath: string): string {\n const parts = queryPath.split(path.sep);\n\n for (const part of parts) {\n if (KNOWN_LANGUAGES.includes(part.toLowerCase())) {\n return part.toLowerCase();\n }\n }\n\n // Default fallback\n return 'unknown';\n}\n\n/**\n * Find the nearest qlpack.yml or codeql-pack.yml file by walking up the directory tree\n */\nfunction findNearestQlpack(startPath: string): string | null {\n let currentPath = startPath;\n const root = path.parse(currentPath).root;\n\n while (currentPath !== root) {\n // Check for codeql-pack.yml first (newer format), then qlpack.yml\n for (const packFile of ['codeql-pack.yml', 'qlpack.yml']) {\n const packPath = path.join(currentPath, packFile);\n if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) {\n return packPath;\n }\n }\n currentPath = path.dirname(currentPath);\n }\n\n return null;\n}\n\n/**\n * Read and parse qlpack.yml file\n */\nfunction readQlpackMetadata(qlpackPath: string): Record | null {\n try {\n const content = fs.readFileSync(qlpackPath, 'utf-8');\n const parsed = yaml.load(content) as Record;\n return parsed;\n } catch (_error) {\n // If we can't parse it, return null rather than failing\n return null;\n }\n}\n\n/**\n * Check if a file exists and return QueryFileInfo\n */\nfunction checkFile(filePath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n return {\n exists,\n path: filePath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: filePath // Return the path even on error\n };\n }\n}\n\n/**\n * Check if a directory exists and return QueryFileInfo\n */\nfunction checkDirectory(dirPath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n return {\n exists,\n path: dirPath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: dirPath // Return the path even on error\n };\n }\n}\n\n/**\n * Find all test code files in the test directory\n */\nfunction findTestCodeFiles(testDir: string, queryName: string, language: string): string[] {\n if (!fs.existsSync(testDir)) {\n return [];\n }\n\n try {\n const files = fs.readdirSync(testDir);\n const languageExt = getLanguageExtension(language);\n const testFiles: string[] = [];\n\n // Look for files matching the query name or other test code files\n const allValidExtensions = [...new Set([...Object.values(LANGUAGE_EXTENSIONS), 'yaml'])]; // Include yaml as alias for yml\n\n for (const file of files) {\n const filePath = path.join(testDir, file);\n const stat = fs.statSync(filePath);\n\n if (stat.isFile()) {\n // Include the primary test file matching query name\n if (file === `${queryName}.${languageExt}`) {\n testFiles.push(filePath);\n }\n // Include other code files (but not .qlref, .expected, .actual files)\n else if (!file.endsWith('.qlref') && !file.endsWith('.expected') && !file.endsWith('.actual')) {\n const ext = path.extname(file).slice(1);\n if (ext === languageExt || allValidExtensions.includes(ext)) {\n testFiles.push(filePath);\n }\n }\n }\n }\n\n return testFiles;\n } catch {\n return [];\n }\n}\n\n/**\n * Find CodeQL query files and directories based on a query file path\n * Optionally resolves metadata if the query file exists\n */\nexport async function findCodeQLQueryFiles(\n queryFilePath: string,\n language?: string,\n resolveMetadata: boolean = true\n): Promise {\n // Resolve absolute path\n const absoluteQueryPath = path.resolve(queryFilePath);\n\n // Extract query name and directory\n const queryName = path.basename(absoluteQueryPath, '.ql');\n const queryDir = path.dirname(absoluteQueryPath);\n\n // Infer language if not provided\n const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath);\n\n // Check query file itself\n const queryPath = checkFile(absoluteQueryPath);\n const queryDirectory = checkDirectory(queryDir);\n\n // Check for documentation files\n const mdPath = path.join(queryDir, `${queryName}.md`);\n const qhelpPath = path.join(queryDir, `${queryName}.qhelp`);\n const mdInfo = checkFile(mdPath);\n const qhelpInfo = checkFile(qhelpPath);\n\n const documentationPath: QueryFileInfo = mdInfo.exists ? mdInfo : (qhelpInfo.exists ? qhelpInfo : {\n exists: false,\n path: mdPath // Suggest .md as the default\n });\n\n // Check for specification file\n const qspecPath = path.join(queryDir, `${queryName}.qspec`);\n const specificationPath = checkFile(qspecPath);\n\n // Determine test directory\n // Pattern: if query is in .../src/QueryName/, test should be in .../test/QueryName/\n let testDir: string;\n if (queryDir.includes(`${path.sep}src${path.sep}`)) {\n // Find the last occurrence of /src/ and replace it with /test/\n const parts = queryDir.split(path.sep);\n const srcIndex = parts.lastIndexOf('src');\n if (srcIndex !== -1) {\n parts[srcIndex] = 'test';\n testDir = parts.join(path.sep);\n } else {\n // Fallback in case split didn't find it\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n } else {\n // Fallback: if not in src directory, construct test dir based on parent\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n const testDirectory = checkDirectory(testDir);\n\n // Check for .qlref file\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const qlrefInfo = checkFile(qlrefPath);\n\n // Find test code files\n const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage);\n\n // Check for expected results\n const expectedPath = path.join(testDir, `${queryName}.expected`);\n const expectedResultsPath = checkFile(expectedPath);\n\n // Check for actual results\n const actualPath = path.join(testDir, `${queryName}.actual`);\n const actualResultsPath = checkFile(actualPath);\n\n // Check for test database\n const testprojPath = path.join(testDir, `${queryName}.testproj`);\n const testDatabasePath = checkDirectory(testprojPath);\n\n // Determine missing files\n const missingFiles: string[] = [];\n if (!queryPath.exists) missingFiles.push(queryPath.path);\n if (!documentationPath.exists) missingFiles.push(documentationPath.path);\n if (!specificationPath.exists) missingFiles.push(specificationPath.path);\n if (!testDirectory.exists) missingFiles.push(testDirectory.path);\n if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path);\n if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`));\n if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path);\n\n const allFilesExist = missingFiles.length === 0;\n\n // Resolve metadata if requested and query file exists\n let metadata: { [key: string]: string | string[] } | undefined;\n if (resolveMetadata && queryPath.exists) {\n const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath);\n if (resolvedMetadata) {\n metadata = resolvedMetadata;\n }\n }\n\n // Resolve pack metadata and directories by finding the nearest qlpack.yml files\n let packMetadata: Record | undefined;\n const queryPackPath = findNearestQlpack(queryDir);\n const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir;\n if (queryPackPath) {\n const parsed = readQlpackMetadata(queryPackPath);\n if (parsed) {\n packMetadata = parsed;\n }\n }\n\n // Find pack directory for test files\n const testPackPath = findNearestQlpack(testDir);\n const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir;\n\n return {\n queryName,\n language: detectedLanguage,\n\n allFilesExist,\n\n files: {\n query: {\n dir: queryDirectory.path,\n doc: path.basename(documentationPath.path),\n packDir: queryPackDir,\n query: path.basename(queryPath.path),\n spec: path.basename(specificationPath.path)\n },\n test: {\n actual: path.basename(actualResultsPath.path),\n dir: testDirectory.path,\n expected: path.basename(expectedResultsPath.path),\n packDir: testPackDir,\n qlref: path.basename(qlrefInfo.path),\n testCode: testCodePaths,\n testDatabaseDir: testDatabasePath.path\n }\n },\n\n metadata,\n\n missingFiles,\n\n packMetadata,\n\n status: {\n actualResultsExist: actualResultsPath.exists,\n documentationExists: documentationPath.exists,\n expectedResultsExist: expectedResultsPath.exists,\n hasTestCode: testCodePaths.length > 0,\n qlrefExists: qlrefInfo.exists,\n queryExists: queryPath.exists,\n specificationExists: specificationPath.exists,\n testDatabaseDirExists: testDatabasePath.exists,\n testDirectoryExists: testDirectory.exists\n }\n };\n}\n", "\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n", "/**\n * CodeQL metadata resolver utilities\n * Handles resolution of query metadata using the CodeQL CLI\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * Query metadata structure returned by codeql resolve metadata\n */\nexport interface QueryMetadata {\n [key: string]: string | string[];\n}\n\n/**\n * Resolve metadata for a CodeQL query file\n * @param queryPath - Absolute or relative path to the .ql query file\n * @returns Parsed metadata object or null if resolution fails\n */\nexport async function resolveQueryMetadata(queryPath: string): Promise {\n try {\n logger.info(`Resolving metadata for query: ${queryPath}`);\n\n const result = await executeCodeQLCommand(\n 'resolve metadata',\n { format: 'json' },\n [queryPath]\n );\n\n if (!result.success) {\n logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error);\n return null;\n }\n\n // Parse the JSON output\n try {\n const metadata = JSON.parse(result.stdout);\n return metadata;\n } catch (parseError) {\n logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError);\n return null;\n }\n } catch (error) {\n logger.error(`Error resolving metadata for ${queryPath}:`, error);\n return null;\n }\n}\n", "/**\n * CodeQL generate log-summary tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateLogSummaryTool: CLIToolDefinition = {\n name: 'codeql_generate_log-summary',\n description: 'Create a summary of a structured JSON evaluator event log file',\n command: 'codeql',\n subcommand: 'generate log-summary',\n inputSchema: {\n inputLog: z.string().describe('Path to the evaluator log file to summarize'),\n outputFile: z.string().optional().describe('Path to write the summary (optional, defaults to stdout)'),\n format: z.enum(['text', 'predicates', 'overall']).optional()\n .describe('Output format: text (human-readable), predicates (JSON), or overall (stats)'),\n 'minify-output': z.boolean().optional().describe('Minify JSON output'),\n utc: z.boolean().optional().describe('Force UTC timestamps'),\n 'deduplicate-stage-summaries': z.boolean().optional().describe('Deduplicate stage summaries'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt',\n 'codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt',\n 'codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL generate query-help tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateQueryHelpTool: CLIToolDefinition = {\n name: 'codeql_generate_query-help',\n description: 'Generate query help documentation from QLDoc comments',\n command: 'codeql',\n subcommand: 'generate query-help',\n inputSchema: {\n query: z.string().describe('Path to the query file to generate help for'),\n outputFile: z.string().optional().describe('Path to write the help documentation'),\n format: z.enum(['markdown', 'text', 'html']).optional()\n .describe('Output format for the help documentation'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate query-help -- MyQuery.ql',\n 'codeql generate query-help --format=markdown -- MyQuery.ql help.md',\n 'codeql generate query-help --format=html -- MyQuery.ql help.html'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL Language Server Eval tool for MCP server\n * Provides real-time QL code validation through LSP communication\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { CodeQLLanguageServer, Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\n// Global language server instance for reuse across evaluations\nlet globalLanguageServer: CodeQLLanguageServer | null = null;\n\nexport interface LanguageServerEvalParams {\n qlCode: string;\n workspaceUri?: string;\n serverOptions?: LanguageServerOptions;\n}\n\nexport interface LanguageServerEvalResult {\n isValid: boolean;\n diagnostics: Diagnostic[];\n summary: {\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n };\n formattedOutput: string;\n}\n\n/**\n * Format diagnostics for human-readable output\n */\nfunction formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '\u2705 No issues found in QL code';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${diagnostics.length} issue(s):\\n`);\n\n diagnostics.forEach((diagnostic, index) => {\n const severityIcon = getSeverityIcon(diagnostic.severity);\n const severityName = getSeverityName(diagnostic.severity);\n const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`;\n \n lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`);\n lines.push(` ${diagnostic.message}`);\n if (diagnostic.source) {\n lines.push(` Source: ${diagnostic.source}`);\n }\n if (diagnostic.code) {\n lines.push(` Code: ${diagnostic.code}`);\n }\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n\nfunction getSeverityIcon(severity: number): string {\n switch (severity) {\n case 1: return '\u274C'; // Error\n case 2: return '\u26A0\uFE0F'; // Warning\n case 3: return '\u2139\uFE0F'; // Information\n case 4: return '\uD83D\uDCA1'; // Hint\n default: return '\u2753';\n }\n}\n\nfunction getSeverityName(severity: number): string {\n switch (severity) {\n case 1: return 'Error';\n case 2: return 'Warning';\n case 3: return 'Information';\n case 4: return 'Hint';\n default: return 'Unknown';\n }\n}\n\n/**\n * Initialize or get existing language server instance\n */\nasync function getLanguageServer(options: LanguageServerOptions = {}): Promise {\n if (globalLanguageServer && globalLanguageServer.isRunning()) {\n return globalLanguageServer;\n }\n\n // Set default options \u2014 use packageRootDir instead of process.cwd()\n // so the QL search path works regardless of where the server is launched.\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n const defaultOptions: LanguageServerOptions = {\n searchPath: resolve(pkgRoot, 'ql'),\n loglevel: 'WARN',\n ...options\n };\n\n globalLanguageServer = new CodeQLLanguageServer(defaultOptions);\n \n try {\n await globalLanguageServer.start();\n \n // Use provided workspace URI or default to ql directory under package root\n const workspaceUri = pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await globalLanguageServer.initialize(workspaceUri);\n \n logger.info('CodeQL Language Server started and initialized successfully');\n return globalLanguageServer;\n } catch (error) {\n logger.error('Failed to start language server:', error);\n globalLanguageServer = null;\n throw error;\n }\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server\n */\nexport async function evaluateQLCode({\n qlCode,\n workspaceUri: _workspaceUri,\n serverOptions = {}\n}: LanguageServerEvalParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n \n const languageServer = await getLanguageServer(serverOptions);\n \n // Generate unique URI for this evaluation\n const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href;\n \n const diagnostics = await languageServer.evaluateQL(qlCode, evalUri);\n \n // Count diagnostics by severity\n const summary = {\n errorCount: diagnostics.filter(d => d.severity === 1).length,\n warningCount: diagnostics.filter(d => d.severity === 2).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n hintCount: diagnostics.filter(d => d.severity === 4).length\n };\n \n const isValid = summary.errorCount === 0;\n const formattedOutput = formatDiagnostics(diagnostics);\n \n logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`);\n \n return {\n isValid,\n diagnostics,\n summary,\n formattedOutput\n };\n \n } catch (error) {\n logger.error('Error evaluating QL code:', error);\n throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Shutdown the global language server\n */\nexport async function shutdownLanguageServer(): Promise {\n if (globalLanguageServer) {\n logger.info('Shutting down CodeQL Language Server...');\n await globalLanguageServer.shutdown();\n globalLanguageServer = null;\n }\n}\n\n/**\n * Register the language server eval tool with the MCP server\n */\nexport function registerLanguageServerEvalTool(server: McpServer): void {\n server.tool(\n 'codeql_language_server_eval',\n 'Authoritative syntax and semantic validation of CodeQL (QL) code via the CodeQL Language Server. Compiles the query and provides real-time diagnostics with precise error locations. Use this for accurate validation; for quick heuristic checks without compilation, use validate_codeql_query instead.',\n {\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level')\n },\n async ({ ql_code, workspace_uri, search_path, log_level }) => {\n try {\n const serverOptions: LanguageServerOptions = {};\n \n if (search_path) {\n serverOptions.searchPath = search_path;\n }\n if (log_level) {\n serverOptions.loglevel = log_level;\n }\n \n const result = await evaluateQLCode({\n qlCode: ql_code,\n workspaceUri: workspace_uri,\n serverOptions\n });\n \n // Return structured result\n const responseContent = {\n isValid: result.isValid,\n summary: result.summary,\n formattedOutput: result.formattedOutput,\n diagnostics: result.diagnostics.map(d => ({\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n severity: getSeverityName(d.severity),\n message: d.message,\n code: d.code,\n source: d.source\n }))\n };\n \n return {\n content: [\n { \n type: 'text', \n text: JSON.stringify(responseContent, null, 2) \n }\n ],\n };\n \n } catch (error) {\n logger.error('Error in language server eval tool:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n \n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownLanguageServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownLanguageServer();\n });\n}", "/**\n * CodeQL Language Server manager for LSP communication\n * Manages the lifecycle and communication with the CodeQL language server process\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { setTimeout, clearTimeout } from 'timers';\nimport { pathToFileURL } from 'url';\nimport { delimiter, join } from 'path';\nimport { logger } from '../utils/logger';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\n\nexport interface LSPMessage {\n jsonrpc: '2.0';\n id?: number | string;\n method: string;\n params?: unknown;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport interface Diagnostic {\n range: {\n start: { line: number; character: number };\n end: { line: number; character: number };\n };\n severity: number; // 1=Error, 2=Warning, 3=Information, 4=Hint\n source?: string;\n message: string;\n code?: string | number;\n}\n\nexport interface PublishDiagnosticsParams {\n uri: string;\n diagnostics: Diagnostic[];\n}\n\nexport interface LanguageServerOptions {\n searchPath?: string;\n logdir?: string;\n loglevel?: 'OFF' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'ALL';\n synchronous?: boolean;\n verbosity?: 'errors' | 'warnings' | 'progress' | 'progress+' | 'progress++' | 'progress+++';\n}\n\nexport class CodeQLLanguageServer extends EventEmitter {\n private server: ChildProcess | null = null;\n private messageId = 1;\n private pendingResponses = new Map void; reject: (_error: Error) => void }>();\n private isInitialized = false;\n private messageBuffer = '';\n\n constructor(private _options: LanguageServerOptions = {}) {\n super();\n }\n\n async start(): Promise {\n if (this.server) {\n throw new Error('Language server is already running');\n }\n\n logger.info('Starting CodeQL Language Server...');\n\n const args = [\n 'execute', 'language-server',\n '--check-errors=ON_CHANGE'\n ];\n\n // Add optional arguments\n if (this._options.searchPath) {\n args.push(`--search-path=${this._options.searchPath}`);\n }\n if (this._options.logdir) {\n args.push(`--logdir=${this._options.logdir}`);\n }\n if (this._options.loglevel) {\n args.push(`--loglevel=${this._options.loglevel}`);\n }\n if (this._options.synchronous) {\n args.push('--synchronous');\n }\n if (this._options.verbosity) {\n args.push(`--verbosity=${this._options.verbosity}`);\n }\n\n // Build environment with CODEQL_PATH directory prepended to PATH\n // (mirrors the approach in cli-executor.ts getSafeEnvironment).\n const spawnEnv = { ...process.env };\n const codeqlDir = getResolvedCodeQLDir();\n if (codeqlDir && spawnEnv.PATH) {\n spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`;\n } else if (codeqlDir) {\n spawnEnv.PATH = codeqlDir;\n }\n\n this.server = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv\n });\n\n this.server.stderr?.on('data', (data) => {\n logger.debug('CodeQL LS stderr:', data.toString());\n });\n\n this.server.stdout?.on('data', (data) => {\n this.handleStdout(data);\n });\n\n this.server.on('error', (error) => {\n logger.error('CodeQL Language Server error:', error);\n this.emit('error', error);\n });\n\n this.server.on('exit', (code) => {\n logger.info('CodeQL Language Server exited with code:', code);\n this.server = null;\n this.isInitialized = false;\n this.emit('exit', code);\n });\n\n // Wait for server to be ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n private handleStdout(data: Buffer): void {\n this.messageBuffer += data.toString();\n \n let headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n while (headerEnd !== -1) {\n const header = this.messageBuffer.substring(0, headerEnd);\n const contentLengthMatch = header.match(/Content-Length: (\\d+)/);\n \n if (contentLengthMatch) {\n const contentLength = parseInt(contentLengthMatch[1]);\n const messageStart = headerEnd + 4;\n const messageEnd = messageStart + contentLength;\n \n if (this.messageBuffer.length >= messageEnd) {\n const messageContent = this.messageBuffer.substring(messageStart, messageEnd);\n this.messageBuffer = this.messageBuffer.substring(messageEnd);\n \n try {\n const message: LSPMessage = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse LSP message:', error, messageContent);\n }\n \n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid LSP header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: LSPMessage): void {\n logger.debug('Received LSP message:', message);\n\n // Handle responses to our requests\n if (message.id !== undefined && this.pendingResponses.has(Number(message.id))) {\n const pending = this.pendingResponses.get(Number(message.id))!;\n this.pendingResponses.delete(Number(message.id));\n \n if (message.error) {\n pending.reject(new Error(`LSP Error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications from server\n if (message.method === 'textDocument/publishDiagnostics') {\n this.emit('diagnostics', message.params as PublishDiagnosticsParams);\n }\n }\n\n private sendMessage(message: LSPMessage): void {\n if (!this.server?.stdin) {\n throw new Error('Language server is not running');\n }\n\n const messageStr = JSON.stringify(message);\n const contentLength = Buffer.byteLength(messageStr, 'utf8');\n const header = `Content-Length: ${contentLength}\\r\\n\\r\\n`;\n const fullMessage = header + messageStr;\n\n logger.debug('Sending LSP message:', fullMessage);\n this.server.stdin.write(fullMessage);\n }\n\n private sendRequest(method: string, params?: unknown): Promise {\n const id = this.messageId++;\n const message: LSPMessage = {\n jsonrpc: '2.0',\n id,\n method,\n params\n };\n\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n this.sendMessage(message);\n \n // Add timeout\n setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 10000); // 10 second timeout\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n const message: LSPMessage = {\n jsonrpc: '2.0',\n method,\n params\n };\n this.sendMessage(message);\n }\n\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n return;\n }\n\n logger.info('Initializing CodeQL Language Server...');\n\n const initParams = {\n processId: process.pid,\n clientInfo: {\n name: 'codeql-development-mcp-server',\n version: '2.23.9'\n },\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n didClose: true\n },\n publishDiagnostics: {}\n }\n }\n };\n\n if (workspaceUri) {\n (initParams as unknown as { workspaceFolders: unknown[] }).workspaceFolders = [{\n uri: workspaceUri,\n name: 'codeql-workspace'\n }];\n }\n\n await this.sendRequest('initialize', initParams);\n this.sendNotification('initialized', {});\n \n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n async evaluateQL(qlCode: string, uri?: string): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n\n // Default to a project-local virtual URI rather than /tmp\n const documentUri = uri || pathToFileURL(join(getProjectTmpDir('lsp-eval'), 'eval.ql')).href;\n\n return new Promise((resolve, reject) => {\n let diagnosticsReceived = false;\n const timeout = setTimeout(() => {\n if (!diagnosticsReceived) {\n this.removeAllListeners('diagnostics');\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 5000);\n\n // Listen for diagnostics\n const diagnosticsHandler = (params: PublishDiagnosticsParams) => {\n if (params.uri === documentUri) {\n diagnosticsReceived = true;\n clearTimeout(timeout);\n this.removeListener('diagnostics', diagnosticsHandler);\n\n // Close the document\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri: documentUri }\n });\n\n resolve(params.diagnostics);\n }\n };\n\n this.on('diagnostics', diagnosticsHandler);\n\n // Open the document with the QL code\n this.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri: documentUri,\n languageId: 'ql',\n version: 1,\n text: qlCode\n }\n });\n });\n }\n\n async shutdown(): Promise {\n if (!this.server) {\n return;\n }\n\n logger.info('Shutting down CodeQL Language Server...');\n\n try {\n await this.sendRequest('shutdown', {});\n this.sendNotification('exit', {});\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n }, 1000);\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL pack install tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackInstallTool: CLIToolDefinition = {\n name: 'codeql_pack_install',\n description: 'Install CodeQL pack dependencies',\n command: 'codeql',\n subcommand: 'pack install',\n inputSchema: {\n packDir: z.string().optional().describe('Directory containing qlpack.yml (default: current)'),\n force: z.boolean().optional().describe('Force reinstall of dependencies'),\n 'no-strict-mode': z.boolean().optional()\n .describe('Allow non-strict dependency resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack install',\n 'codeql pack install --force /path/to/pack',\n 'codeql pack install --no-strict-mode'\n ]\n};", "/**\n * CodeQL pack ls tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackLsTool: CLIToolDefinition = {\n name: 'codeql_pack_ls',\n description: 'List CodeQL packs under some local directory path',\n command: 'codeql',\n subcommand: 'pack ls',\n inputSchema: {\n dir: z.string().optional().describe('The root directory of the package or workspace, defaults to the current working directory'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format: text (default) or json'),\n groups: z.string().optional()\n .describe('List of CodeQL pack groups to include or exclude'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack ls -- .',\n 'codeql pack ls --format=json -- /path/to/pack-directory',\n 'codeql pack ls --format=json --groups=queries,tests -- .'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL query profiling tool\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand } from '../../lib/cli-executor';\nimport { logger } from '../../utils/logger';\nimport { writeFileSync, readFileSync, existsSync } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { mkdirSync } from 'fs';\n\ninterface EvaluatorLogEvent {\n time: string;\n type: string;\n eventId: number;\n nanoTime: number;\n [key: string]: unknown;\n}\n\ninterface PipelineNode {\n eventId: number;\n name: string;\n position?: string;\n type?: string;\n startTime: number;\n endTime: number;\n duration: number;\n resultSize?: number;\n tupleCount?: number;\n dependencies: string[];\n dependencyEventIds: number[];\n}\n\ninterface ProfileData {\n queryName: string;\n totalDuration: number;\n totalEvents: number;\n pipelines: PipelineNode[];\n}\n\n/**\n * Parse evaluator log and create profile data\n */\nfunction parseEvaluatorLog(logPath: string): ProfileData {\n const logContent = readFileSync(logPath, 'utf-8');\n \n // Split by empty lines to get each JSON object (handles both JSONL and pretty-printed JSON)\n const jsonObjects = logContent.split('\\n\\n').filter((s) => s.trim());\n const events: EvaluatorLogEvent[] = jsonObjects\n .map((obj) => {\n try {\n return JSON.parse(obj);\n } catch (_error) {\n logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`);\n return null;\n }\n })\n .filter((event): event is EvaluatorLogEvent => event !== null);\n\n // Map to track pipeline nodes by their start event ID\n const pipelineMap = new Map>();\n // Map to track dependency event IDs by predicate name\n const predicateNameToEventId = new Map();\n \n let queryName = '';\n let queryStartTime = 0;\n let queryEndTime = 0;\n\n for (const event of events) {\n switch (event.type) {\n case 'QUERY_STARTED':\n queryName = (event.queryName as string) || '';\n queryStartTime = event.nanoTime;\n break;\n\n case 'QUERY_COMPLETED':\n queryEndTime = event.nanoTime;\n break;\n\n case 'PREDICATE_STARTED': {\n const predicateName = event.predicateName as string;\n const position = event.position as string | undefined;\n const predicateType = event.predicateType as string | undefined;\n const dependencies = event.dependencies as Record | undefined;\n \n // Track this predicate's event ID by name for dependency resolution\n predicateNameToEventId.set(predicateName, event.eventId);\n \n // Get dependency event IDs\n const dependencyEventIds: number[] = [];\n const dependencyNames: string[] = [];\n if (dependencies) {\n for (const depName of Object.keys(dependencies)) {\n dependencyNames.push(depName);\n const depEventId = predicateNameToEventId.get(depName);\n if (depEventId !== undefined) {\n dependencyEventIds.push(depEventId);\n }\n }\n }\n\n pipelineMap.set(event.eventId, {\n eventId: event.eventId,\n name: predicateName,\n position,\n type: predicateType,\n startTime: event.nanoTime,\n dependencies: dependencyNames,\n dependencyEventIds,\n });\n break;\n }\n\n case 'PREDICATE_COMPLETED': {\n const startEventId = event.startEvent as number;\n const pipelineInfo = pipelineMap.get(startEventId);\n if (pipelineInfo) {\n const startEvent = events.find((e) => e.eventId === startEventId);\n if (startEvent) {\n const duration = (event.nanoTime - startEvent.nanoTime) / 1_000_000; // Convert to ms\n pipelineInfo.endTime = event.nanoTime;\n pipelineInfo.duration = duration;\n pipelineInfo.resultSize = event.resultSize as number | undefined;\n pipelineInfo.tupleCount = event.tupleCount as number | undefined;\n }\n }\n break;\n }\n }\n }\n\n // Convert to array and maintain original evaluation order (by eventId)\n const pipelines: PipelineNode[] = Array.from(pipelineMap.values())\n .filter((p): p is PipelineNode => p.duration !== undefined)\n .sort((a, b) => a.eventId - b.eventId);\n\n const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1_000_000 : 0;\n\n return {\n queryName,\n totalDuration,\n totalEvents: events.length,\n pipelines,\n };\n}\n\n/**\n * Format profile data as JSON\n */\nfunction formatAsJson(profile: ProfileData): string {\n return JSON.stringify(profile, null, 2);\n}\n\n/**\n * Format profile data as Mermaid diagram\n * Creates a graph showing the query evaluation pipelines in order of execution\n * with dependencies as edges, annotated with duration and result sizes\n */\nfunction formatAsMermaid(profile: ProfileData): string {\n const lines: string[] = [];\n\n lines.push('```mermaid');\n lines.push('graph TD');\n lines.push('');\n \n // Add query root node\n lines.push(` QUERY[\"${basename(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms\"]`);\n lines.push('');\n \n // Create nodes for each pipeline in evaluation order (already sorted by eventId)\n profile.pipelines.forEach((pipeline) => {\n const nodeId = `P${pipeline.eventId}`;\n const duration = pipeline.duration.toFixed(2);\n const resultSize = pipeline.resultSize !== undefined ? pipeline.resultSize : '?';\n // Sanitize predicate name for Mermaid\n const name = pipeline.name.replace(/[<>]/g, '').substring(0, 40);\n lines.push(` ${nodeId}[\"${name}
${duration}ms | ${resultSize} results\"]`);\n });\n \n lines.push('');\n \n // Add edges from QUERY to root pipelines (those with no dependencies)\n const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0);\n \n rootPipelines.forEach((pipeline) => {\n lines.push(` QUERY --> P${pipeline.eventId}`);\n });\n \n lines.push('');\n \n // Add edges between pipelines based on dependencies (using eventIds to preserve links)\n profile.pipelines.forEach((pipeline) => {\n pipeline.dependencyEventIds.forEach((depEventId) => {\n const duration = pipeline.duration.toFixed(2);\n lines.push(` P${depEventId} -->|\"${duration}ms\"| P${pipeline.eventId}`);\n });\n });\n \n lines.push('');\n lines.push(' classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px');\n lines.push(' classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px');\n lines.push(' class QUERY query');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Register the profile_codeql_query tool\n */\nexport function registerProfileCodeQLQueryTool(server: McpServer): void {\n server.tool(\n 'profile_codeql_query',\n 'Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file',\n {\n query: z.string().describe('Path to the .ql query file'),\n database: z.string().describe('Path to the CodeQL database directory'),\n evaluatorLog: z\n .string()\n .optional()\n .describe(\n 'Path to an existing structured JSON log (e.g., evaluator-log.jsonl) file. If not provided, the tool will run the query to generate one.'\n ),\n outputDir: z\n .string()\n .optional()\n .describe('Directory to write profiling data files (defaults to same directory as evaluator log)'),\n },\n async (params) => {\n try {\n const { query, database, evaluatorLog, outputDir } = params;\n let logPath = evaluatorLog;\n let bqrsPath: string | undefined;\n let sarifPath: string | undefined;\n\n // If evaluator log not provided, run the query to generate one\n if (!logPath) {\n logger.info('No evaluator log provided, running query to generate one');\n\n // Determine output directory\n const defaultOutputDir = outputDir || join(dirname(query as string), 'profile-output');\n mkdirSync(defaultOutputDir, { recursive: true });\n\n logPath = join(defaultOutputDir, 'evaluator-log.jsonl');\n bqrsPath = join(defaultOutputDir, 'query-results.bqrs');\n sarifPath = join(defaultOutputDir, 'query-results.sarif');\n\n // Run query with evaluator logging and tuple counting\n const queryResult = await executeCodeQLCommand(\n 'query run',\n {\n database: database as string,\n output: bqrsPath,\n 'evaluator-log': logPath,\n 'tuple-counting': true,\n 'evaluator-log-level': 5,\n },\n [query as string]\n );\n\n if (!queryResult.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to run query: ${queryResult.stderr || queryResult.error}`,\n },\n ],\n isError: true,\n };\n }\n\n // Generate SARIF interpretation\n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n\n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n }\n\n // Verify evaluator log exists\n if (!existsSync(logPath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Evaluator log not found at: ${logPath}`,\n },\n ],\n isError: true,\n };\n }\n\n // Parse the evaluator log\n logger.info(`Parsing evaluator log from: ${logPath}`);\n const profile = parseEvaluatorLog(logPath);\n\n // Determine output directory for profile\n const profileOutputDir = outputDir || dirname(logPath);\n mkdirSync(profileOutputDir, { recursive: true });\n\n // Write profile JSON file\n const jsonPath = join(profileOutputDir, 'query-evaluation-profile.json');\n const jsonContent = formatAsJson(profile);\n writeFileSync(jsonPath, jsonContent);\n logger.info(`Profile JSON written to: ${jsonPath}`);\n\n // Write profile Mermaid diagram file\n const mdPath = join(profileOutputDir, 'query-evaluation-profile.md');\n const mdContent = formatAsMermaid(profile);\n writeFileSync(mdPath, mdContent);\n logger.info(`Profile Mermaid diagram written to: ${mdPath}`);\n\n // Build response message\n const outputFiles: string[] = [\n `Profile JSON: ${jsonPath}`,\n `Profile Mermaid: ${mdPath}`,\n `Evaluator Log: ${logPath}`,\n ];\n\n if (bqrsPath) {\n outputFiles.push(`Query Results (BQRS): ${bqrsPath}`);\n }\n\n if (sarifPath && existsSync(sarifPath)) {\n outputFiles.push(`Query Results (SARIF): ${sarifPath}`);\n }\n\n const responseText = [\n 'Query profiling completed successfully!',\n '',\n 'Output Files:',\n ...outputFiles.map((f) => ` - ${f}`),\n '',\n 'Profile Summary:',\n ` - Query: ${basename(profile.queryName)}`,\n ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`,\n ` - Total Pipelines: ${profile.pipelines.length}`,\n ` - Total Events: ${profile.totalEvents}`,\n '',\n 'First 5 Pipeline Nodes (in evaluation order):',\n ...profile.pipelines.slice(0, 5).map((p, idx) => {\n return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || '?'} results)`;\n }),\n ].join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n };\n } catch (error) {\n logger.error('Error profiling CodeQL query:', error);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query compile tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryCompileTool: CLIToolDefinition = {\n name: 'codeql_query_compile',\n description: 'Compile and validate CodeQL queries',\n command: 'codeql',\n subcommand: 'query compile',\n inputSchema: {\n query: z.string().describe('Path to the CodeQL query file (.ql)'),\n database: z.string().optional().describe('Path to the CodeQL database'),\n library: z.string().optional().describe('Path to query library'),\n output: z.string().optional().describe('Output file path'),\n warnings: z.enum(['hide', 'show', 'error']).optional()\n .describe('How to handle compilation warnings'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql query compile --database=/path/to/db MyQuery.ql',\n 'codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql'\n ]\n};", "/**\n * CodeQL query format tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Custom result processor for codeql query format tool\n * Exit code 1 with --check-only means \"file would change\" - this is success for format checking\n */\nfunction formatResultProcessor(result: CLIExecutionResult, params: Record): string {\n const isCheckOnly = params['check-only'];\n const hasFormatChanges = result.exitCode === 1;\n \n if (isCheckOnly && hasFormatChanges) {\n // Mark as success for the CLI tool registry since detecting format changes is the intended behavior\n result.success = true;\n return result.stdout || result.stderr || 'File would change by autoformatting.';\n }\n \n return defaultCLIResultProcessor(result, params);\n}\n\nexport const codeqlQueryFormatTool: CLIToolDefinition = {\n name: 'codeql_query_format',\n description: 'Automatically format CodeQL source code files',\n command: 'codeql',\n subcommand: 'query format',\n inputSchema: {\n files: z.array(z.string()).describe('One or more .ql or .qll source files to format'),\n output: z.string().optional().describe('Write formatted code to this file instead of stdout'),\n 'in-place': z.boolean().optional().describe('Overwrite each input file with formatted version'),\n 'check-only': z.boolean().optional().describe('Check formatting without writing output'),\n backup: z.string().optional().describe('Backup extension when overwriting existing files'),\n 'no-syntax-errors': z.boolean().optional().describe('Ignore syntax errors and pretend file is formatted'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query format -i -- ExampleQuery.ql',\n 'codeql query format --in-place -- queries/*.ql',\n 'codeql query format --check-only -- queries/*.ql'\n ],\n resultProcessor: formatResultProcessor\n};", "/**\n * CodeQL query run tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryRunTool: CLIToolDefinition = {\n name: 'codeql_query_run',\n description: 'Execute a CodeQL query against a database. Use either \"query\" parameter for direct file path OR \"queryName\" + \"queryLanguage\" for pre-defined tool queries.',\n command: 'codeql',\n subcommand: 'query run',\n inputSchema: {\n query: z.string().optional().describe('Path to the CodeQL query file (.ql) - cannot be used with queryName'),\n queryName: z.string().optional().describe('Name of pre-defined query to run (e.g., \"PrintAST\", \"CallGraphFrom\", \"CallGraphTo\") - requires queryLanguage'),\n queryLanguage: z.string().optional().describe('Programming language for tools queries (e.g., \"javascript\", \"java\", \"python\") - required when using queryName'),\n queryPack: z.string().optional().describe('Query pack path (defaults to server/ql//tools/src/ for tool queries)'),\n sourceFiles: z.string().optional().describe('Comma-separated list of source file paths for PrintAST queries (e.g., \"src/main.js,src/utils.js\" or just \"main.js\")'),\n sourceFunction: z.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., \"main,processData\")'),\n targetFunction: z.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., \"helper,validateInput\")'),\n database: createCodeQLSchemas.database(),\n output: createCodeQLSchemas.output(),\n external: z.array(z.string()).optional()\n .describe('External predicate data: predicate=file.csv'),\n timeout: createCodeQLSchemas.timeout(),\n logDir: z.string().optional()\n .describe('Custom directory for query execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n 'evaluator-log': z.string().optional().describe('Path to save evaluator log (deprecated: use logDir instead)'),\n 'evaluator-log-minify': z.boolean().optional()\n .describe('Minimize evaluator log for smaller size'),\n 'evaluator-log-level': z.number().min(1).max(5).optional()\n .describe('Evaluator log verbosity level (1-5, default 5)'),\n 'tuple-counting': z.boolean().optional()\n .describe('Display tuple counts for each evaluation step in evaluator logs'),\n format: z.enum(['sarif-latest', 'sarifv2.1.0', 'csv', 'graphtext', 'dgml', 'dot']).optional()\n .describe('Output format for query results via codeql bqrs interpret. Defaults to sarif-latest for @kind problem/path-problem queries, graphtext for @kind graph queries. Graph formats (graphtext, dgml, dot) only work with @kind graph queries.'),\n interpretedOutput: z.string().optional()\n .describe('Output file for interpreted results (e.g., results.sarif, results.txt). If not provided, defaults based on format: .sarif for SARIF, .txt for graphtext/csv, .dgml for dgml, .dot for dot'),\n evaluationFunction: z.string().optional()\n .describe('[DEPRECATED - use format parameter instead] Built-in function for query results evaluation (e.g., \"mermaid-graph\", \"json-decode\", \"csv-decode\") or path to custom evaluation script'),\n evaluationOutput: z.string().optional()\n .describe('[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query run --database=mydb --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=src/index.js --output=results.bqrs --format=graphtext --interpreted-output=results.txt',\n 'codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif',\n 'codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=\"main.js,utils.js\" --format=graphtext',\n 'codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql'\n ]\n};", "/**\n * CodeQL quick evaluate tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { join, resolve } from 'path';\nimport { findClassPosition } from './find-class-position';\nimport { findPredicatePosition } from './find-predicate-position';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\n\nexport interface QuickEvaluateParams {\n file: string;\n db: string;\n symbol: string;\n output_path?: string;\n}\n\n/**\n * Quick evaluate either a class or a predicate in a CodeQL query.\n * This allows debugging a select portion of QL code without running the whole query.\n */\nexport async function quickEvaluate({\n file,\n db: _db,\n symbol,\n output_path\n}: QuickEvaluateParams): Promise {\n try {\n // Try to find as a class first, then as a predicate\n try {\n await findClassPosition(file, symbol);\n } catch {\n try {\n await findPredicatePosition(file, symbol);\n } catch {\n throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`);\n }\n }\n \n const resolvedOutput = resolve(output_path || join(getProjectTmpDir('quickeval'), 'quickeval.bqrs'));\n \n // For now, return the resolved output path\n // In a full implementation, this would use the CodeQL CLI or query server\n // to perform the actual quick evaluation with the position parameters\n return resolvedOutput;\n } catch (error) {\n throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the quick evaluate tool with the MCP server\n */\nexport function registerQuickEvaluateTool(server: McpServer): void {\n server.tool(\n 'quick_evaluate',\n 'Quick evaluate either a class or a predicate in a CodeQL query for debugging',\n {\n file: z.string().describe('Path to the .ql file containing the symbol'),\n db: z.string().describe('Path to the CodeQL database'),\n symbol: z.string().describe('Name of the class or predicate to evaluate'),\n output_path: z.string().optional().describe('Output path for results (defaults to project-local .tmp/quickeval/)'),\n },\n async ({ file, db, symbol, output_path }) => {\n try {\n const result = await quickEvaluate({ file, db, symbol, output_path });\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error in quick evaluate:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL register database tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { access, constants } from 'fs/promises';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger';\n\nexport interface DatabaseRegistration {\n uri: string;\n content: {\n sourceArchiveZip: string;\n dbDir: string;\n };\n}\n\n/**\n * Register a CodeQL database given a local path to the database directory.\n * Validates that the database exists and has required structure.\n * Supports both full databases (with src.zip) and test databases (with src/ folder).\n */\nexport async function registerDatabase(dbPath: string): Promise {\n try {\n const resolvedPath = resolve(dbPath);\n \n // Check if database directory exists\n await access(resolvedPath, constants.F_OK);\n \n // Check for codeql-database.yml (required for all CodeQL databases)\n const dbYmlPath = resolve(resolvedPath, 'codeql-database.yml');\n await access(dbYmlPath, constants.F_OK);\n \n // Check if src.zip exists (for full databases) OR src/ directory exists (for test databases)\n const srcZipPath = resolve(resolvedPath, 'src.zip');\n const srcDirPath = resolve(resolvedPath, 'src');\n \n let hasSrcZip = false;\n let hasSrcDir = false;\n \n try {\n await access(srcZipPath, constants.F_OK);\n hasSrcZip = true;\n } catch {\n // src.zip not found, check for src/ directory\n }\n \n if (!hasSrcZip) {\n try {\n await access(srcDirPath, constants.F_OK);\n hasSrcDir = true;\n } catch {\n // src directory not found either\n }\n }\n \n if (!hasSrcZip && !hasSrcDir) {\n throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`);\n }\n \n // For now, we just validate and return success message\n // In a full implementation, this would register with a query server\n const sourceType = hasSrcZip ? 'src.zip' : 'src/';\n return `Database registered: ${dbPath} (source: ${sourceType})`;\n } catch (error) {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === 'ENOENT') {\n if (error.message.includes('codeql-database.yml')) {\n throw new Error(`Missing required codeql-database.yml in: ${dbPath}`);\n }\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n if (errorCode === 'EACCES') {\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n }\n throw new Error(`Failed to register database: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the register database tool with the MCP server\n */\nexport function registerRegisterDatabaseTool(server: McpServer): void {\n server.tool(\n 'register_database',\n 'Register a CodeQL database given a local path to the database directory',\n {\n db_path: z.string().describe('Path to the CodeQL database directory'),\n },\n async ({ db_path }) => {\n try {\n const result = await registerDatabase(db_path);\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error registering database:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL resolve database tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveDatabaseTool: CLIToolDefinition = {\n name: 'codeql_resolve_database',\n description: 'Resolve database path and validate database structure',\n command: 'codeql',\n subcommand: 'resolve database',\n inputSchema: {\n database: z.string().describe('Database path to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for database information'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve database -- /path/to/database',\n 'codeql resolve database --format=json -- my-database',\n 'codeql resolve database --format=betterjson -- database-dir'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve languages tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLanguagesTool: CLIToolDefinition = {\n name: 'codeql_resolve_languages',\n description: 'List installed CodeQL extractor packs',\n command: 'codeql',\n subcommand: 'resolve languages',\n inputSchema: {\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for language information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve languages --format=text',\n 'codeql resolve languages --format=json',\n 'codeql resolve languages --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve library-path tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLibraryPathTool: CLIToolDefinition = {\n name: 'codeql_resolve_library-path',\n description: 'Resolve library path for CodeQL queries and libraries',\n command: 'codeql',\n subcommand: 'resolve library-path',\n inputSchema: {\n language: z.string().optional().describe('Programming language to resolve library path for'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for library path information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve library-path --language=java',\n 'codeql resolve library-path --format=json --language=python',\n 'codeql resolve library-path --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve metadata tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveMetadataTool: CLIToolDefinition = {\n name: 'codeql_resolve_metadata',\n description: 'Resolve and return the key-value metadata pairs from a CodeQL query source file.',\n command: 'codeql',\n subcommand: 'resolve metadata',\n inputSchema: {\n query: z.string().describe('Query file to resolve metadata for'),\n format: z.enum(['json']).optional()\n .describe('Output format for metadata information (always JSON, optional for future compatibility)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve metadata -- relative-path/2/MyQuery.ql',\n 'codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve qlref tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveQlrefTool: CLIToolDefinition = {\n name: 'codeql_resolve_qlref',\n description: 'Resolve qlref files to their corresponding query files',\n command: 'codeql',\n subcommand: 'resolve qlref',\n inputSchema: {\n qlref: z.string().describe('Path to the .qlref file to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for qlref resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve qlref -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=json -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=betterjson -- test/MyQuery.qlref'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve queries tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Result processor that only returns stdout for JSON formats\n * This prevents warnings/info from stderr from corrupting JSON output\n */\nconst jsonOnlyResultProcessor = (\n result: CLIExecutionResult,\n params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n\n // For JSON formats (including bylanguage), only return stdout to avoid mixing warnings with JSON\n if (params.format === 'json' || params.format === 'betterjson' || params.format === 'bylanguage') {\n return result.stdout || '[]';\n }\n\n // For text format, include warnings\n let output = '';\n\n if (result.stdout) {\n output += result.stdout;\n }\n\n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n\n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n\n return output;\n};\n\nexport const codeqlResolveQueriesTool: CLIToolDefinition = {\n name: 'codeql_resolve_queries',\n description: 'List available CodeQL queries found on the local filesystem',\n command: 'codeql',\n subcommand: 'resolve queries',\n inputSchema: {\n directory: z.string().optional().describe('Directory to search for queries'),\n language: z.string().optional().describe('Filter queries by programming language'),\n format: z.enum(['text', 'json', 'betterjson', 'bylanguage']).optional()\n .describe('Output format for query list'),\n 'additional-packs': z.union([z.string(), z.array(z.string())]).optional()\n .describe('Additional pack directories to search for CodeQL packs'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve queries',\n 'codeql resolve queries --language=java --format=json',\n 'codeql resolve queries --format=betterjson -- /path/to/queries',\n 'codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries'\n ],\n resultProcessor: jsonOnlyResultProcessor\n};", "/**\n * CodeQL resolve tests tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveTestsTool: CLIToolDefinition = {\n name: 'codeql_resolve_tests',\n description: 'Resolve the local filesystem paths of unit tests and/or queries under some base directory',\n command: 'codeql',\n subcommand: 'resolve tests',\n inputSchema: {\n tests: z.array(z.string()).optional().describe('One or more tests (.ql, .qlref files, or test directories)'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format for test list'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve tests',\n 'codeql resolve tests --format=json -- test-directory',\n 'codeql resolve tests --format=json -- test1.ql test2.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test accept tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestAcceptTool: CLIToolDefinition = {\n name: 'codeql_test_accept',\n description: 'Accept new test results as the expected baseline',\n command: 'codeql',\n subcommand: 'test accept',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref',\n 'codeql test accept -- languages/java/test/MyQuery/',\n 'codeql test accept -- languages/java/src/MyQuery/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test extract tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestExtractTool: CLIToolDefinition = {\n name: 'codeql_test_extract',\n description: 'Extract test databases for CodeQL query tests',\n command: 'codeql',\n subcommand: 'test extract',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more test directories or files'),\n language: z.string().optional().describe('Programming language for extraction'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test extract -- languages/java/test/MyQuery/',\n 'codeql test extract --language=java --threads=4 -- test-directory',\n 'codeql test extract --threads=2 --ram=2048 -- multiple/test/directories'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test run tool\n */\n\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\nimport { z } from 'zod';\n\nexport const codeqlTestRunTool: CLIToolDefinition = {\n name: 'codeql_test_run',\n description: 'Run CodeQL query tests',\n command: 'codeql',\n subcommand: 'test run',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n 'show-extractor-output': z.boolean().optional()\n .describe('Show output from extractors during test execution'),\n 'keep-databases': z.boolean().optional()\n .describe('Keep test databases after running tests'),\n 'learn': z.boolean().optional()\n .describe('Accept current output as expected for failing tests'),\n logDir: z.string().optional()\n .describe('Custom directory for test execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test run /path/to/tests',\n 'codeql test run --learn /path/to/failing/tests',\n 'codeql test run --threads=4 --keep-databases /path/to/tests',\n 'codeql test run --log-dir=/custom/log/path /path/to/tests'\n ]\n};", "/**\n * CodeQL tools registration for MCP server\n * Includes both high-level helpers and CLI command wrappers\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { validateCodeQLSyntax } from '../lib/validation';\nimport { createCodeQLQuery } from '../lib/query-scaffolding';\nimport { registerCLITool } from '../lib/cli-tool-registry';\nimport {\n codeqlBqrsDecodeTool,\n codeqlBqrsInfoTool,\n codeqlBqrsInterpretTool,\n codeqlDatabaseAnalyzeTool,\n codeqlDatabaseCreateTool,\n codeqlGenerateLogSummaryTool,\n codeqlGenerateQueryHelpTool,\n codeqlPackInstallTool,\n codeqlPackLsTool,\n codeqlQueryCompileTool,\n codeqlQueryFormatTool,\n codeqlQueryRunTool,\n codeqlResolveDatabaseTool,\n codeqlResolveLanguagesTool,\n codeqlResolveLibraryPathTool,\n codeqlResolveMetadataTool,\n codeqlResolveQlrefTool,\n codeqlResolveQueriesTool,\n codeqlResolveTestsTool,\n codeqlTestAcceptTool,\n codeqlTestExtractTool,\n codeqlTestRunTool,\n registerFindClassPositionTool,\n registerFindCodeQLQueryFilesTool,\n registerFindPredicatePositionTool,\n registerLanguageServerEvalTool,\n registerProfileCodeQLQueryTool,\n registerQuickEvaluateTool,\n registerRegisterDatabaseTool\n} from './codeql';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all CodeQL tools with the MCP server\n */\nexport function registerCodeQLTools(server: McpServer): void {\n // Register high-level helper tools\n \n // Tool: Validate CodeQL Query (heuristic-based)\n server.tool(\n 'validate_codeql_query',\n 'Quick heuristic validation for CodeQL query structure - checks for common patterns like from/where/select clauses and metadata presence. Does NOT compile the query. For authoritative validation with actual compilation, use codeql_language_server_eval instead.',\n {\n query: z.string().describe('The CodeQL query to validate'),\n language: z.string().optional().describe('Target programming language'),\n },\n async ({ query, language }) => {\n try {\n const validation = validateCodeQLSyntax(query, language);\n return {\n content: [{ type: 'text', text: JSON.stringify(validation, null, 2) }],\n };\n } catch (error) {\n logger.error('Error validating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Create CodeQL Query\n server.tool(\n 'create_codeql_query',\n 'Create directory structure and files for a new CodeQL query with tests',\n {\n basePath: z.string().describe('Base path where src/ and test/ directories will be created'),\n queryName: z.string().describe('Name of the query (e.g., MySecurityQuery)'),\n language: z.string().describe('Target programming language (e.g., javascript, python, java)'),\n description: z.string().optional().describe('Description of what the query does'),\n queryId: z.string().optional().describe('Custom query ID (defaults to language/example/queryname)'),\n },\n async ({ basePath, queryName, language, description, queryId }) => {\n try {\n const result = createCodeQLQuery({\n basePath,\n queryName,\n language,\n description,\n queryId\n });\n \n const summary = {\n success: true,\n queryPath: result.queryPath,\n testPath: result.testPath,\n qlrefPath: result.qlrefPath,\n testCodePath: result.testCodePath,\n filesCreated: result.filesCreated,\n nextSteps: [\n 'Review and customize the generated query in: ' + result.queryPath,\n 'Add test cases to: ' + result.testCodePath,\n 'Run codeql_pack_install to install dependencies',\n 'Run codeql_test_extract to create test database',\n 'Run codeql_test_run to execute tests'\n ]\n };\n \n return {\n content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }],\n };\n } catch (error) {\n logger.error('Error creating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register CLI tools (alphabetically by tool name)\n registerCLITool(server, codeqlBqrsDecodeTool);\n registerCLITool(server, codeqlBqrsInfoTool);\n registerCLITool(server, codeqlBqrsInterpretTool);\n registerCLITool(server, codeqlDatabaseAnalyzeTool);\n registerCLITool(server, codeqlDatabaseCreateTool);\n registerCLITool(server, codeqlGenerateLogSummaryTool);\n registerCLITool(server, codeqlGenerateQueryHelpTool);\n registerCLITool(server, codeqlPackInstallTool);\n registerCLITool(server, codeqlPackLsTool);\n registerCLITool(server, codeqlQueryCompileTool);\n registerCLITool(server, codeqlQueryFormatTool);\n registerCLITool(server, codeqlQueryRunTool);\n registerCLITool(server, codeqlResolveDatabaseTool);\n registerCLITool(server, codeqlResolveLanguagesTool);\n registerCLITool(server, codeqlResolveLibraryPathTool);\n registerCLITool(server, codeqlResolveMetadataTool);\n registerCLITool(server, codeqlResolveQlrefTool);\n registerCLITool(server, codeqlResolveQueriesTool);\n registerCLITool(server, codeqlResolveTestsTool);\n registerCLITool(server, codeqlTestAcceptTool);\n registerCLITool(server, codeqlTestExtractTool);\n registerCLITool(server, codeqlTestRunTool);\n\n // Register new MCP tools (inspired by JordyZomer/codeql-mcp repository)\n registerFindClassPositionTool(server);\n registerFindCodeQLQueryFilesTool(server);\n registerFindPredicatePositionTool(server);\n registerLanguageServerEvalTool(server);\n registerProfileCodeQLQueryTool(server);\n registerQuickEvaluateTool(server);\n registerRegisterDatabaseTool(server);\n}\n", "/**\n * CodeQL query validation utilities\n */\n\nimport { resolve, normalize, isAbsolute, relative } from 'path';\n\nexport interface CodeQLValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n suggestions: string[];\n}\n\n/**\n * Validates CodeQL query syntax and structure\n */\nexport function validateCodeQLSyntax(query: string, _language?: string): CodeQLValidationResult {\n const validation: CodeQLValidationResult = {\n isValid: true,\n errors: [],\n warnings: [],\n suggestions: [],\n };\n\n if (!query.trim()) {\n validation.isValid = false;\n validation.errors.push('Query cannot be empty');\n return validation;\n }\n\n if (!query.includes('from') && !query.includes('select')) {\n validation.warnings.push('Query should typically include \"from\" and \"select\" clauses');\n }\n\n if (!query.includes('@name') && !query.includes('@description')) {\n validation.suggestions.push('Consider adding @name and @description metadata');\n }\n\n return validation;\n}\n\n/**\n * Validates a file path to prevent path traversal attacks\n * @param filePath - The file path to validate\n * @param workspaceRoot - Optional workspace root directory. If not provided, allows any absolute path but still blocks traversal attempts\n * @returns The validated absolute path\n * @throws Error if the path contains path traversal sequences\n */\nexport function validateFilePath(filePath: string, workspaceRoot?: string): string {\n // Normalize the path to resolve any . or .. segments\n const normalizedPath = normalize(filePath);\n \n // Check for path traversal attempts in the normalized path\n // This blocks paths like \"../../../etc/passwd\" even after normalization\n if (normalizedPath.includes('..')) {\n throw new Error(`Invalid file path: path traversal detected in \"${filePath}\"`);\n }\n \n // Resolve to absolute path\n const absolutePath = isAbsolute(normalizedPath) \n ? normalizedPath \n : resolve(workspaceRoot || process.cwd(), normalizedPath);\n \n // If workspace root is specified, ensure the resolved path is within it\n if (workspaceRoot) {\n const relativePath = relative(workspaceRoot, absolutePath);\n \n // If relative path starts with .. or is absolute, it's outside workspace\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Invalid file path: \"${filePath}\" is outside the workspace root`);\n }\n }\n \n return absolutePath;\n}", "/**\n * CodeQL query scaffolding utilities\n * Handles creation of query directory structure and files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface QueryScaffoldingOptions {\n basePath: string;\n queryName: string;\n language: string;\n description?: string;\n queryId?: string;\n}\n\nexport interface QueryScaffoldingResult {\n queryPath: string;\n testPath: string;\n qlrefPath: string;\n testCodePath: string;\n filesCreated: string[];\n}\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n const extensions: Record = {\n javascript: 'js',\n typescript: 'ts',\n python: 'py',\n java: 'java',\n csharp: 'cs',\n cpp: 'cpp',\n go: 'go',\n ruby: 'rb',\n actions: 'yml'\n };\n return extensions[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Generate query template content\n */\nfunction generateQueryTemplate(\n queryName: string,\n language: string,\n description?: string,\n queryId?: string\n): string {\n const desc = description || `${queryName} query`;\n const id = queryId || `${language}/example/${queryName.toLowerCase()}`;\n \n return `/**\n * @id ${id}\n * @name ${queryName}\n * @description ${desc}\n * @kind problem\n * @precision medium\n * @problem.severity warning\n */\n\nimport ${language}\n\n// TODO: Implement query logic\nfrom File f\nwhere f.getBaseName() = \"${queryName}.${getLanguageExtension(language)}\"\nselect f, \"TODO: Add query logic\"\n`;\n}\n\n/**\n * Create the directory structure and files for a new CodeQL query\n */\nexport function createCodeQLQuery(options: QueryScaffoldingOptions): QueryScaffoldingResult {\n const { basePath, queryName, language, description, queryId } = options;\n \n // Resolve absolute paths\n const absoluteBasePath = path.resolve(basePath);\n \n // Define paths with intermediate directory\n const srcDir = path.join(absoluteBasePath, 'src', queryName);\n const testDir = path.join(absoluteBasePath, 'test', queryName);\n \n const queryPath = path.join(srcDir, `${queryName}.ql`);\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const testCodePath = path.join(testDir, `${queryName}.${getLanguageExtension(language)}`);\n \n const filesCreated: string[] = [];\n \n try {\n // Create directories (recursive: true is a no-op if they already exist)\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(testDir, { recursive: true });\n \n // Create files atomically using 'wx' flag (exclusive create) to avoid\n // TOCTOU race between existsSync check and writeFileSync (CWE-367).\n // The 'wx' flag fails with EEXIST if the file already exists.\n try {\n const queryContent = generateQueryTemplate(queryName, language, description, queryId);\n fs.writeFileSync(queryPath, queryContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(queryPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const qlrefContent = `${queryName}/${queryName}.ql\\n`;\n fs.writeFileSync(qlrefPath, qlrefContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(qlrefPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const testCodeContent = `// Test code for ${queryName}\\n// TODO: Add test cases\\n`;\n fs.writeFileSync(testCodePath, testCodeContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(testCodePath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n return {\n queryPath,\n testPath: testDir,\n qlrefPath,\n testCodePath,\n filesCreated\n };\n } catch (error) {\n throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n", "/**\n * CodeQL learning resources utilities\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the getting started guide content\n */\nexport function getGettingStartedGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/getting-started.md'), 'utf-8');\n } catch {\n return 'Getting started guide not available';\n }\n}\n\n/**\n * Get the query basics guide content\n */\nexport function getQueryBasicsGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/query-basics.md'), 'utf-8');\n } catch {\n return 'Query basics guide not available';\n }\n}\n\n/**\n * Get the security templates content\n */\nexport function getSecurityTemplates(): string {\n try {\n return readFileSync(join(__dirname, '../resources/security-templates.md'), 'utf-8');\n } catch {\n return 'Security templates not available';\n }\n}\n\n/**\n * Get the performance patterns content\n */\nexport function getPerformancePatterns(): string {\n try {\n return readFileSync(join(__dirname, '../resources/performance-patterns.md'), 'utf-8');\n } catch {\n return 'Performance patterns not available';\n }\n}", "/**\n * CodeQL resources registration for MCP server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getGettingStartedGuide,\n getQueryBasicsGuide,\n getSecurityTemplates,\n getPerformancePatterns,\n} from '../lib/resources';\n\n/**\n * Register all CodeQL resources with the MCP server\n */\nexport function registerCodeQLResources(server: McpServer): void {\n // Getting Started Guide\n server.resource(\n 'CodeQL Getting Started',\n 'codeql://learning/getting-started',\n {\n description: 'Comprehensive introduction to CodeQL for beginners',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/getting-started',\n mimeType: 'text/markdown',\n text: getGettingStartedGuide(),\n },\n ],\n };\n }\n );\n\n // Query Basics Guide\n server.resource(\n 'CodeQL Query Basics',\n 'codeql://learning/query-basics',\n {\n description: 'Learn the fundamentals of writing CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/query-basics',\n mimeType: 'text/markdown',\n text: getQueryBasicsGuide(),\n },\n ],\n };\n }\n );\n\n // Security Templates\n server.resource(\n 'CodeQL Security Templates',\n 'codeql://templates/security',\n {\n description: 'Ready-to-use security query templates',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://templates/security',\n mimeType: 'text/markdown',\n text: getSecurityTemplates(),\n },\n ],\n };\n }\n );\n\n // Performance Patterns\n server.resource(\n 'CodeQL Performance Patterns',\n 'codeql://patterns/performance',\n {\n description: 'Best practices for writing efficient CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://patterns/performance',\n mimeType: 'text/markdown',\n text: getPerformancePatterns(),\n },\n ],\n };\n }\n );\n}\n", "/**\n * Language-specific resources implementation\n * Dynamically loads and serves language-specific AST references and security patterns\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { LANGUAGE_RESOURCES } from '../types/language-types';\nimport { workspaceRootDir } from '../utils/package-paths';\nimport { logger } from '../utils/logger';\n\n/**\n * Get the base path for ql resources.\n * Uses the workspace root (monorepo root or package root) so that\n * resource files are found regardless of the server's process.cwd().\n */\nfunction getQLBasePath(): string {\n return workspaceRootDir;\n}\n\n/**\n * Load content from a resource file\n */\nfunction loadResourceContent(relativePath: string): string | null {\n try {\n const fullPath = join(getQLBasePath(), relativePath);\n \n if (!existsSync(fullPath)) {\n logger.warn(`Resource file not found: ${fullPath}`);\n return null;\n }\n \n return readFileSync(fullPath, 'utf-8');\n } catch (error) {\n logger.error(`Error loading resource file ${relativePath}:`, error);\n return null;\n }\n}\n\n/**\n * Register language-specific AST resources\n */\nexport function registerLanguageASTResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.astFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/ast`;\n \n server.resource(\n `${langResource.language.toUpperCase()} AST Reference`,\n resourceUri,\n {\n description: `CodeQL AST class reference for ${langResource.language} programs`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.astFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} AST Reference\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register language-specific security pattern resources\n */\nexport function registerLanguageSecurityResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.securityFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/security`;\n \n server.resource(\n `${langResource.language.toUpperCase()} Security Patterns`,\n resourceUri,\n {\n description: `CodeQL security query patterns and framework modeling for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.securityFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} Security Patterns\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register additional language-specific resources (like Go's dataflow patterns)\n */\nexport function registerLanguageAdditionalResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.additionalFiles) continue;\n \n for (const [resourceType, filePath] of Object.entries(langResource.additionalFiles)) {\n const resourceUri = `codeql://languages/${langResource.language}/${resourceType}`;\n \n server.resource(\n `${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}`,\n resourceUri,\n {\n description: `CodeQL ${resourceType.replace('-', ' ')} guide for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(filePath);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n }\n}\n\n/**\n * Register all language-specific resources\n */\nexport function registerLanguageResources(server: McpServer): void {\n logger.info('Registering language-specific resources...');\n \n // Register AST references for all languages\n registerLanguageASTResources(server);\n \n // Register security patterns for languages that have them\n registerLanguageSecurityResources(server);\n \n // Register additional resources (like Go's dataflow patterns)\n registerLanguageAdditionalResources(server);\n \n logger.info(`Registered resources for ${LANGUAGE_RESOURCES.length} languages`);\n}", "/**\n * Type definitions and constants for language-specific resources\n */\n\n// Language mappings to resource files\nexport interface LanguageResource {\n language: string;\n astFile?: string;\n securityFile?: string;\n additionalFiles?: Record;\n}\n\nexport const LANGUAGE_RESOURCES: LanguageResource[] = [\n {\n language: 'actions',\n astFile: 'ql/languages/actions/tools/dev/actions_ast.prompt.md'\n },\n {\n language: 'cpp',\n astFile: 'ql/languages/cpp/tools/dev/cpp_ast.prompt.md',\n securityFile: 'ql/languages/cpp/tools/dev/cpp_security_query_guide.prompt.md'\n },\n {\n language: 'csharp',\n astFile: 'ql/languages/csharp/tools/dev/csharp_ast.prompt.md',\n securityFile: 'ql/languages/csharp/tools/dev/csharp_security_query_guide.prompt.md'\n },\n {\n language: 'go',\n astFile: 'ql/languages/go/tools/dev/go_ast.prompt.md',\n securityFile: 'ql/languages/go/tools/dev/go_security_query_guide.prompt.md',\n additionalFiles: {\n 'dataflow': 'ql/languages/go/tools/dev/go_dataflow.prompt.md',\n 'library-modeling': 'ql/languages/go/tools/dev/go_library_modeling.prompt.md',\n 'basic-queries': 'ql/languages/go/tools/dev/go_basic_queries.prompt.md'\n }\n },\n {\n language: 'java',\n astFile: 'ql/languages/java/tools/dev/java_ast.prompt.md'\n },\n {\n language: 'javascript',\n astFile: 'ql/languages/javascript/tools/dev/javascript_ast.prompt.md',\n securityFile: 'ql/languages/javascript/tools/dev/javascript_security_query_guide.prompt.md'\n },\n {\n language: 'python',\n astFile: 'ql/languages/python/tools/dev/python_ast.prompt.md',\n securityFile: 'ql/languages/python/tools/dev/python_security_query_guide.prompt.md'\n },\n {\n language: 'ql',\n astFile: 'ql/languages/ql/tools/dev/ql_ast.prompt.md'\n },\n {\n language: 'ruby',\n astFile: 'ql/languages/ruby/tools/dev/ruby_ast.prompt.md'\n }\n];", "/**\n * MCP Server workflow prompts for CodeQL development\n *\n * All prompt content is loaded from .prompt.md files in this directory.\n * This file only handles prompt registration and parameter processing.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { basename } from 'path';\nimport { loadPromptTemplate, processPromptTemplate } from './prompt-loader';\nimport { logger } from '../utils/logger';\n\n/** Supported CodeQL languages for tools queries */\nexport const SUPPORTED_LANGUAGES = [\n 'actions',\n 'cpp',\n 'csharp',\n 'go',\n 'java',\n 'javascript',\n 'python',\n 'ruby',\n 'swift'\n] as const;\n\n/**\n * Schema for workshop_creation_workflow prompt parameters.\n * Uses z.coerce.number() for numStages to handle string inputs from VSCode slash commands.\n */\nexport const workshopCreationWorkflowSchema = z.object({\n queryPath: z\n .string()\n .describe('Path to the production-grade CodeQL query (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n workshopName: z\n .string()\n .optional()\n .describe('Name for the workshop directory'),\n numStages: z\n .coerce.number()\n .optional()\n .describe('Number of incremental stages (default: 4-8)')\n});\n\n/**\n * Register MCP workflow prompts\n *\n * Each prompt loads its content from a corresponding .prompt.md file\n * and processes any parameter substitutions.\n */\nexport function registerWorkflowPrompts(server: McpServer): void {\n // Test-Driven Development Prompt\n server.prompt(\n 'test_driven_development',\n 'Test-driven development workflow for CodeQL queries using MCP tools',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n queryName: queryName || '[QueryName]'\n });\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `## Context\\n\\n- **Language**: ${language}\\n${queryName ? `- **Query Name**: ${queryName}\\n` : ''}\\n${content}`\n }\n }\n ]\n };\n }\n );\n\n // Tools Query Workflow Prompt\n server.prompt(\n 'tools_query_workflow',\n 'Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n database: z.string().describe('Path to the CodeQL database'),\n sourceFiles: z\n .string()\n .optional()\n .describe(\n 'Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'\n ),\n sourceFunction: z\n .string()\n .optional()\n .describe(\n 'Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'\n ),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")')\n },\n async ({\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n }) => {\n const template = loadPromptTemplate('tools-query-workflow.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n database\n });\n\n const contextSection = buildToolsQueryContext(\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + content\n }\n }\n ]\n };\n }\n );\n\n // Workshop Creation Workflow Prompt\n server.prompt(\n 'workshop_creation_workflow',\n 'Guide for creating CodeQL query development workshops from production-grade queries',\n workshopCreationWorkflowSchema.shape,\n async ({ queryPath, language, workshopName, numStages }) => {\n const template = loadPromptTemplate('workshop-creation-workflow.prompt.md');\n\n // Derive workshop name from query path if not provided\n const derivedName =\n workshopName ||\n basename(queryPath)\n .replace(/\\.(ql|qlref)$/, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') ||\n 'codeql-workshop';\n\n const contextSection = buildWorkshopContext(\n queryPath,\n language,\n derivedName,\n numStages\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Basic Prompt - Test-Driven Development Checklist\n server.prompt(\n 'ql_tdd_basic',\n 'Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (language || queryName) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Advanced Prompt - Advanced Techniques with AST/CFG/CallGraph\n server.prompt(\n 'ql_tdd_advanced',\n 'Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop'),\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis')\n },\n async ({ language, queryName, database }) => {\n const template = loadPromptTemplate('ql-tdd-advanced.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (database) {\n contextSection += `- **Database**: ${database}\\n`;\n }\n if (language || queryName || database) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank False Positives Prompt\n server.prompt(\n 'sarif_rank_false_positives',\n 'Analyze SARIF results to identify likely false positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-false-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank True Positives Prompt\n server.prompt(\n 'sarif_rank_true_positives',\n 'Analyze SARIF results to identify likely true positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-true-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Explain CodeQL Query Prompt (for workshop learning content)\n server.prompt(\n 'explain_codeql_query',\n 'Generate detailed explanation of a CodeQL query for workshop learning content - uses MCP tools to gather context and produces both verbal explanations and mermaid evaluation diagrams',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling')\n },\n async ({ queryPath, language, databasePath }) => {\n const template = loadPromptTemplate('explain-codeql-query.prompt.md');\n\n let contextSection = '## Query to Explain\\n\\n';\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n contextSection += `- **Language**: ${language}\\n`;\n if (databasePath) {\n contextSection += `- **Database Path**: ${databasePath}\\n`;\n }\n contextSection += '\\n';\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Document CodeQL Query Prompt\n server.prompt(\n 'document_codeql_query',\n 'Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query')\n },\n async ({ queryPath, language }) => {\n const template = loadPromptTemplate('document-codeql-query.prompt.md');\n\n const contextSection = `## Query to Document\n\n- **Query Path**: ${queryPath}\n- **Language**: ${language}\n\n`;\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n logger.info('Registered 9 workflow prompts');\n}\n\n/**\n * Build context section for tools query workflow\n */\nexport function buildToolsQueryContext(\n language: string,\n database: string,\n sourceFiles?: string,\n sourceFunction?: string,\n targetFunction?: string\n): string {\n const lines = [\n '## Your Context',\n '',\n `- **Language**: ${language}`,\n `- **Database**: ${database}`\n ];\n\n if (sourceFiles) {\n lines.push(`- **Source Files**: ${sourceFiles}`);\n }\n if (sourceFunction) {\n lines.push(`- **Source Function**: ${sourceFunction}`);\n }\n if (targetFunction) {\n lines.push(`- **Target Function**: ${targetFunction}`);\n }\n\n lines.push('', '## Recommended Next Steps', '');\n\n if (sourceFiles) {\n lines.push(\n `1. Run \\`codeql_query_run\\` with queryName=\"PrintAST\", sourceFiles=\"${sourceFiles}\"`\n );\n } else {\n lines.push('1. Identify source files to analyze with PrintAST');\n }\n\n if (sourceFunction) {\n lines.push(\n `2. Run \\`codeql_query_run\\` with queryName=\"PrintCFG\" or \"CallGraphFrom\", sourceFunction=\"${sourceFunction}\"`\n );\n } else {\n lines.push(\n '2. Identify key functions for CFG or call graph analysis'\n );\n }\n\n if (targetFunction) {\n lines.push(\n `3. Run \\`codeql_query_run\\` with queryName=\"CallGraphTo\", targetFunction=\"${targetFunction}\"`\n );\n } else {\n lines.push('3. Identify target functions to find callers');\n }\n\n lines.push('', '');\n return lines.join('\\n');\n}\n\n/**\n * Build context section for workshop creation workflow\n */\nexport function buildWorkshopContext(\n queryPath: string,\n language: string,\n workshopName: string,\n numStages?: number\n): string {\n return `## Your Workshop Context\n\n- **Target Query**: ${queryPath}\n- **Language**: ${language}\n- **Workshop Name**: ${workshopName}\n- **Suggested Stages**: ${numStages || '4-8 (auto-detect based on query complexity)'}\n\n## Immediate Actions\n\n1. **Locate query files**: Use \\`find_codeql_query_files\\` with queryPath=\"${queryPath}\"\n2. **Understand query for learning content**: Use the \\`explain_codeql_query\\` prompt with queryPath=\"${queryPath}\" and language=\"${language}\"\n3. **Document each workshop stage**: Use the \\`document_codeql_query\\` prompt to create/update documentation for each solution query\n4. **Verify tests pass**: Use \\`codeql_test_run\\` on existing tests\n5. **Run tools queries**: Generate AST/CFG understanding for workshop materials\n\n`;\n}\n", "/**\n * Utility functions for loading prompt template files\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Load a prompt template from a .prompt.md file\n */\nexport function loadPromptTemplate(promptFileName: string): string {\n try {\n const promptPath = join(__dirname, promptFileName);\n return readFileSync(promptPath, 'utf-8');\n } catch (error) {\n return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n}\n\n/**\n * Process prompt template by replacing placeholders with actual values\n */\nexport function processPromptTemplate(template: string, variables: Record): string {\n let processed = template;\n \n // Replace variables in the format {{variable}} or {variable}\n for (const [key, value] of Object.entries(variables)) {\n const patterns = [\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'),\n new RegExp(`\\\\{${key}\\\\}`, 'g')\n ];\n \n for (const pattern of patterns) {\n processed = processed.replace(pattern, value);\n }\n }\n \n return processed;\n}", "/**\n * Monitoring Tools - MCP tool implementations for session management and reporting\n * Provides the MCP Tool APIs specified in the monitoring specification\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport { sessionDataManager } from '../lib/session-data-manager';\nimport {\n QueryDevelopmentSession,\n SessionFilter,\n QualityScoreRecord,\n ComparisonReport,\n AggregateReport,\n ExportResult,\n FunctionalTestResult,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all monitoring and reporting tools with the MCP server\n * Note: These tools are opt-in and disabled by default for end-users.\n * Set enableMonitoringTools: true in monitoring config to enable them.\n */\nexport function registerMonitoringTools(server: McpServer): void {\n const config = sessionDataManager.getConfig();\n \n // Check if monitoring tools are enabled (opt-in, disabled by default)\n if (!config.enableMonitoringTools) {\n logger.info('Monitoring tools are disabled (opt-in). Set enableMonitoringTools: true to enable session_* tools.');\n return;\n }\n\n // Session Management Tools - session_start removed per feedback (auto-creation instead)\n registerSessionEndTool(server);\n registerSessionGetTool(server);\n registerSessionListTool(server);\n registerSessionUpdateStateTool(server);\n\n // Session Analytics Tools\n registerSessionGetCallHistoryTool(server);\n registerSessionGetTestHistoryTool(server);\n registerSessionGetScoreHistoryTool(server);\n registerSessionCalculateCurrentScoreTool(server);\n\n // Batch Operations Tools\n registerSessionsCompareTool(server);\n registerSessionsAggregateTool(server);\n registerSessionsExportTool(server);\n\n // Note: Functional Testing Support Tools are internal only, not exposed as MCP tools\n\n logger.info('Registered monitoring and reporting tools');\n}\n\n/**\n * Session Management Tools\n */\n\n// session_start tool removed - sessions are now auto-created when needed\n// Sessions are automatically created when MCP tools are called with queryPath\n// If explicit session creation is needed, provide sessionId=null and it will auto-create\n\nfunction registerSessionEndTool(server: McpServer): void {\n server.tool(\n 'session_end',\n 'End a query development session with final status',\n {\n sessionId: z.string().describe('ID of the session to end'),\n status: z.enum(['completed', 'failed', 'abandoned']).describe('Final status of the session'),\n },\n async ({ sessionId, status }) => {\n try {\n const session = await sessionDataManager.endSession(sessionId, status);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error ending session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error ending session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTool(server: McpServer): void {\n server.tool(\n 'session_get',\n 'Get complete details of a specific query development session',\n {\n sessionId: z.string().describe('ID of the session to retrieve'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionListTool(server: McpServer): void {\n server.tool(\n 'session_list',\n 'List query development sessions with optional filtering',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const sessionList = {\n totalSessions: sessions.length,\n sessions: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n language: s.language,\n status: s.status,\n startTime: s.startTime,\n endTime: s.endTime,\n mcpCallsCount: s.mcpCalls.length,\n testExecutionsCount: s.testExecutions.length,\n currentScore: s.qualityScores.length > 0 \n ? s.qualityScores[s.qualityScores.length - 1].overallScore \n : null,\n })),\n };\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(sessionList, null, 2),\n },\n ],\n recommendations: generateListRecommendations(sessions),\n };\n } catch (error) {\n logger.error('Error listing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error listing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionUpdateStateTool(server: McpServer): void {\n server.tool(\n 'session_update_state',\n 'Update the current state of a query development session',\n {\n sessionId: z.string().describe('ID of the session to update'),\n filesPresent: z.array(z.string()).optional().describe('List of files present in the query development'),\n compilationStatus: z.enum(['unknown', 'success', 'failed']).optional().describe('Current compilation status'),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']).optional().describe('Current test status'),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']).optional().describe('Documentation status'),\n },\n async ({ sessionId, filesPresent, compilationStatus, testStatus, documentationStatus }) => {\n try {\n const stateUpdate: Record = {};\n if (filesPresent !== undefined) stateUpdate.filesPresent = filesPresent;\n if (compilationStatus !== undefined) stateUpdate.compilationStatus = compilationStatus;\n if (testStatus !== undefined) stateUpdate.testStatus = testStatus;\n if (documentationStatus !== undefined) stateUpdate.documentationStatus = documentationStatus;\n\n const session = await sessionDataManager.updateSessionState(sessionId, stateUpdate);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n recommendations: generateRecommendations(session, 'session_update_state'),\n };\n } catch (error) {\n logger.error('Error updating session state:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error updating session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Session Analytics Tools\n */\n\nfunction registerSessionGetCallHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_call_history',\n 'Get MCP call history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of calls to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let calls = [...session.mcpCalls].reverse(); // Most recent first\n if (limit && limit > 0) {\n calls = calls.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalCalls: session.mcpCalls.length,\n callHistory: calls,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting call history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting call history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTestHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_test_history',\n 'Get test execution history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of test executions to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let tests = [...session.testExecutions].reverse(); // Most recent first\n if (limit && limit > 0) {\n tests = tests.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalTests: session.testExecutions.length,\n testHistory: tests,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting test history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting test history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetScoreHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_score_history',\n 'Get quality score history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of scores to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let scores = [...session.qualityScores].reverse(); // Most recent first\n if (limit && limit > 0) {\n scores = scores.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalScores: session.qualityScores.length,\n scoreHistory: scores,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting score history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting score history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionCalculateCurrentScoreTool(server: McpServer): void {\n server.tool(\n 'session_calculate_current_score',\n 'Calculate current quality score for a session based on its state',\n {\n sessionId: z.string().describe('ID of the session'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n // Calculate quality score based on current state\n const scoreRecord = calculateQualityScore(session);\n \n // Add the score to the session\n await sessionDataManager.addQualityScore(sessionId, scoreRecord);\n \n // Get updated session with new score\n const updatedSession = await sessionDataManager.getSession(sessionId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(scoreRecord, null, 2),\n },\n ],\n recommendations: generateRecommendations(updatedSession, 'session_calculate_current_score'),\n };\n } catch (error) {\n logger.error('Error calculating current score:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error calculating current score: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Batch Operations Tools\n */\n\nfunction registerSessionsCompareTool(server: McpServer): void {\n server.tool(\n 'sessions_compare',\n 'Compare multiple query development sessions across specified dimensions',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to compare'),\n dimensions: z.array(z.string()).optional().describe('Specific dimensions to compare (default: all)'),\n },\n async ({ sessionIds, dimensions }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for comparison',\n },\n ],\n isError: true,\n };\n }\n\n const comparison = await compareSessions(validSessions, dimensions);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(comparison, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error comparing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error comparing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsAggregateTool(server: McpServer): void {\n server.tool(\n 'sessions_aggregate',\n 'Generate aggregate insights from multiple sessions based on filters',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const aggregate = await aggregateSessions(sessions, filters);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(aggregate, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error aggregating sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error aggregating sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsExportTool(server: McpServer): void {\n server.tool(\n 'sessions_export',\n 'Export session data in specified format for external analysis',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to export'),\n format: z.enum(['json', 'html', 'markdown']).optional().default('json').describe('Export format'),\n },\n async ({ sessionIds, format = 'json' }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for export',\n },\n ],\n isError: true,\n };\n }\n\n const exportResult = await exportSessions(validSessions, format);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(exportResult, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error exporting sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error exporting sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Helper Functions\n */\n\n/**\n * Calculate quality score for a session based on current state and history\n */\nfunction calculateQualityScore(session: QueryDevelopmentSession): QualityScoreRecord {\n const timestamp = new Date().toISOString();\n \n // Calculate syntactic correctness (25%)\n const syntacticCorrectness = session.currentState.compilationStatus === 'success' ? 100 :\n session.currentState.compilationStatus === 'failed' ? 0 : 50;\n\n // Calculate test coverage and results (30%)\n const testCoverageResults = session.currentState.testStatus === 'passing' ? 100 :\n session.currentState.testStatus === 'failing' ? 25 :\n session.currentState.testStatus === 'no_tests' ? 0 : 50;\n\n // Calculate documentation quality (20%)\n const documentationQuality = session.currentState.documentationStatus === 'present' ? 100 :\n session.currentState.documentationStatus === 'incomplete' ? 60 :\n session.currentState.documentationStatus === 'missing' ? 0 : 50;\n\n // Calculate functional correctness (25%) - based on successful test runs\n const successfulTests = session.testExecutions.filter(t => t.success && t.type === 'test_run').length;\n const totalTests = session.testExecutions.filter(t => t.type === 'test_run').length;\n const functionalCorrectness = totalTests > 0 ? (successfulTests / totalTests) * 100 : 50;\n\n // Calculate overall score\n const overallScore = Math.round(\n (syntacticCorrectness * 0.25) +\n (testCoverageResults * 0.30) +\n (documentationQuality * 0.20) +\n (functionalCorrectness * 0.25)\n );\n\n // Determine grade\n const grade = overallScore >= 90 ? 'A' :\n overallScore >= 80 ? 'B' :\n overallScore >= 70 ? 'C' :\n overallScore >= 60 ? 'D' : 'F';\n\n // Generate recommendations\n const recommendations: string[] = [];\n if (syntacticCorrectness < 100) {\n recommendations.push('Fix compilation errors to improve syntactic correctness');\n }\n if (testCoverageResults < 70) {\n recommendations.push('Add comprehensive tests and ensure they pass');\n }\n if (documentationQuality < 80) {\n recommendations.push('Add or improve query documentation with examples');\n }\n if (functionalCorrectness < 80) {\n recommendations.push('Improve test pass rate and verify query logic');\n }\n\n return {\n scoreId: randomUUID(),\n timestamp,\n overallScore,\n dimensions: {\n syntacticCorrectness,\n testCoverageResults,\n documentationQuality,\n functionalCorrectness,\n },\n grade,\n recommendations,\n };\n}\n\n/**\n * Compare multiple sessions\n */\nasync function compareSessions(\n sessions: QueryDevelopmentSession[],\n dimensions?: string[]\n): Promise {\n const timestamp = new Date().toISOString();\n const sessionIds = sessions.map(s => s.sessionId);\n \n const results: Record = {\n sessionCount: sessions.length,\n sessionOverview: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n status: s.status,\n mcpCallsCount: s.mcpCalls.length,\n duration: s.endTime ? \n new Date(s.endTime).getTime() - new Date(s.startTime).getTime() : \n new Date().getTime() - new Date(s.startTime).getTime(),\n currentScore: s.qualityScores.length > 0 ? \n s.qualityScores[s.qualityScores.length - 1].overallScore : null,\n })),\n };\n\n if (!dimensions || dimensions.includes('quality')) {\n const qualityScores = sessions.map(s => \n s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1] : null\n );\n results.qualityComparison = {\n averageScore: qualityScores\n .filter(q => q !== null)\n .reduce((sum, q) => sum + q!.overallScore, 0) / qualityScores.filter(q => q !== null).length,\n scoreRange: {\n min: Math.min(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n max: Math.max(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n },\n };\n }\n\n if (!dimensions || dimensions.includes('activity')) {\n results.activityComparison = {\n totalMCPCalls: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0),\n averageCallsPerSession: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length,\n mostActiveTool: getMostUsedTool(sessions),\n };\n }\n\n return {\n sessionIds,\n dimensions: dimensions || ['all'],\n timestamp,\n results,\n };\n}\n\n/**\n * Aggregate insights from multiple sessions\n */\nasync function aggregateSessions(\n sessions: QueryDevelopmentSession[],\n filters: SessionFilter\n): Promise {\n const timestamp = new Date().toISOString();\n \n const completedSessions = sessions.filter(s => s.status === 'completed');\n const successRate = sessions.length > 0 ? completedSessions.length / sessions.length : 0;\n \n const qualityScores = sessions\n .map(s => s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1].overallScore : null)\n .filter(score => score !== null) as number[];\n \n const averageQualityScore = qualityScores.length > 0 ? \n qualityScores.reduce((sum, score) => sum + score, 0) / qualityScores.length : 0;\n\n const commonPatterns = identifyCommonPatterns(sessions);\n const recommendations = generateAggregateRecommendations(sessions);\n\n return {\n filters,\n timestamp,\n totalSessions: sessions.length,\n successRate,\n averageQualityScore,\n commonPatterns,\n recommendations,\n };\n}\n\n/**\n * Export sessions in specified format\n */\nasync function exportSessions(\n sessions: QueryDevelopmentSession[],\n format: 'json' | 'html' | 'markdown'\n): Promise {\n const timestamp = new Date().toISOString();\n const filename = `session-export-${timestamp.replace(/[:.]/g, '-')}.${format}`;\n \n let content: string;\n \n switch (format) {\n case 'json':\n content = JSON.stringify(sessions, null, 2);\n break;\n case 'html':\n content = generateHTMLReport(sessions);\n break;\n case 'markdown':\n content = generateMarkdownReport(sessions);\n break;\n }\n\n return {\n format,\n filename,\n content,\n timestamp,\n };\n}\n\n/**\n * Utility functions\n */\n\nfunction getMostUsedTool(sessions: QueryDevelopmentSession[]): string {\n const toolCounts: Record = {};\n \n sessions.forEach(session => {\n session.mcpCalls.forEach(call => {\n toolCounts[call.toolName] = (toolCounts[call.toolName] || 0) + 1;\n });\n });\n\n return Object.entries(toolCounts)\n .sort(([, a], [, b]) => b - a)[0]?.[0] || 'none';\n}\n\nfunction identifyCommonPatterns(sessions: QueryDevelopmentSession[]): string[] {\n const patterns: string[] = [];\n \n const commonTools = getMostUsedTool(sessions);\n if (commonTools && commonTools !== 'none') {\n patterns.push(`Most commonly used tool: ${commonTools}`);\n }\n\n const completionRate = sessions.filter(s => s.status === 'completed').length / sessions.length;\n if (completionRate > 0.8) {\n patterns.push('High completion rate indicates effective workflow');\n } else if (completionRate < 0.5) {\n patterns.push('Low completion rate suggests workflow issues');\n }\n\n return patterns;\n}\n\nfunction generateAggregateRecommendations(sessions: QueryDevelopmentSession[]): string[] {\n const recommendations: string[] = [];\n \n const failedSessions = sessions.filter(s => s.status === 'failed');\n if (failedSessions.length > sessions.length * 0.3) {\n recommendations.push('High failure rate - consider improving error handling and guidance');\n }\n\n const averageCallsPerSession = sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length;\n if (averageCallsPerSession > 20) {\n recommendations.push('High number of MCP calls per session - consider workflow optimization');\n }\n\n return recommendations;\n}\n\nfunction generateHTMLReport(sessions: QueryDevelopmentSession[]): string {\n const html = `\n\n\n\n Session Export Report\n \n\n\n

Query Development Sessions Report

\n

Generated: ${new Date().toISOString()}

\n

Total Sessions: ${sessions.length}

\n \n ${sessions.map(session => `\n
\n

Session: ${session.sessionId}

\n

Query Path: ${session.queryPath}

\n

Status: ${session.status}

\n

Language: ${session.language}

\n

Start Time: ${session.startTime}

\n

MCP Calls: ${session.mcpCalls.length}

\n

Test Executions: ${session.testExecutions.length}

\n

Quality Scores: ${session.qualityScores.length}

\n
\n `).join('')}\n\n`;\n \n return html;\n}\n\nfunction generateMarkdownReport(sessions: QueryDevelopmentSession[]): string {\n const md = `# Query Development Sessions Report\n\nGenerated: ${new Date().toISOString()}\nTotal Sessions: ${sessions.length}\n\n## Session Summary\n\n| Session ID | Query Path | Status | Language | MCP Calls | Test Executions |\n|------------|-----------|--------|----------|-----------|-----------------|\n${sessions.map(session => \n `| ${session.sessionId} | ${session.queryPath} | ${session.status} | ${session.language} | ${session.mcpCalls.length} | ${session.testExecutions.length} |`\n).join('\\n')}\n\n## Detailed Sessions\n\n${sessions.map(session => `\n### Session: ${session.sessionId}\n\n- **Query Path:** ${session.queryPath}\n- **Status:** ${session.status}\n- **Language:** ${session.language}\n- **Start Time:** ${session.startTime}\n- **End Time:** ${session.endTime || 'N/A'}\n- **MCP Calls:** ${session.mcpCalls.length}\n- **Test Executions:** ${session.testExecutions.length}\n- **Quality Scores:** ${session.qualityScores.length}\n\n${session.recommendations.length > 0 ? `\n**Current Recommendations:**\n${session.recommendations.map(rec => `- ${rec}`).join('\\n')}\n` : ''}\n`).join('\\n')}`;\n\n return md;\n}\n\nfunction _calculateAverageDuration(sessions: QueryDevelopmentSession[]): number {\n const completedSessions = sessions.filter(s => s.endTime);\n if (completedSessions.length === 0) return 0;\n\n const totalDuration = completedSessions.reduce((sum, session) => {\n return sum + (new Date(session.endTime!).getTime() - new Date(session.startTime).getTime());\n }, 0);\n\n return totalDuration / completedSessions.length;\n}\n\nfunction _identifyFailureReasons(results: FunctionalTestResult[]): string[] {\n const failedResults = results.filter(r => !r.passed);\n const reasons: Record = {};\n\n failedResults.forEach(result => {\n Object.entries(result.criteria).forEach(([criterion, passed]) => {\n if (!passed) {\n reasons[criterion] = (reasons[criterion] || 0) + 1;\n }\n });\n });\n\n return Object.entries(reasons)\n .sort(([, a], [, b]) => b - a)\n .map(([reason, count]) => `${reason}: ${count} sessions`);\n}\n\n/**\n * Generate recommendations for MCP tool responses\n * Returns a map of MCP primitive paths to recommendation reasons\n */\nfunction generateRecommendations(\n session: QueryDevelopmentSession | null,\n currentTool: string\n): Record {\n if (!session) {\n return {};\n }\n\n const recommendations: Record = {};\n\n // Session state-based recommendations\n if (session.currentState.compilationStatus === 'failed') {\n recommendations['codeql_query_format'] = 'Format query to fix potential syntax issues';\n recommendations['codeql_query_compile'] = 'Recompile after fixing syntax errors';\n } else if (session.currentState.compilationStatus === 'success') {\n if (session.currentState.testStatus === 'unknown' || session.currentState.testStatus === 'no_tests') {\n recommendations['codeql_test_run'] = 'Run tests to validate query functionality';\n } else if (session.currentState.testStatus === 'failing') {\n recommendations['session_get_test_history'] = 'Review test failures to identify issues';\n recommendations['codeql_query_compile'] = 'Verify query logic matches test expectations';\n } else if (session.currentState.testStatus === 'passing') {\n recommendations['session_calculate_current_score'] = 'Calculate quality score for completed query';\n }\n }\n\n // Tool-specific follow-up recommendations\n switch (currentTool) {\n case 'session_get':\n if (session.mcpCalls.length === 0) {\n recommendations['codeql_query_compile'] = 'Start development by compiling the query';\n }\n break;\n case 'session_end':\n if (session.status === 'completed') {\n recommendations['sessions_export'] = 'Export session data for analysis';\n }\n break;\n case 'session_calculate_current_score': {\n const latestScore = session.qualityScores[session.qualityScores.length - 1];\n if (latestScore && latestScore.overallScore < 80) {\n if (latestScore.dimensions.syntacticCorrectness < 100) {\n recommendations['codeql_query_format'] = 'Improve syntax and formatting';\n }\n if (latestScore.dimensions.testCoverageResults < 70) {\n recommendations['codeql_test_run'] = 'Improve test coverage and results';\n }\n }\n break;\n }\n case 'session_update_state':\n // Recommend next logical step based on updated state\n if (session.currentState.compilationStatus === 'success' && session.currentState.testStatus === 'unknown') {\n recommendations['codeql_test_run'] = 'Run tests now that compilation is successful';\n }\n break;\n }\n\n return recommendations;\n}\n\n/**\n * Generate recommendations for session list results\n */\nfunction generateListRecommendations(sessions: QueryDevelopmentSession[]): Record {\n const recommendations: Record = {};\n\n const activeSessions = sessions.filter(s => s.status === 'active');\n const completedSessions = sessions.filter(s => s.status === 'completed');\n\n if (activeSessions.length > 0) {\n recommendations['session_get'] = `Review details of ${activeSessions.length} active session(s)`;\n }\n\n if (completedSessions.length > 1) {\n recommendations['sessions_compare'] = 'Compare completed sessions to identify patterns';\n recommendations['sessions_aggregate'] = 'Generate aggregate insights from multiple sessions';\n }\n\n if (sessions.length > 5) {\n recommendations['sessions_export'] = 'Export session data for comprehensive analysis';\n }\n\n return recommendations;\n}", "function checkArgs(adapter, defaultData) {\n if (adapter === undefined)\n throw new Error('lowdb: missing adapter');\n if (defaultData === undefined)\n throw new Error('lowdb: missing default data');\n}\nexport class Low {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n async read() {\n const data = await this.adapter.read();\n if (data)\n this.data = data;\n }\n async write() {\n if (this.data)\n await this.adapter.write(this.data);\n }\n async update(fn) {\n fn(this.data);\n await this.write();\n }\n}\nexport class LowSync {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n read() {\n const data = this.adapter.read();\n if (data)\n this.data = data;\n }\n write() {\n if (this.data)\n this.adapter.write(this.data);\n }\n update(fn) {\n fn(this.data);\n this.write();\n }\n}\n", "import { readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Writer } from 'steno';\nexport class TextFile {\n #filename;\n #writer;\n constructor(filename) {\n this.#filename = filename;\n this.#writer = new Writer(filename);\n }\n async read() {\n let data;\n try {\n data = await readFile(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n return this.#writer.write(str);\n }\n}\nexport class TextFileSync {\n #tempFilename;\n #filename;\n constructor(filename) {\n this.#filename = filename;\n const f = filename.toString();\n this.#tempFilename = path.join(path.dirname(f), `.${path.basename(f)}.tmp`);\n }\n read() {\n let data;\n try {\n data = readFileSync(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n writeFileSync(this.#tempFilename, str);\n renameSync(this.#tempFilename, this.#filename);\n }\n}\n", "import { TextFile, TextFileSync } from './TextFile.js';\nexport class DataFile {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFile(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n async read() {\n const data = await this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n return this.#adapter.write(this.#stringify(obj));\n }\n}\nexport class DataFileSync {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFileSync(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n read() {\n const data = this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n this.#adapter.write(this.#stringify(obj));\n }\n}\n", "import { DataFile, DataFileSync } from './DataFile.js';\nexport class JSONFile extends DataFile {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\nexport class JSONFileSync extends DataFileSync {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\n", "/**\n * Session Data Management\n * Provides unified JSON storage and session lifecycle management using lowdb\n */\n\nimport { Low } from 'lowdb';\nimport { JSONFileSync } from 'lowdb/node';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport { getPackageRootDir } from '../utils/package-paths';\nimport {\n QueryDevelopmentSession,\n QueryState,\n MCPCallRecord,\n TestExecutionRecord,\n QualityScoreRecord,\n SessionFilter,\n MonitoringConfig,\n MonitoringConfigSchema,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Database schema for lowdb - sessions only\n */\ninterface SessionDatabase {\n sessions: QueryDevelopmentSession[];\n}\n\n/**\n * Session Data Manager - handles all session persistence and lifecycle\n */\nexport class SessionDataManager {\n private db: Low;\n private config: MonitoringConfig;\n private storageDir: string;\n\n constructor(configOverrides: Partial = {}) {\n this.config = MonitoringConfigSchema.parse({\n ...MonitoringConfigSchema.parse({}),\n ...configOverrides,\n });\n\n this.storageDir = this.config.storageLocation;\n this.ensureStorageDirectory();\n\n const adapter = new JSONFileSync(join(this.storageDir, 'sessions.json'));\n this.db = new Low(adapter, {\n sessions: [],\n });\n\n this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n async initialize(): Promise {\n await this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n private async initializeDatabase(): Promise {\n try {\n await this.db.read();\n \n logger.info(`Session data manager initialized with ${this.db.data.sessions.length} sessions`);\n } catch (error) {\n logger.error('Failed to initialize session database:', error);\n throw error;\n }\n }\n\n /**\n * Ensure storage directory structure exists\n */\n private ensureStorageDirectory(): void {\n try {\n // mkdirSync with recursive: true is a no-op if directories already exist\n mkdirSync(this.storageDir, { recursive: true });\n\n // Create subdirectories\n const subdirs = ['sessions-archive', 'exports'];\n for (const subdir of subdirs) {\n mkdirSync(join(this.storageDir, subdir), { recursive: true });\n }\n\n // Use 'wx' flag (exclusive create) to atomically create config only\n // if it doesn't exist, avoiding TOCTOU race (CWE-367).\n const configPath = join(this.storageDir, 'config.json');\n try {\n writeFileSync(configPath, JSON.stringify(this.config, null, 2), { flag: 'wx' });\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n\n logger.debug(`Storage directory initialized: ${this.storageDir}`);\n } catch (error) {\n logger.error('Failed to create storage directory:', error);\n throw error;\n }\n }\n\n /**\n * Start a new query development session\n */\n async startSession(\n queryPath: string,\n language?: string,\n queryType?: string,\n description?: string\n ): Promise {\n const sessionId = randomUUID();\n const startTime = new Date().toISOString();\n\n const session: QueryDevelopmentSession = {\n sessionId,\n queryPath,\n language: language || 'unknown',\n queryType,\n description,\n startTime,\n status: 'active',\n mcpCalls: [],\n testExecutions: [],\n qualityScores: [],\n currentState: {\n filesPresent: [],\n compilationStatus: 'unknown',\n testStatus: 'unknown',\n documentationStatus: 'unknown',\n lastActivity: startTime,\n },\n recommendations: [],\n };\n\n await this.db.read();\n this.db.data.sessions.push(session);\n await this.db.write();\n\n logger.info(`Started new session: ${sessionId} for query: ${queryPath}`);\n return sessionId;\n }\n\n /**\n * End a session with final status\n */\n async endSession(\n sessionId: string,\n status: 'completed' | 'failed' | 'abandoned'\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.status = status;\n session.endTime = new Date().toISOString();\n session.currentState.lastActivity = session.endTime;\n\n await this.db.write();\n\n // Archive completed session if enabled\n if (this.config.archiveCompletedSessions && status === 'completed') {\n await this.archiveSession(sessionId);\n }\n\n logger.info(`Ended session: ${sessionId} with status: ${status}`);\n return session;\n }\n\n /**\n * Get a specific session by ID\n */\n async getSession(sessionId: string): Promise {\n await this.db.read();\n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n return session || null;\n }\n\n /**\n * List sessions with optional filtering\n */\n async listSessions(filters?: SessionFilter): Promise {\n await this.db.read();\n let sessions = [...this.db.data.sessions];\n\n if (filters) {\n if (filters.queryPath) {\n sessions = sessions.filter(s => s.queryPath.includes(filters.queryPath!));\n }\n if (filters.status) {\n sessions = sessions.filter(s => s.status === filters.status);\n }\n if (filters.language) {\n sessions = sessions.filter(s => s.language === filters.language);\n }\n if (filters.queryType) {\n sessions = sessions.filter(s => s.queryType === filters.queryType);\n }\n if (filters.dateRange) {\n const [start, end] = filters.dateRange;\n sessions = sessions.filter(s => \n s.startTime >= start && s.startTime <= end\n );\n }\n }\n\n return sessions;\n }\n\n /**\n * Update session state\n */\n async updateSessionState(\n sessionId: string,\n stateUpdate: Partial\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.currentState = {\n ...session.currentState,\n ...stateUpdate,\n lastActivity: new Date().toISOString(),\n };\n\n await this.db.write();\n return session;\n }\n\n /**\n * Add MCP call record to session\n */\n async addMCPCall(sessionId: string, callRecord: MCPCallRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for MCP call: ${sessionId}`);\n return;\n }\n\n session.mcpCalls.push(callRecord);\n session.currentState.lastActivity = callRecord.timestamp;\n\n // Update next suggested tool if provided\n if (callRecord.nextSuggestedTool) {\n session.nextSuggestedTool = callRecord.nextSuggestedTool;\n }\n\n await this.db.write();\n }\n\n /**\n * Add test execution record to session\n */\n async addTestExecution(sessionId: string, testRecord: TestExecutionRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for test execution: ${sessionId}`);\n return;\n }\n\n session.testExecutions.push(testRecord);\n session.currentState.lastActivity = testRecord.timestamp;\n\n // Update compilation/test status based on execution\n if (testRecord.type === 'compilation') {\n session.currentState.compilationStatus = testRecord.success ? 'success' : 'failed';\n } else if (testRecord.type === 'test_run') {\n session.currentState.testStatus = testRecord.success ? 'passing' : 'failing';\n }\n\n await this.db.write();\n }\n\n /**\n * Add quality score record to session\n */\n async addQualityScore(sessionId: string, scoreRecord: QualityScoreRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for quality score: ${sessionId}`);\n return;\n }\n\n session.qualityScores.push(scoreRecord);\n session.currentState.lastActivity = scoreRecord.timestamp;\n session.recommendations = scoreRecord.recommendations;\n\n await this.db.write();\n }\n\n /**\n * Archive a completed session to monthly file\n */\n private async archiveSession(sessionId: string): Promise {\n try {\n const session = await this.getSession(sessionId);\n if (!session) return;\n\n const date = new Date(session.endTime || session.startTime);\n const monthDir = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;\n const archiveDir = join(this.storageDir, 'sessions-archive', monthDir);\n\n mkdirSync(archiveDir, { recursive: true });\n\n const archiveFile = join(archiveDir, `${sessionId}.json`);\n writeFileSync(archiveFile, JSON.stringify(session, null, 2));\n\n // Remove from active sessions\n await this.db.read();\n this.db.data.sessions = this.db.data.sessions.filter(s => s.sessionId !== sessionId);\n await this.db.write();\n\n logger.info(`Archived session: ${sessionId} to ${archiveFile}`);\n } catch (error) {\n logger.error(`Failed to archive session ${sessionId}:`, error);\n }\n }\n\n /**\n * Get active sessions for a specific query path\n */\n async getActiveSessionsForQuery(queryPath: string): Promise {\n await this.db.read();\n return this.db.data.sessions.filter(s => \n s.queryPath === queryPath && s.status === 'active'\n );\n }\n\n /**\n * Clean up old sessions based on retention policy\n */\n async cleanupOldSessions(): Promise {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);\n const cutoffTimestamp = cutoffDate.toISOString();\n\n await this.db.read();\n const sessionsToRemove = this.db.data.sessions.filter(s => \n s.endTime && s.endTime < cutoffTimestamp\n );\n\n if (sessionsToRemove.length > 0) {\n this.db.data.sessions = this.db.data.sessions.filter(s => \n !s.endTime || s.endTime >= cutoffTimestamp\n );\n await this.db.write();\n\n logger.info(`Cleaned up ${sessionsToRemove.length} old sessions`);\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): MonitoringConfig {\n return this.config;\n }\n\n /**\n * Update configuration\n */\n async updateConfig(configUpdate: Partial): Promise {\n this.config = MonitoringConfigSchema.parse({\n ...this.config,\n ...configUpdate,\n });\n\n // Update config.json file only\n const configPath = join(this.storageDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(this.config, null, 2));\n\n logger.info('Updated monitoring configuration');\n }\n}\n\n/**\n * Parse boolean environment variable\n */\nfunction parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolean {\n if (envVar === undefined) return defaultValue;\n return envVar.toLowerCase() === 'true' || envVar === '1';\n}\n\n// Export singleton instance with environment variable support\nexport const sessionDataManager = new SessionDataManager({\n storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getPackageRootDir(), '.ql-mcp-tracking'),\n enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false),\n});", "import { z } from 'zod';\n\n/**\n * Monitoring and Reporting types for CodeQL Development MCP Server\n * Based on the specification in docs/mcp-server-monitoring-and-reporting.md\n */\n\n/**\n * MCP Call Record - captures individual MCP tool calls\n */\nexport const MCPCallRecordSchema = z.object({\n callId: z.string(),\n timestamp: z.string(), // ISO timestamp\n toolName: z.string(),\n parameters: z.record(z.any()),\n result: z.any(),\n success: z.boolean(),\n duration: z.number(), // milliseconds\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type MCPCallRecord = z.infer;\n\n/**\n * Test Execution Record - captures query compilation and test runs\n */\nexport const TestExecutionRecordSchema = z.object({\n executionId: z.string(),\n timestamp: z.string(),\n type: z.enum(['compilation', 'test_run', 'database_build']),\n success: z.boolean(),\n details: z.record(z.any()),\n metrics: z.object({\n passRate: z.number().optional(),\n coverage: z.number().optional(),\n performance: z.number().optional(),\n }).optional(),\n});\n\nexport type TestExecutionRecord = z.infer;\n\n/**\n * Quality Score Record - multi-dimensional quality assessment\n */\nexport const QualityScoreRecordSchema = z.object({\n scoreId: z.string(),\n timestamp: z.string(),\n overallScore: z.number().min(0).max(100), // 0-100\n dimensions: z.object({\n syntacticCorrectness: z.number().min(0).max(100),\n testCoverageResults: z.number().min(0).max(100),\n documentationQuality: z.number().min(0).max(100),\n functionalCorrectness: z.number().min(0).max(100),\n }),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n recommendations: z.array(z.string()),\n});\n\nexport type QualityScoreRecord = z.infer;\n\n/**\n * Query State - current state of the query development\n */\nexport const QueryStateSchema = z.object({\n filesPresent: z.array(z.string()),\n compilationStatus: z.enum(['unknown', 'success', 'failed']),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']),\n lastActivity: z.string(), // ISO timestamp\n});\n\nexport type QueryState = z.infer;\n\n/**\n * Query Development Session - main data structure for tracking\n */\nexport const QueryDevelopmentSessionSchema = z.object({\n // Session Metadata\n sessionId: z.string(),\n queryPath: z.string(),\n language: z.string(),\n queryType: z.string().optional(),\n description: z.string().optional(),\n startTime: z.string(), // ISO timestamp\n endTime: z.string().optional(), // ISO timestamp\n status: z.enum(['active', 'completed', 'failed', 'abandoned']),\n\n // MCP Call History\n mcpCalls: z.array(MCPCallRecordSchema),\n\n // Test Execution Records\n testExecutions: z.array(TestExecutionRecordSchema),\n\n // Quality Metrics\n qualityScores: z.array(QualityScoreRecordSchema),\n\n // Development State\n currentState: QueryStateSchema,\n recommendations: z.array(z.string()),\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type QueryDevelopmentSession = z.infer;\n\n/**\n * Session Filter for listing and searching\n */\nexport const SessionFilterSchema = z.object({\n queryPath: z.string().optional(),\n status: z.string().optional(),\n dateRange: z.tuple([z.string(), z.string()]).optional(),\n language: z.string().optional(),\n queryType: z.string().optional(),\n});\n\nexport type SessionFilter = z.infer;\n\n/**\n * Comparison Report for analyzing multiple sessions\n */\nexport const ComparisonReportSchema = z.object({\n sessionIds: z.array(z.string()),\n dimensions: z.array(z.string()),\n timestamp: z.string(),\n results: z.record(z.any()),\n});\n\nexport type ComparisonReport = z.infer;\n\n/**\n * Aggregate Report for batch analysis\n */\nexport const AggregateReportSchema = z.object({\n filters: SessionFilterSchema,\n timestamp: z.string(),\n totalSessions: z.number(),\n successRate: z.number(),\n averageQualityScore: z.number(),\n commonPatterns: z.array(z.string()),\n recommendations: z.array(z.string()),\n});\n\nexport type AggregateReport = z.infer;\n\n/**\n * Export Result for data export operations\n */\nexport const ExportResultSchema = z.object({\n format: z.enum(['json', 'html', 'markdown']),\n filename: z.string(),\n content: z.string(),\n timestamp: z.string(),\n});\n\nexport type ExportResult = z.infer;\n\n/**\n * Functional Test Result for automated testing\n */\nexport const FunctionalTestResultSchema = z.object({\n sessionId: z.string(),\n queryPath: z.string(),\n passed: z.boolean(),\n criteria: z.record(z.any()),\n details: z.record(z.any()),\n timestamp: z.string(),\n});\n\nexport type FunctionalTestResult = z.infer;\n\n/**\n * Test Report for comprehensive test analysis\n */\nexport const TestReportSchema = z.object({\n sessionIds: z.array(z.string()),\n criteria: z.record(z.any()),\n timestamp: z.string(),\n overallPassRate: z.number(),\n results: z.array(FunctionalTestResultSchema),\n summary: z.record(z.any()),\n});\n\nexport type TestReport = z.infer;\n\n/**\n * Monitoring Configuration\n */\nexport const MonitoringConfigSchema = z.object({\n storageLocation: z.string().default('.ql-mcp-tracking/'),\n autoTrackSessions: z.boolean().default(true),\n retentionDays: z.number().default(90),\n includeCallParameters: z.boolean().default(true),\n includeCallResults: z.boolean().default(true),\n maxActiveSessionsPerQuery: z.number().default(3),\n scoringFrequency: z.enum(['per_call', 'periodic', 'manual']).default('per_call'),\n archiveCompletedSessions: z.boolean().default(true),\n enableRecommendations: z.boolean().default(true),\n enableMonitoringTools: z.boolean().default(false), // Opt-in: session_* tools disabled by default for end-users\n});\n\nexport type MonitoringConfig = z.infer;"], + "mappings": "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", + "names": ["binary", "dirname", "existsSync", "readFileSync", "resolve", "pathToFileURL", "z", "dirname", "isAbsolute", "mkdirSync", "existsSync", "join", "resolve", "mkdirSync", "resolve", "existsSync", "mkdirSync", "timestamp", "join", "writeFileSync", "existsSync", "mkdirSync", "basename", "dirname", "isAbsolute", "join", "resolve", "isAbsolute", "resolve", "join", "writeFileSync", "existsSync", "logger", "executeCodeQLCommand", "basename", "mkdirSync", "dirname", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "readFile", "z", "exception", "map", "schema", "type", "extend", "str", "string", "z", "z", "z", "z", "z", "z", "setTimeout", "delimiter", "join", "delimiter", "resolve", "setTimeout", "join", "join", "resolve", "pathToFileURL", "z", "z", "z", "z", "z", "z", "writeFileSync", "readFileSync", "existsSync", "join", "dirname", "basename", "mkdirSync", "z", "z", "z", "z", "z", "z", "join", "resolve", "resolve", "join", "z", "z", "resolve", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "fs", "path", "getLanguageExtension", "z", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "readFileSync", "existsSync", "join", "join", "existsSync", "readFileSync", "z", "basename", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "z", "basename", "z", "randomUUID", "readFileSync", "writeFileSync", "path", "path", "readFileSync", "str", "writeFileSync", "parse", "mkdirSync", "writeFileSync", "join", "z", "join", "mkdirSync", "writeFileSync", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/scripts/test-codeql-path-invalid.sh b/server/scripts/test-codeql-path-invalid.sh new file mode 100755 index 00000000..30c59ce1 --- /dev/null +++ b/server/scripts/test-codeql-path-invalid.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +set -euo pipefail + +## +## Test: Server must fail at startup when CODEQL_PATH points to a non-existent file. +## +## Usage: +## ./server/scripts/test-codeql-path-invalid.sh [] +## +## Arguments: +## Path to the server JS bundle (default: server/dist/codeql-development-mcp-server.js) +## +## Environment: +## CLEAN_PATH Optional. When set, PATH is replaced with this value so that +## codeql is not discoverable via PATH. When unset, the current +## PATH is used as-is (useful for local testing). +## +## Exit codes: +## 0 Server failed at startup with the expected CODEQL_PATH error +## 1 Unexpected behavior (server did not fail, wrong error, etc.) +## + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +SERVER_BUNDLE="${1:-server/dist/codeql-development-mcp-server.js}" + +# Resolve relative paths against the repo root +if [[ ! "${SERVER_BUNDLE}" = /* ]]; then + SERVER_BUNDLE="${REPO_ROOT}/${SERVER_BUNDLE}" +fi + +if [[ ! -f "${SERVER_BUNDLE}" ]]; then + echo "::error::Server bundle not found: ${SERVER_BUNDLE}" + exit 1 +fi + +# Replace PATH with CLEAN_PATH when provided +if [[ -n "${CLEAN_PATH:-}" ]]; then + export PATH="${CLEAN_PATH}" +fi + +# Point CODEQL_PATH at a non-existent file +export CODEQL_PATH="/nonexistent/path/to/codeql" + +echo "=== Test: Server must fail when CODEQL_PATH is invalid ===" +echo " SERVER_BUNDLE=${SERVER_BUNDLE}" +echo " CODEQL_PATH=${CODEQL_PATH}" + +# Run the server directly (no pipe) with a watchdog timeout. +# Feed /dev/null to stdin so the STDIO transport gets immediate EOF and the +# process can exit cleanly after the startup error. +# NOTE: We avoid GNU `timeout` because it may not be available on macOS CI runners. +STDOUT_FILE="$(mktemp)" +STDERR_FILE="$(mktemp)" +cleanup() { rm -f "${STDOUT_FILE}" "${STDERR_FILE}"; } +trap cleanup EXIT + +node "${SERVER_BUNDLE}" \ + < /dev/null \ + > "${STDOUT_FILE}" \ + 2> "${STDERR_FILE}" & +SERVER_PID=$! + +# Watchdog: kill the server if it hasn't exited within 15 seconds +( sleep 15; kill "${SERVER_PID}" 2>/dev/null ) & +WATCHDOG_PID=$! + +wait "${SERVER_PID}" 2>/dev/null && EXIT_CODE=0 || EXIT_CODE=$? + +# Cancel the watchdog if the server exited on its own +kill "${WATCHDOG_PID}" 2>/dev/null || true +wait "${WATCHDOG_PID}" 2>/dev/null || true + +echo " Exit code: ${EXIT_CODE}" + +if [[ "${EXIT_CODE}" -ne 0 ]] && grep -qi "does not exist" "${STDERR_FILE}"; then + echo "" + echo "--- stderr (first 20 lines) ---" + head -20 "${STDERR_FILE}" + echo "" + echo "✅ PASS: Server failed at startup with expected CODEQL_PATH error" + exit 0 +else + echo "" + echo "::error::Unexpected behavior (exit=${EXIT_CODE})" + echo "--- stderr ---" + cat "${STDERR_FILE}" + echo "--- stdout ---" + cat "${STDOUT_FILE}" + exit 1 +fi diff --git a/server/scripts/test-codeql-path-missing.sh b/server/scripts/test-codeql-path-missing.sh new file mode 100755 index 00000000..30ce48f4 --- /dev/null +++ b/server/scripts/test-codeql-path-missing.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +set -euo pipefail + +## +## Test: Server must fail at startup when codeql is not on PATH and CODEQL_PATH +## is not set. +## +## Usage: +## ./server/scripts/test-codeql-path-missing.sh [] +## +## Arguments: +## Path to the server JS bundle (default: server/dist/codeql-development-mcp-server.js) +## +## Environment: +## CLEAN_PATH Optional. A PATH value that does NOT include codeql. +## When unset, the script auto-builds a clean PATH by removing +## directories that contain a codeql binary. +## +## Exit codes: +## 0 Server failed at startup with the expected "not reachable" error +## 1 Unexpected behavior (server did not fail, wrong error, etc.) +## + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +SERVER_BUNDLE="${1:-server/dist/codeql-development-mcp-server.js}" + +# Resolve relative paths against the repo root +if [[ ! "${SERVER_BUNDLE}" = /* ]]; then + SERVER_BUNDLE="${REPO_ROOT}/${SERVER_BUNDLE}" +fi + +if [[ ! -f "${SERVER_BUNDLE}" ]]; then + echo "::error::Server bundle not found: ${SERVER_BUNDLE}" + exit 1 +fi + +# CLEAN_PATH is required for this test — we need a PATH without codeql +if [[ -z "${CLEAN_PATH:-}" ]]; then + # Build CLEAN_PATH automatically by removing every directory that contains + # a codeql binary (either by name match or by actual file presence). + CLEAN_PATH="" + IFS=':' read -ra PARTS <<< "${PATH}" + for part in "${PARTS[@]}"; do + case "$part" in + *codeql*|*gh-codeql*) continue ;; + esac + # Also skip dirs that contain a codeql binary (e.g. /usr/local/bin) + if [[ -x "${part}/codeql" ]] || [[ -x "${part}/codeql.exe" ]]; then + continue + fi + CLEAN_PATH="${CLEAN_PATH:+${CLEAN_PATH}:}${part}" + done +fi + +# Verify codeql is NOT findable on the clean PATH +if PATH="${CLEAN_PATH}" command -v codeql >/dev/null 2>&1; then + echo "::error::codeql is still discoverable after PATH cleanup — cannot run this test" + exit 1 +fi + +export PATH="${CLEAN_PATH}" + +# Ensure CODEQL_PATH is NOT set +unset CODEQL_PATH + +echo "=== Test: Server must fail when codeql is not on PATH and CODEQL_PATH is unset ===" +echo " SERVER_BUNDLE=${SERVER_BUNDLE}" +echo " CODEQL_PATH=(unset)" + +STDOUT_FILE="$(mktemp)" +STDERR_FILE="$(mktemp)" +cleanup() { rm -f "${STDOUT_FILE}" "${STDERR_FILE}"; } +trap cleanup EXIT + +# NOTE: We avoid GNU `timeout` because it may not be available on macOS CI runners. +node "${SERVER_BUNDLE}" \ + < /dev/null \ + > "${STDOUT_FILE}" \ + 2> "${STDERR_FILE}" & +SERVER_PID=$! + +# Watchdog: kill the server if it hasn't exited within 30 seconds +( sleep 30; kill "${SERVER_PID}" 2>/dev/null ) & +WATCHDOG_PID=$! + +wait "${SERVER_PID}" 2>/dev/null && EXIT_CODE=0 || EXIT_CODE=$? + +# Cancel the watchdog if the server exited on its own +kill "${WATCHDOG_PID}" 2>/dev/null || true +wait "${WATCHDOG_PID}" 2>/dev/null || true + +echo " Exit code: ${EXIT_CODE}" + +if [[ "${EXIT_CODE}" -ne 0 ]] && grep -qi "not reachable" "${STDERR_FILE}"; then + echo "" + echo "--- stderr (first 20 lines) ---" + head -20 "${STDERR_FILE}" + echo "" + echo "✅ PASS: Server failed at startup — CodeQL CLI not reachable" + exit 0 +else + echo "" + echo "::error::Unexpected behavior (exit=${EXIT_CODE})" + echo "--- stderr ---" + cat "${STDERR_FILE}" + echo "--- stdout ---" + cat "${STDOUT_FILE}" + exit 1 +fi diff --git a/server/scripts/test-codeql-path-valid.sh b/server/scripts/test-codeql-path-valid.sh new file mode 100755 index 00000000..6b711c34 --- /dev/null +++ b/server/scripts/test-codeql-path-valid.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash +set -euo pipefail + +## +## Test: Server must start successfully when CODEQL_PATH points to a valid +## CodeQL binary, even when codeql is NOT on PATH. +## +## Usage: +## ./server/scripts/test-codeql-path-valid.sh [] +## +## Arguments: +## Absolute path to a valid CodeQL CLI binary +## Path to the server JS bundle (default: server/dist/codeql-development-mcp-server.js) +## +## Environment: +## CLEAN_PATH Optional. When set, PATH is replaced with this value so that +## codeql is not discoverable via PATH. When unset, the current +## PATH is used as-is (useful for local testing). +## +## Exit codes: +## 0 Server started successfully and was shut down cleanly +## 1 Server failed to start or exited prematurely +## + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +if [[ $# -lt 1 ]]; then + echo "Usage: $0 []" + exit 1 +fi + +CODEQL_BINARY="$1" +SERVER_BUNDLE="${2:-server/dist/codeql-development-mcp-server.js}" + +# Resolve relative paths against the repo root +if [[ ! "${SERVER_BUNDLE}" = /* ]]; then + SERVER_BUNDLE="${REPO_ROOT}/${SERVER_BUNDLE}" +fi + +if [[ ! -f "${SERVER_BUNDLE}" ]]; then + echo "::error::Server bundle not found: ${SERVER_BUNDLE}" + exit 1 +fi + +if [[ ! -f "${CODEQL_BINARY}" ]]; then + echo "::error::CodeQL binary not found: ${CODEQL_BINARY}" + exit 1 +fi + +# Replace PATH with CLEAN_PATH when provided (CI strips codeql from PATH) +if [[ -n "${CLEAN_PATH:-}" ]]; then + export PATH="${CLEAN_PATH}" +fi + +export CODEQL_PATH="${CODEQL_BINARY}" + +echo "=== Test: Server must start with valid CODEQL_PATH ===" +echo " SERVER_BUNDLE=${SERVER_BUNDLE}" +echo " CODEQL_PATH=${CODEQL_PATH}" +echo " codeql in PATH: $(command -v codeql 2>/dev/null || echo 'not found')" + +STDERR_FILE="$(mktemp)" +cleanup() { + rm -f "${STDERR_FILE}" + # Kill the server if still running + if [[ -n "${SERVER_PID:-}" ]] && kill -0 "${SERVER_PID}" 2>/dev/null; then + kill "${SERVER_PID}" 2>/dev/null || true + wait "${SERVER_PID}" 2>/dev/null || true + fi + # Kill the FIFO feeder and its children (e.g. sleep) if still running + if [[ -n "${FEEDER_PID:-}" ]]; then + kill "${FEEDER_PID}" 2>/dev/null || true + # Also kill the process group to catch child processes like sleep + kill -- -"${FEEDER_PID}" 2>/dev/null || true + fi + # Remove the FIFO + if [[ -n "${FIFO:-}" ]]; then + rm -f "${FIFO}" + fi +} +trap cleanup EXIT + +# Start the server in the background. +# Use a long-running stdin feeder as a SEPARATE backgrounded process, then +# connect it to the server via a named pipe (FIFO) to avoid bash subshell +# PID issues with `A | B &`. +FIFO="$(mktemp -u)" +mkfifo "${FIFO}" 2>/dev/null || { + # mkfifo may not exist on Windows Git Bash — fall back to /dev/null stdin. + # The server will exit immediately on EOF but we can still check if startup + # succeeds before the transport closes. + FIFO="" +} + +if [[ -n "${FIFO}" ]]; then + # Feed the FIFO in the background so the server's stdin stays open + ( sleep 30 > "${FIFO}" ) & + FEEDER_PID=$! + + node "${SERVER_BUNDLE}" < "${FIFO}" > /dev/null 2> "${STDERR_FILE}" & + SERVER_PID=$! +else + # Fallback: use process substitution to keep stdin open + node "${SERVER_BUNDLE}" < <(sleep 30) > /dev/null 2> "${STDERR_FILE}" & + SERVER_PID=$! +fi + +echo " Server PID: ${SERVER_PID}" + +# Give the server time to either start successfully or crash +sleep 5 + +if kill -0 "${SERVER_PID}" 2>/dev/null; then + echo "" + echo "--- startup logs ---" + cat "${STDERR_FILE}" + + # Verify stderr confirms CODEQL_PATH was used + if grep -q "CODEQL_PATH" "${STDERR_FILE}"; then + echo "✅ Server logged CODEQL_PATH resolution" + else + echo "⚠️ CODEQL_PATH not mentioned in stderr (non-fatal)" + fi + + echo "" + echo "✅ PASS: Server is running after 5 seconds (PID ${SERVER_PID})" + # Cleanup is handled by the EXIT trap + exit 0 +else + wait "${SERVER_PID}" 2>/dev/null && EXIT_CODE=0 || EXIT_CODE=$? + echo "" + echo "::error::Server exited prematurely with code ${EXIT_CODE}" + echo "--- stderr ---" + cat "${STDERR_FILE}" + # Cleanup is handled by the EXIT trap + exit 1 +fi diff --git a/server/src/codeql-development-mcp-server.ts b/server/src/codeql-development-mcp-server.ts index f62c20b4..bef00217 100644 --- a/server/src/codeql-development-mcp-server.ts +++ b/server/src/codeql-development-mcp-server.ts @@ -16,7 +16,7 @@ import { registerLanguageResources } from './resources/language-resources'; import { registerWorkflowPrompts } from './prompts/workflow-prompts'; import { registerMonitoringTools } from './tools/monitoring-tools'; import { sessionDataManager } from './lib/session-data-manager'; -import { resolveCodeQLBinary } from './lib/cli-executor'; +import { resolveCodeQLBinary, validateCodeQLBinaryReachable } from './lib/cli-executor'; import { packageRootDir } from './utils/package-paths'; import { logger } from './utils/logger'; @@ -40,6 +40,12 @@ export async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise { + const binary = resolvedBinaryResult ?? 'codeql'; + const env = { ...process.env }; + if (resolvedCodeQLDir) { + env.PATH = resolvedCodeQLDir + delimiter + (env.PATH || ''); + } + + try { + const { stdout } = await execFileAsync(binary, ['version', '--format=terse'], { + env, + timeout: 15_000, + }); + return stdout.trim(); + } catch (err: unknown) { + const message = err instanceof Error ? err.message : String(err); + throw new Error( + `CodeQL CLI is not reachable (binary: ${binary}). ` + + `Ensure codeql is on PATH or set the CODEQL_PATH environment variable ` + + `to the absolute path of the CodeQL CLI binary. Details: ${message}` + ); + } } /** diff --git a/server/src/lib/cli-tool-registry.ts b/server/src/lib/cli-tool-registry.ts index 8f4b97f9..8338ca60 100644 --- a/server/src/lib/cli-tool-registry.ts +++ b/server/src/lib/cli-tool-registry.ts @@ -226,7 +226,7 @@ export function registerCLITool(server: McpServer, definition: CLIToolDefinition case 'codeql_query_run': { // Resolve database path to absolute path if it's relative - if (options.database && typeof options.database === 'string' && !options.database.startsWith('/')) { + if (options.database && typeof options.database === 'string' && !isAbsolute(options.database)) { options.database = resolve(workspaceRootDir, options.database); logger.info(`Resolved database path to: ${options.database}`); } @@ -394,9 +394,14 @@ export function registerCLITool(server: McpServer, definition: CLIToolDefinition cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd); } - // Add --additional-packs for commands that need to access local test packs - const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS || resolve(packageRootDir, 'ql', 'javascript', 'examples'); - if (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile') { + // Add --additional-packs for commands that need to access local test packs. + // Only set the default examples path when it actually exists on disk + // (it may be absent in npm-installed layouts where ql/javascript/examples/ + // is not included in the published package). + const defaultExamplesPath = resolve(packageRootDir, 'ql', 'javascript', 'examples'); + const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS + || (existsSync(defaultExamplesPath) ? defaultExamplesPath : undefined); + if (additionalPacksPath && (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile')) { options['additional-packs'] = additionalPacksPath; } diff --git a/server/src/utils/temp-dir.ts b/server/src/utils/temp-dir.ts index bef3a154..fd69e463 100644 --- a/server/src/utils/temp-dir.ts +++ b/server/src/utils/temp-dir.ts @@ -13,7 +13,7 @@ import { getPackageRootDir } from './package-paths'; /** * Base directory for all project-local temporary data. - * Stored under `/.tmp` and excluded from version control. + * Stored under `/.tmp` and excluded from version control. */ const PROJECT_TMP_BASE = join(getPackageRootDir(), '.tmp'); diff --git a/server/test/src/lib/cli-executor.test.ts b/server/test/src/lib/cli-executor.test.ts index f9d2b6db..b2968cf5 100644 --- a/server/test/src/lib/cli-executor.test.ts +++ b/server/test/src/lib/cli-executor.test.ts @@ -5,8 +5,8 @@ import { describe, it, expect, beforeAll, afterAll, afterEach, vi } from 'vitest'; import { mkdirSync, writeFileSync, rmSync, chmodSync } from 'fs'; import { join } from 'path'; -import { - buildCodeQLArgs, +import { + buildCodeQLArgs, buildQLTArgs, executeCLICommand, enableTestCommands, @@ -15,7 +15,8 @@ import { getResolvedCodeQLDir, resetResolvedCodeQLBinary, sanitizeCLIArgument, - sanitizeCLIArguments + sanitizeCLIArguments, + validateCodeQLBinaryReachable } from '../../../src/lib/cli-executor'; // Mock the logger to suppress expected error output @@ -680,6 +681,18 @@ describe('CODEQL_PATH - PATH prepend integration', () => { resetResolvedCodeQLBinary(); }); + it('should cache resolved value and ignore subsequent env changes', () => { + delete process.env.CODEQL_PATH; + const first = resolveCodeQLBinary(); + expect(first).toBe('codeql'); + + // Change the env after resolution — should still return cached value + process.env.CODEQL_PATH = '/some/changed/path/codeql'; + const second = resolveCodeQLBinary(); + expect(second).toBe('codeql'); + expect(getResolvedCodeQLDir()).toBeNull(); + }); + it('should prepend CODEQL_PATH directory to child process PATH', async () => { // Create a temporary directory with a fake "codeql" script const tmpDir = join(process.cwd(), '.tmp', 'codeql-path-prepend-test'); @@ -705,4 +718,64 @@ describe('CODEQL_PATH - PATH prepend integration', () => { rmSync(tmpDir, { recursive: true, force: true }); } }); -}); \ No newline at end of file +}); + +describe('validateCodeQLBinaryReachable', () => { + const originalEnv = process.env.CODEQL_PATH; + + afterEach(() => { + if (originalEnv === undefined) { + delete process.env.CODEQL_PATH; + } else { + process.env.CODEQL_PATH = originalEnv; + } + resetResolvedCodeQLBinary(); + }); + + it('should return a version string when codeql is on PATH', async () => { + // Use the default PATH-based resolution (codeql must be on PATH for tests) + delete process.env.CODEQL_PATH; + resolveCodeQLBinary(); + + const version = await validateCodeQLBinaryReachable(); + expect(version).toBeTruthy(); + // Version should be a semver-like string (e.g. "2.23.9") + expect(version).toMatch(/^\d+\.\d+\.\d+/); + }); + + it('should throw a descriptive error when codeql is not reachable', async () => { + // Create a temporary directory with a fake "codeql" that exits with error + const tmpDir = join(process.cwd(), '.tmp', 'codeql-unreachable-test'); + const codeqlPath = join(tmpDir, 'codeql'); + mkdirSync(tmpDir, { recursive: true }); + // Create a script that fails immediately + writeFileSync(codeqlPath, '#!/bin/sh\nexit 1', { mode: 0o755 }); + chmodSync(codeqlPath, 0o755); + + try { + process.env.CODEQL_PATH = codeqlPath; + resolveCodeQLBinary(); + + await expect(validateCodeQLBinaryReachable()).rejects.toThrow('not reachable'); + } finally { + rmSync(tmpDir, { recursive: true, force: true }); + } + }); + + it('should include guidance about CODEQL_PATH in error message', async () => { + const tmpDir = join(process.cwd(), '.tmp', 'codeql-guidance-test'); + const codeqlPath = join(tmpDir, 'codeql'); + mkdirSync(tmpDir, { recursive: true }); + writeFileSync(codeqlPath, '#!/bin/sh\nexit 1', { mode: 0o755 }); + chmodSync(codeqlPath, 0o755); + + try { + process.env.CODEQL_PATH = codeqlPath; + resolveCodeQLBinary(); + + await expect(validateCodeQLBinaryReachable()).rejects.toThrow('CODEQL_PATH'); + } finally { + rmSync(tmpDir, { recursive: true, force: true }); + } + }); +}); diff --git a/server/test/src/utils/package-paths.test.ts b/server/test/src/utils/package-paths.test.ts index 3fbbde62..d87eed68 100644 --- a/server/test/src/utils/package-paths.test.ts +++ b/server/test/src/utils/package-paths.test.ts @@ -41,9 +41,13 @@ describe('getPackageRootDir', () => { }); it('should handle Windows-style paths with backslashes', () => { + if (process.platform !== 'win32') { + // path.resolve() treats backslashes as normal characters on POSIX; + // this test is only meaningful on Windows where they are separators. + return; + } const winPath = 'C:\\Users\\user\\AppData\\Roaming\\npm\\node_modules\\@advanced-security\\codeql-development-mcp-server\\dist'; const result = getPackageRootDir(winPath); - // On Unix, resolve will still work with forward slashes expect(result).toContain('codeql-development-mcp-server'); expect(result).not.toContain('dist'); }); From e8ebe6a8e4fd1cefdc122bfac833cc662ad9a8f7 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sat, 7 Feb 2026 21:49:54 -0700 Subject: [PATCH 3/9] Attempted fix for cli-executor.test.ts --- server/test/src/lib/cli-executor.test.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/server/test/src/lib/cli-executor.test.ts b/server/test/src/lib/cli-executor.test.ts index b2968cf5..47cef27c 100644 --- a/server/test/src/lib/cli-executor.test.ts +++ b/server/test/src/lib/cli-executor.test.ts @@ -4,6 +4,7 @@ import { describe, it, expect, beforeAll, afterAll, afterEach, vi } from 'vitest'; import { mkdirSync, writeFileSync, rmSync, chmodSync } from 'fs'; +import { execFileSync } from 'child_process'; import { join } from 'path'; import { buildCodeQLArgs, @@ -720,6 +721,15 @@ describe('CODEQL_PATH - PATH prepend integration', () => { }); }); +// Check if codeql is available on PATH (may not be in CI environments like build-server) +let codeqlOnPath = false; +try { + execFileSync('codeql', ['version', '--format=terse'], { timeout: 5000 }); + codeqlOnPath = true; +} catch { + codeqlOnPath = false; +} + describe('validateCodeQLBinaryReachable', () => { const originalEnv = process.env.CODEQL_PATH; @@ -732,7 +742,7 @@ describe('validateCodeQLBinaryReachable', () => { resetResolvedCodeQLBinary(); }); - it('should return a version string when codeql is on PATH', async () => { + it.skipIf(!codeqlOnPath)('should return a version string when codeql is on PATH', async () => { // Use the default PATH-based resolution (codeql must be on PATH for tests) delete process.env.CODEQL_PATH; resolveCodeQLBinary(); From c3abc68065fbc611a3b56915930ca77932b56d0c Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sat, 7 Feb 2026 21:59:07 -0700 Subject: [PATCH 4/9] Attempted fix for codeql-path-tests on windows-latest --- server/scripts/test-codeql-path-valid.sh | 25 ++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/server/scripts/test-codeql-path-valid.sh b/server/scripts/test-codeql-path-valid.sh index 6b711c34..5c8f5070 100755 --- a/server/scripts/test-codeql-path-valid.sh +++ b/server/scripts/test-codeql-path-valid.sh @@ -111,24 +111,45 @@ echo " Server PID: ${SERVER_PID}" # Give the server time to either start successfully or crash sleep 5 -if kill -0 "${SERVER_PID}" 2>/dev/null; then +# Helper: check whether stderr proves the server started successfully and +# resolved the CodeQL CLI via CODEQL_PATH. +check_startup_logs() { echo "" echo "--- startup logs ---" cat "${STDERR_FILE}" - # Verify stderr confirms CODEQL_PATH was used if grep -q "CODEQL_PATH" "${STDERR_FILE}"; then echo "✅ Server logged CODEQL_PATH resolution" else echo "⚠️ CODEQL_PATH not mentioned in stderr (non-fatal)" fi + # The definitive success marker logged by the server + if grep -q "McpServer started successfully" "${STDERR_FILE}"; then + return 0 + fi + return 1 +} + +if kill -0 "${SERVER_PID}" 2>/dev/null; then + check_startup_logs echo "" echo "✅ PASS: Server is running after 5 seconds (PID ${SERVER_PID})" # Cleanup is handled by the EXIT trap exit 0 else wait "${SERVER_PID}" 2>/dev/null && EXIT_CODE=0 || EXIT_CODE=$? + + # On Windows, mkfifo is unavailable and the process-substitution fallback + # may not keep stdin open reliably. When the STDIO transport receives EOF + # the server shuts down cleanly (exit 0) even though startup succeeded. + # Accept that as a pass when the logs prove the server started correctly. + if [[ "${EXIT_CODE}" -eq 0 ]] && check_startup_logs; then + echo "" + echo "✅ PASS: Server started successfully (exited cleanly after stdin EOF)" + exit 0 + fi + echo "" echo "::error::Server exited prematurely with code ${EXIT_CODE}" echo "--- stderr ---" From 6fa24e9112661a81829b305e50d9ecc4fb9b26e2 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sat, 7 Feb 2026 22:04:01 -0700 Subject: [PATCH 5/9] Address more PR review comments --- server/dist/codeql-development-mcp-server.js | 4 ++-- .../dist/codeql-development-mcp-server.js.map | 4 ++-- server/package.json | 1 - server/src/lib/cli-executor.ts | 2 +- server/src/utils/package-paths.ts | 6 +++++- server/test/src/lib/cli-executor.test.ts | 19 ++++++++----------- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index 534d67c6..45dd4689 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -99,7 +99,7 @@ function resolveCodeQLBinary() { ); } resolvedCodeQLDir = dirname(envPath); - resolvedBinaryResult = envPath; + resolvedBinaryResult = "codeql"; logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`); return resolvedBinaryResult; } @@ -352,7 +352,7 @@ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs"; import { fileURLToPath } from "url"; function isRunningFromSource(dir) { const normalized = dir.replace(/\\/g, "/"); - return normalized.includes("/src/"); + return /\/src(\/[^/]+)?$/.test(normalized); } function getPackageRootDir(currentDir = __dirname) { return isRunningFromSource(currentDir) ? resolve(currentDir, "..", "..") : resolve(currentDir, ".."); diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index 2e5f8225..f72b6aa9 100644 --- a/server/dist/codeql-development-mcp-server.js.map +++ b/server/dist/codeql-development-mcp-server.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/utils/logger.ts", "../src/lib/cli-executor.ts", "../src/utils/package-paths.ts", "../src/codeql-development-mcp-server.ts", "../src/tools/codeql/bqrs-decode.ts", "../src/lib/cli-tool-registry.ts", "../src/lib/query-results-evaluator.ts", "../src/lib/log-directory-manager.ts", "../src/utils/temp-dir.ts", "../src/tools/codeql/bqrs-info.ts", "../src/tools/codeql/bqrs-interpret.ts", "../src/tools/codeql/database-analyze.ts", "../src/tools/codeql/database-create.ts", "../src/tools/codeql/find-class-position.ts", "../src/tools/codeql/find-predicate-position.ts", "../src/tools/codeql/find-query-files.ts", "../src/lib/query-file-finder.ts", "../../node_modules/js-yaml/dist/js-yaml.mjs", "../src/lib/metadata-resolver.ts", "../src/tools/codeql/generate-log-summary.ts", "../src/tools/codeql/generate-query-help.ts", "../src/tools/codeql/language-server-eval.ts", "../src/lib/language-server.ts", "../src/tools/codeql/pack-install.ts", "../src/tools/codeql/pack-ls.ts", "../src/tools/codeql/profile-codeql-query.ts", "../src/tools/codeql/query-compile.ts", "../src/tools/codeql/query-format.ts", "../src/tools/codeql/query-run.ts", "../src/tools/codeql/quick-evaluate.ts", "../src/tools/codeql/register-database.ts", "../src/tools/codeql/resolve-database.ts", "../src/tools/codeql/resolve-languages.ts", "../src/tools/codeql/resolve-library-path.ts", "../src/tools/codeql/resolve-metadata.ts", "../src/tools/codeql/resolve-qlref.ts", "../src/tools/codeql/resolve-queries.ts", "../src/tools/codeql/resolve-tests.ts", "../src/tools/codeql/test-accept.ts", "../src/tools/codeql/test-extract.ts", "../src/tools/codeql/test-run.ts", "../src/tools/codeql-tools.ts", "../src/lib/validation.ts", "../src/lib/query-scaffolding.ts", "../src/lib/resources.ts", "../src/tools/codeql-resources.ts", "../src/resources/language-resources.ts", "../src/types/language-types.ts", "../src/prompts/workflow-prompts.ts", "../src/prompts/prompt-loader.ts", "../src/tools/monitoring-tools.ts", "../../node_modules/lowdb/lib/core/Low.js", "../../node_modules/lowdb/lib/adapters/node/TextFile.js", "../../node_modules/lowdb/lib/adapters/node/DataFile.js", "../../node_modules/lowdb/lib/adapters/node/JSONFile.js", "../src/lib/session-data-manager.ts", "../src/types/monitoring.ts"], - "sourcesContent": ["/**\n * Simple logger utility.\n *\n * All log output is written to stderr. In stdio transport mode, stdout is\n * reserved exclusively for the MCP JSON-RPC protocol \u2014 any non-protocol\n * bytes on stdout would corrupt the message stream.\n */\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.error(`[INFO] ${new Date().toISOString()} ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[ERROR] ${new Date().toISOString()} ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n console.error(`[WARN] ${new Date().toISOString()} ${message}`, ...args);\n },\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.error(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args);\n }\n },\n};\n", "/**\n * Generic CLI command execution utilities for CodeQL and QLT commands\n */\n\nimport { execFile } from 'child_process';\nimport { existsSync } from 'fs';\nimport { basename, delimiter, dirname, isAbsolute } from 'path';\nimport { promisify } from 'util';\nimport { logger } from '../utils/logger';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CLIExecutionResult {\n stdout: string;\n stderr: string;\n success: boolean;\n error?: string;\n exitCode?: number;\n}\n\nexport interface CLIExecutionOptions {\n command: string;\n args: string[];\n cwd?: string;\n timeout?: number;\n env?: Record;\n}\n\n// Whitelist of allowed commands to prevent arbitrary command execution\nconst ALLOWED_COMMANDS = new Set([\n 'codeql',\n 'git',\n 'node',\n 'npm',\n 'qlt',\n 'which'\n]);\n\n// Additional commands allowed in test environments\nlet testCommands: Set | null = null;\n\n// Whitelist of safe environment variables to pass to child processes\n// This prevents potentially malicious environment variables from being passed through\nconst SAFE_ENV_VARS = [\n 'HOME', // User home directory\n 'LANG', // Locale setting\n 'LC_ALL', // Locale setting\n 'LC_CTYPE', // Locale setting\n 'PATH', // Required to find executables\n 'SHELL', // User's shell (Unix)\n 'TEMP', // Temporary directory (Windows)\n 'TERM', // Terminal type (Unix)\n 'TMP', // Temporary directory (Windows)\n 'TMPDIR', // Temporary directory (Unix)\n 'USER', // Current user (Unix)\n 'USERNAME', // Current user (Windows)\n] as const;\n\n// Whitelist of safe environment variable prefixes\n// These are needed for CodeQL and Node.js functionality\nconst SAFE_ENV_PREFIXES = [\n 'CODEQL_', // CodeQL-specific variables\n 'NODE_', // Node.js-specific variables (for npm, etc.)\n] as const;\n\n// Pattern for dangerous control characters in CLI arguments\n// Rejected characters:\n// \\x01-\\x08: SOH through BS (start of heading, text, null control chars, backspace)\n// \\x0B: Vertical tab - rarely used legitimately, can cause display issues\n// \\x0C: Form feed - can cause unexpected page breaks in output\n// \\x0E-\\x1F: SO through US (shift out/in, device controls, separators)\n// Allowed characters:\n// \\x00: Null byte - handled separately for clearer error messaging\n// \\x09: Horizontal tab - commonly used in file paths and arguments\n// \\x0A: Newline (LF) - may appear in multi-line arguments\n// \\x0D: Carriage return (CR) - may appear with newlines on Windows\n// eslint-disable-next-line no-control-regex\nconst DANGEROUS_CONTROL_CHARS = /[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Enable test-specific commands for testing purposes\n * This should only be called in test environments\n */\nexport function enableTestCommands(): void {\n testCommands = new Set([\n 'cat',\n 'echo',\n 'ls',\n 'sh',\n 'sleep'\n ]);\n}\n\n/**\n * Disable test-specific commands\n */\nexport function disableTestCommands(): void {\n testCommands = null;\n}\n\n/**\n * Check if a command is allowed\n */\nfunction isCommandAllowed(command: string): boolean {\n return ALLOWED_COMMANDS.has(command) || (testCommands !== null && testCommands.has(command));\n}\n\n// Resolved CodeQL binary directory from CODEQL_PATH.\n// When set, this directory is prepended to PATH for all child processes\n// so that `execFile('codeql', ...)` finds the correct binary via execvp().\n// Using PATH lookup (rather than an absolute path) is essential because\n// execvp() handles shell-script shebangs correctly, whereas passing an\n// absolute path to execFile() can fail with ENOENT for shell scripts.\nlet resolvedCodeQLDir: string | null = null;\n\n// Cached result from resolveCodeQLBinary(). `undefined` means not yet resolved.\nlet resolvedBinaryResult: string | undefined;\n\n/**\n * Resolve the CodeQL CLI binary path.\n *\n * Resolution order:\n * 1. `CODEQL_PATH` environment variable \u2014 must point to an existing file whose\n * basename is `codeql` (or `codeql.exe` / `codeql.cmd` on Windows).\n * The parent directory is prepended to PATH for child processes.\n * 2. Falls back to the bare `codeql` command (resolved via PATH at exec time).\n *\n * The resolved value is cached for the lifetime of the process. Call this once\n * at startup; subsequent calls are a no-op and return the cached value.\n */\nexport function resolveCodeQLBinary(): string {\n // Short-circuit if already resolved\n if (resolvedBinaryResult !== undefined) {\n return resolvedBinaryResult;\n }\n\n const envPath = process.env.CODEQL_PATH;\n\n if (!envPath) {\n resolvedCodeQLDir = null;\n resolvedBinaryResult = 'codeql';\n return resolvedBinaryResult;\n }\n\n // Validate the path points to a plausible CodeQL binary\n const base = basename(envPath).toLowerCase();\n const validBaseNames = ['codeql', 'codeql.exe', 'codeql.cmd'];\n if (!validBaseNames.includes(base)) {\n throw new Error(\n `CODEQL_PATH must point to a CodeQL CLI binary (expected basename: codeql), got: ${base}`\n );\n }\n\n // Require an absolute path to avoid ambiguity\n if (!isAbsolute(envPath)) {\n throw new Error(\n `CODEQL_PATH must be an absolute path, got: ${envPath}`\n );\n }\n\n // Verify the file exists\n if (!existsSync(envPath)) {\n throw new Error(\n `CODEQL_PATH points to a file that does not exist: ${envPath}`\n );\n }\n\n resolvedCodeQLDir = dirname(envPath);\n resolvedBinaryResult = envPath;\n logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`);\n return resolvedBinaryResult;\n}\n\n/**\n * Get the currently resolved CodeQL binary directory, or null if using PATH.\n */\nexport function getResolvedCodeQLDir(): string | null {\n return resolvedCodeQLDir;\n}\n\n/**\n * Reset the resolved CodeQL binary to the default (for testing only).\n */\nexport function resetResolvedCodeQLBinary(): void {\n resolvedCodeQLDir = null;\n resolvedBinaryResult = undefined;\n}\n\n/**\n * Validate that the resolved CodeQL binary is actually callable.\n *\n * Runs `codeql version --format=terse` and verifies the process exits\n * successfully. This catches the case where `CODEQL_PATH` is unset and\n * `codeql` is not on PATH \u2014 the server would otherwise start normally\n * but every tool invocation would fail.\n *\n * @returns The version string reported by the CodeQL CLI.\n * @throws Error if the binary is not reachable or returns a non-zero exit code.\n */\nexport async function validateCodeQLBinaryReachable(): Promise {\n const binary = resolvedBinaryResult ?? 'codeql';\n const env = { ...process.env };\n if (resolvedCodeQLDir) {\n env.PATH = resolvedCodeQLDir + delimiter + (env.PATH || '');\n }\n\n try {\n const { stdout } = await execFileAsync(binary, ['version', '--format=terse'], {\n env,\n timeout: 15_000,\n });\n return stdout.trim();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `CodeQL CLI is not reachable (binary: ${binary}). ` +\n `Ensure codeql is on PATH or set the CODEQL_PATH environment variable ` +\n `to the absolute path of the CodeQL CLI binary. Details: ${message}`\n );\n }\n}\n\n/**\n * Sanitize a CLI argument to prevent potential issues with special characters.\n * \n * While execFile() does not spawn a shell (preventing shell injection), we still\n * validate arguments to:\n * 1. Reject null bytes that could truncate strings in C-based commands\n * 2. Reject control characters that could cause unexpected behavior\n * 3. Provide defense-in-depth against potential issues\n * \n * @param arg - The argument to sanitize\n * @returns The sanitized argument\n * @throws Error if the argument contains dangerous characters\n */\nexport function sanitizeCLIArgument(arg: string): string {\n // Reject null bytes - these can truncate strings in C-based commands\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n if (arg.includes('\\0')) {\n throw new Error(`CLI argument contains null byte: argument rejected for security`);\n }\n \n // Reject control characters using the module-level constant pattern\n if (DANGEROUS_CONTROL_CHARS.test(arg)) {\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n throw new Error(`CLI argument contains control characters: argument rejected for security`);\n }\n \n return arg;\n}\n\n/**\n * Sanitize an array of CLI arguments\n * @param args - The arguments to sanitize\n * @returns The sanitized arguments\n * @throws Error if any argument contains dangerous characters\n */\nexport function sanitizeCLIArguments(args: string[]): string[] {\n return args.map(sanitizeCLIArgument);\n}\n\n/**\n * Filter environment variables to only include safe ones\n * This prevents potentially malicious environment variables from being passed to child processes\n */\nfunction getSafeEnvironment(additionalEnv?: Record): Record {\n const safeEnv: Record = {};\n \n // Copy whitelisted environment variables from process.env\n for (const key of SAFE_ENV_VARS) {\n if (process.env[key] !== undefined) {\n safeEnv[key] = process.env[key]!;\n }\n }\n \n // Copy environment variables with whitelisted prefixes\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && SAFE_ENV_PREFIXES.some(prefix => key.startsWith(prefix))) {\n safeEnv[key] = value;\n }\n }\n \n // When CODEQL_PATH was set, prepend the resolved directory to PATH so that\n // `execFile('codeql', ...)` finds the user-specified binary via execvp().\n // This approach (PATH manipulation + bare command name) is essential because\n // execvp() handles shell-script shebangs correctly, whereas passing an\n // absolute path to execFile() fails with ENOENT for shell-script launchers.\n if (resolvedCodeQLDir && safeEnv.PATH) {\n safeEnv.PATH = `${resolvedCodeQLDir}${delimiter}${safeEnv.PATH}`;\n } else if (resolvedCodeQLDir) {\n safeEnv.PATH = resolvedCodeQLDir;\n }\n \n // Merge with explicitly provided environment variables\n // These are trusted as they come from the application code, not external sources\n if (additionalEnv) {\n Object.assign(safeEnv, additionalEnv);\n }\n \n return safeEnv;\n}\n\n/**\n * Execute a CLI command and return the result.\n * \n * Security: This function uses execFile() instead of exec() to avoid shell interpretation.\n * Arguments are passed directly to the executable as an array, preventing shell injection.\n * Additional security measures include:\n * - Command whitelist validation\n * - Shell metacharacter detection in command names\n * - CLI argument sanitization (null bytes, control characters)\n * - Environment variable filtering\n */\nexport async function executeCLICommand(options: CLIExecutionOptions): Promise {\n try {\n const { command, args, cwd, timeout = 300000, env } = options; // 5 minute default timeout\n \n // Validate command is in the whitelist to prevent arbitrary command execution\n if (!isCommandAllowed(command)) {\n throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`);\n }\n \n // Validate command to ensure it doesn't contain shell metacharacters\n if (command.includes(';') || command.includes('|') || command.includes('&') || \n command.includes('$') || command.includes('`') || command.includes('\\n') ||\n command.includes('\\r')) {\n throw new Error(`Invalid command: contains shell metacharacters: ${command}`);\n }\n \n // Sanitize CLI arguments to prevent issues with special characters\n // This provides defense-in-depth even though execFile() doesn't use a shell\n const sanitizedArgs = sanitizeCLIArguments(args);\n \n logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout });\n \n const execOptions = {\n cwd,\n timeout,\n env: getSafeEnvironment(env),\n };\n \n // execFile() is used instead of exec() to avoid shell interpretation\n // Arguments are passed as an array, not interpolated into a command string\n const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions);\n\n return {\n stdout,\n stderr,\n success: true,\n exitCode: 0\n };\n\n } catch (error: unknown) {\n logger.error('CLI command execution failed:', error);\n \n const err = error as Error & { code?: number; stdout?: string; stderr?: string };\n const errorMessage = err instanceof Error ? err.message : String(error);\n const exitCode = err.code || 1;\n \n return {\n stdout: err.stdout || '',\n stderr: err.stderr || errorMessage,\n success: false,\n error: errorMessage,\n exitCode\n };\n }\n}\n\n/**\n * Build CodeQL command arguments with proper escaping\n */\nexport function buildCodeQLArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n // Single-letter parameters that should use -key=value format (with equals sign)\n // Note: CodeQL CLI uses -t=key=value format for metadata, not -t key=value\n const singleLetterParams = new Set(['t', 'o', 'v', 'q', 'h', 'J']);\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n const isSingleLetter = key.length === 1 && singleLetterParams.has(key);\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(isSingleLetter ? `-${key}` : `--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values (e.g., multiple -t flags for metadata)\n for (const item of value) {\n if (isSingleLetter) {\n // For single-letter params like -t, use -key=value format\n args.push(`-${key}=${String(item)}`);\n } else {\n // For long params, use --key=value format\n args.push(`--${key}=${String(item)}`);\n }\n }\n } else {\n // Handle string, number, and other values\n if (isSingleLetter) {\n // For single-letter params, use -key=value format\n args.push(`-${key}=${String(value)}`);\n } else {\n args.push(`--${key}=${String(value)}`);\n }\n }\n }\n \n return args;\n}\n\n/**\n * Build QLT command arguments with proper escaping\n */\nexport function buildQLTArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values\n for (const item of value) {\n args.push(`--${key}`, String(item));\n }\n } else {\n // Handle string, number, and other values\n args.push(`--${key}`, String(value));\n }\n }\n \n return args;\n}\n\n/**\n * Execute a CodeQL command.\n * Always uses the bare `codeql` command name so that execvp() PATH lookup\n * handles shell-script shebangs correctly. When CODEQL_PATH is set, the\n * resolved directory is prepended to PATH via getSafeEnvironment().\n */\nexport async function executeCodeQLCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = [],\n cwd?: string\n): Promise {\n const args = buildCodeQLArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'codeql',\n args,\n cwd\n });\n}\n\n/**\n * Execute a QLT command\n */\nexport async function executeQLTCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = []\n): Promise {\n const args = buildQLTArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'qlt',\n args\n });\n}\n\n/**\n * Get help text for a CLI command\n */\nexport async function getCommandHelp(command: string, subcommand?: string): Promise {\n const args = subcommand ? [subcommand, '--help'] : ['--help'];\n \n const result = await executeCLICommand({\n command,\n args\n });\n \n return result.stdout || result.stderr || 'No help available';\n}\n\n/**\n * Validate that a command exists on the system.\n */\nexport async function validateCommandExists(command: string): Promise {\n try {\n const result = await executeCLICommand({\n command: 'which',\n args: [command]\n });\n return result.success;\n } catch {\n return false;\n }\n}", "/**\n * Utilities for resolving filesystem paths relative to the server package root.\n *\n * The server can run from three different directory layouts:\n *\n * 1. **Source** (dev): `server/src/lib/` \u2192 packageRoot = `server/`\n * 2. **Bundle in monorepo** (dev/CI): `server/dist/` \u2192 packageRoot = `server/`\n * 3. **Bundle via npm** (production): `/dist/` \u2192 packageRoot = `/`\n *\n * In all three cases, the bundled QL tool query packs live at\n * `/ql//tools/src/`.\n *\n * The \"workspace root\" (monorepo root) is one level above packageRoot when\n * running from the monorepo checkout, and the packageRoot itself when running\n * from an npm install (no parent monorepo).\n */\n\nimport { dirname, resolve } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect whether the current __dirname looks like source code (`src/lib` or\n * `src/utils`) vs a bundled flat output directory (`dist/`).\n */\nfunction isRunningFromSource(dir: string): boolean {\n const normalized = dir.replace(/\\\\/g, '/');\n return normalized.includes('/src/');\n}\n\n/**\n * Get the server package root directory.\n *\n * - From source (`server/src/utils/`): up 2 levels \u2192 `server/`\n * - From bundle (`server/dist/` or `/dist/`): up 1 level \u2192 package root\n */\nexport function getPackageRootDir(currentDir: string = __dirname): string {\n return isRunningFromSource(currentDir)\n ? resolve(currentDir, '..', '..') // src/utils \u2192 server/\n : resolve(currentDir, '..'); // dist/ \u2192 package root\n}\n\n/**\n * Get the workspace root directory (monorepo root when applicable).\n *\n * If a `package.json` with `workspaces` exists one level above the package\n * root, we're in a monorepo and that parent is the workspace root. Otherwise,\n * the packageRoot itself is the workspace root (npm install scenario).\n */\nexport function getWorkspaceRootDir(packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n const parentDir = resolve(pkgRoot, '..');\n\n // In the monorepo, the parent directory contains a package.json with workspaces\n try {\n const parentPkgPath = resolve(parentDir, 'package.json');\n if (existsSync(parentPkgPath)) {\n const parentPkg = JSON.parse(readFileSync(parentPkgPath, 'utf8'));\n if (parentPkg.workspaces) {\n return parentDir;\n }\n }\n } catch {\n // Not in a monorepo \u2014 fall through\n }\n\n return pkgRoot;\n}\n\n/**\n * Resolve the path to a tool query pack's source directory.\n *\n * @param language - CodeQL language identifier (e.g., \"javascript\", \"cpp\")\n * @param packageRoot - Override the package root (for testing)\n * @returns Absolute path to `ql//tools/src/`\n */\nexport function resolveToolQueryPackPath(language: string, packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n return resolve(pkgRoot, 'ql', language, 'tools', 'src');\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\n", "/**\n * CodeQL Development MCP McpServer\n * Main entry point for the server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport express from 'express';\nimport cors from 'cors';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport { registerCodeQLTools, registerCodeQLResources } from './tools';\nimport { registerLanguageResources } from './resources/language-resources';\nimport { registerWorkflowPrompts } from './prompts/workflow-prompts';\nimport { registerMonitoringTools } from './tools/monitoring-tools';\nimport { sessionDataManager } from './lib/session-data-manager';\nimport { resolveCodeQLBinary, validateCodeQLBinaryReachable } from './lib/cli-executor';\nimport { packageRootDir } from './utils/package-paths';\nimport { logger } from './utils/logger';\n\n// Load environment variables from a .env file co-located with the package root.\n// Uses the package directory (not CWD) so that npm-installed users don't\n// accidentally inherit a .env from their project.\ndotenv.config({ path: resolve(packageRootDir, '.env') });\n\nconst PACKAGE_NAME = 'codeql-development-mcp-server';\nconst VERSION = '2.23.9';\n\n/**\n * Start the MCP server\n */\nexport async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise {\n logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`);\n\n // Resolve the CodeQL CLI binary path (honors CODEQL_PATH env var).\n // This must happen before any tool registration so that all CodeQL commands\n // use the user-specified binary.\n const codeqlBinary = resolveCodeQLBinary();\n logger.info(`CodeQL CLI binary: ${codeqlBinary}`);\n\n // Validate that the resolved binary is actually callable. This catches\n // misconfigurations early (e.g. codeql not on PATH and CODEQL_PATH unset)\n // instead of failing silently and producing confusing tool-level errors.\n const codeqlVersion = await validateCodeQLBinaryReachable();\n logger.info(`CodeQL CLI version: ${codeqlVersion}`);\n\n const server = new McpServer({\n name: PACKAGE_NAME,\n version: VERSION,\n });\n\n // Register CodeQL tools (legacy high-level helpers)\n registerCodeQLTools(server);\n\n // Register CodeQL resources (static guides)\n registerCodeQLResources(server);\n\n // Register language-specific resources (AST references, security patterns)\n registerLanguageResources(server);\n\n // Register high-level workflow prompts (complete development workflows)\n registerWorkflowPrompts(server);\n\n // Register monitoring and reporting tools\n registerMonitoringTools(server);\n\n // Initialize session data manager\n await sessionDataManager.initialize();\n\n if (mode === 'stdio') {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info('McpServer started successfully on STDIO transport');\n } else {\n // HTTP mode\n const app = express();\n app.use(cors());\n app.use(express.json());\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => Math.random().toString(36).substring(7),\n });\n await server.connect(transport);\n\n app.all('/mcp', (req, res) => {\n transport.handleRequest(req, res, req.body).catch((err) => {\n logger.error('Error handling MCP request:', err);\n if (!res.headersSent) {\n res.status(500).json({ error: 'Internal McpServer Error' });\n }\n });\n });\n\n app.get('/', (_req, res) => {\n res.json({\n name: PACKAGE_NAME,\n version: VERSION,\n description: 'CodeQL Development MCP McpServer',\n status: 'running',\n });\n });\n\n const host = process.env.HTTP_HOST || 'localhost';\n const port = Number(process.env.HTTP_PORT || process.env.PORT) || 3000;\n \n // Return a promise that keeps the process alive\n return new Promise((resolve, reject) => {\n const httpServer = app.listen(port, host, () => {\n logger.info(`HTTP server listening on http://${host}:${port}/mcp`);\n resolve();\n });\n \n httpServer.on('error', (error) => {\n logger.error('HTTP server error:', error);\n reject(error);\n });\n });\n }\n\n setupGracefulShutdown(server);\n return server;\n}\n\n/**\n * Set up graceful shutdown handling\n */\nfunction setupGracefulShutdown(server: McpServer): void {\n const shutdown = async () => {\n logger.info('Shutting down server...');\n try {\n await server.close();\n logger.info('McpServer closed gracefully');\n process.exit(0);\n } catch (error) {\n logger.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\n/**\n * Main function to start the server\n */\nasync function main(): Promise {\n try {\n const transportMode = (process.env.TRANSPORT_MODE || 'stdio').toLowerCase();\n const mode: 'stdio' | 'http' = transportMode === 'http' ? 'http' : 'stdio';\n await startServer(mode);\n } catch (error) {\n logger.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\n// Start the server if this file is run directly\nconst scriptPath = process.argv[1] ? resolve(process.argv[1]) : undefined;\nif (scriptPath && import.meta.url === pathToFileURL(scriptPath).href) {\n main();\n}\n", "/**\n * CodeQL BQRS decode tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsDecodeTool: CLIToolDefinition = {\n name: 'codeql_bqrs_decode',\n description: 'Decode BQRS result files to human-readable formats',\n command: 'codeql',\n subcommand: 'bqrs decode',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to decode'),\n output: createCodeQLSchemas.output(),\n format: z.enum(['csv', 'json']).optional().describe('Output format'),\n 'max-paths': z.number().optional().describe('Maximum number of paths to output'),\n 'start-at': z.number().optional().describe('Start output at result number'),\n 'max-results': z.number().optional().describe('Maximum number of results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs decode --format=csv --output=results.csv results.bqrs',\n 'codeql bqrs decode --format=json --max-results=100 results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * Generic tool registry for creating MCP tools from CLI command definitions\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator';\nimport { getOrCreateLogDirectory } from './log-directory-manager';\nimport { packageRootDir, resolveToolQueryPackPath, workspaceRootDir } from '../utils/package-paths';\nimport { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs';\nimport { basename, dirname, isAbsolute, join, resolve } from 'path';\nimport { createProjectTempDir } from '../utils/temp-dir';\n\nexport type { CLIExecutionResult } from './cli-executor';\n\nexport interface CLIToolDefinition {\n name: string;\n description: string;\n command: 'codeql' | 'qlt';\n subcommand: string;\n inputSchema: Record;\n examples?: string[];\n resultProcessor?: (_result: CLIExecutionResult, _params: Record) => string;\n}\n\n/**\n * Default result processor that formats CLI output appropriately\n */\nexport const defaultCLIResultProcessor = (\n result: CLIExecutionResult, \n _params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n \n let output = '';\n \n if (result.stdout) {\n output += result.stdout;\n }\n \n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n \n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n \n return output;\n};\n\n/**\n * Register a CLI tool with the MCP server\n */\nexport function registerCLITool(server: McpServer, definition: CLIToolDefinition): void {\n const {\n name,\n description,\n command,\n subcommand,\n inputSchema,\n resultProcessor = defaultCLIResultProcessor\n } = definition;\n\n server.tool(\n name,\n description,\n inputSchema,\n async (params: Record) => {\n // Track temporary directories for cleanup\n const tempDirsToCleanup: string[] = [];\n \n try {\n logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params });\n\n // Separate positional arguments from named options\n // Extract tool-specific parameters that should not be passed to CLI\n // Note: format is extracted for tools that use it internally but not on CLI\n // For codeql_bqrs_interpret, codeql_bqrs_decode, codeql_generate_query-help, and codeql_database_analyze, format should be passed to CLI\n const formatShouldBePassedToCLI = name === 'codeql_bqrs_interpret' || name === 'codeql_bqrs_decode' || name === 'codeql_generate_query-help' || name === 'codeql_database_analyze';\n \n const extractedParams = formatShouldBePassedToCLI\n ? {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack,\n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n }\n : {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack, \n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n format: params.format,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n };\n\n const {\n _positional = [],\n files,\n file,\n dir,\n packDir,\n tests,\n query,\n queryName,\n queryLanguage: _queryLanguage,\n queryPack: _queryPack,\n sourceFiles,\n sourceFunction,\n targetFunction,\n format: _format,\n interpretedOutput: _interpretedOutput,\n evaluationFunction: _evaluationFunction,\n evaluationOutput: _evaluationOutput,\n directory,\n logDir: customLogDir,\n qlref,\n } = extractedParams;\n\n // Get remaining options (everything not extracted above)\n const options = {...params};\n Object.keys(extractedParams).forEach(key => delete options[key]);\n let positionalArgs = Array.isArray(_positional) ? _positional as string[] : [_positional as string];\n\n // Handle files parameter as positional arguments for certain tools\n if (files && Array.isArray(files)) {\n positionalArgs = [...positionalArgs, ...files as string[]];\n }\n\n // Handle file parameter as positional argument for BQRS tools\n if (file && name.startsWith('codeql_bqrs_')) {\n positionalArgs = [...positionalArgs, file as string];\n }\n\n // Handle qlref parameter as positional argument for resolve qlref tool\n if (qlref && name === 'codeql_resolve_qlref') {\n positionalArgs = [...positionalArgs, qlref as string];\n }\n\n // Handle database parameter as positional argument for resolve database tool\n if (options.database && name === 'codeql_resolve_database') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database parameter as positional argument for database create tool\n if (options.database && name === 'codeql_database_create') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database and queries parameters as positional arguments for database analyze tool\n if (name === 'codeql_database_analyze') {\n if (options.database) {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n if (options.queries) {\n positionalArgs = [...positionalArgs, options.queries as string];\n delete options.queries;\n }\n }\n\n // Handle query parameter as positional argument for generate query-help tool\n if (query && name === 'codeql_generate_query-help') {\n positionalArgs = [...positionalArgs, query as string];\n }\n\n // Handle dir parameter as positional argument for pack tools\n if (dir && (name === 'codeql_pack_ls')) {\n positionalArgs = [...positionalArgs, dir as string];\n }\n \n // Handle tool-specific parameters using switch pattern for better maintainability\n switch (name) {\n case 'codeql_test_accept':\n case 'codeql_test_extract':\n case 'codeql_test_run':\n case 'codeql_resolve_tests':\n // Handle tests parameter as positional arguments for test tools.\n // Resolve relative paths against workspaceRootDir since the MCP\n // server's cwd may not be the repo root.\n if (tests && Array.isArray(tests)) {\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(workspaceRootDir, t)\n )];\n }\n break;\n \n case 'codeql_query_run': {\n // Resolve database path to absolute path if it's relative\n if (options.database && typeof options.database === 'string' && !isAbsolute(options.database)) {\n options.database = resolve(workspaceRootDir, options.database);\n logger.info(`Resolved database path to: ${options.database}`);\n }\n \n // Implement query resolution logic with enhanced results processing\n const resolvedQuery = await resolveQueryPath(params, logger);\n if (resolvedQuery) {\n positionalArgs = [...positionalArgs, resolvedQuery];\n } else if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n \n // Handle external predicates for tool queries\n if (queryName === 'PrintAST' && sourceFiles) {\n // Create a CSV file with the source file paths for the external predicate\n // The external predicate expects a CSV file with one column containing file paths\n const filePaths = (sourceFiles as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir); // Track for cleanup\n csvPath = join(tempDir, 'selectedSourceFiles.csv');\n\n // Create CSV content\n const csvContent = filePaths.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`selectedSourceFiles=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphFrom queries\n if (queryName === 'CallGraphFrom' && sourceFunction) {\n const functionNames = (sourceFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'sourceFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`sourceFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphTo queries\n if (queryName === 'CallGraphTo' && targetFunction) {\n const functionNames = (targetFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'targetFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`targetFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n break;\n }\n \n case 'codeql_query_compile':\n case 'codeql_resolve_metadata':\n // Handle query parameter as positional argument for query compilation and metadata tools\n if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n break;\n \n case 'codeql_resolve_queries':\n // Handle directory parameter as positional argument\n if (directory) {\n positionalArgs = [...positionalArgs, directory as string];\n }\n break;\n \n default:\n // No special parameter handling needed for other tools\n break;\n }\n\n // Set up logging directory for query/test runs\n let queryLogDir: string | undefined;\n if (name === 'codeql_query_run' || name === 'codeql_test_run') {\n queryLogDir = getOrCreateLogDirectory(customLogDir as string | undefined);\n logger.info(`Using log directory for ${name}: ${queryLogDir}`);\n \n // Create timestamp file to track when query/test run started\n const timestampPath = join(queryLogDir, 'timestamp');\n writeFileSync(timestampPath, Date.now().toString(), 'utf8');\n \n // Set the --logdir option for CodeQL CLI\n options.logdir = queryLogDir;\n \n // Set verbosity to progress+ to generate detailed query.log/test.log\n if (!options.verbosity) {\n options.verbosity = 'progress+';\n }\n \n // For query run, also handle the deprecated evaluator-log parameter and default output\n if (name === 'codeql_query_run') {\n // If evaluator-log was explicitly provided (deprecated), use it\n // Otherwise, set it to the log directory\n if (!options['evaluator-log']) {\n options['evaluator-log'] = join(queryLogDir, 'evaluator-log.jsonl');\n }\n \n // If output was not explicitly provided, set it to the log directory\n if (!options.output) {\n options.output = join(queryLogDir, 'results.bqrs');\n }\n }\n }\n\n let result: CLIExecutionResult;\n \n if (command === 'codeql') {\n // For pack commands, set the working directory to where qlpack.yml is located.\n // Resolve to absolute path since the MCP server's cwd may differ from\n // the workspace root (especially when launched by VS Code).\n let cwd: string | undefined;\n if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) {\n const rawCwd = (dir || packDir) as string;\n // Resolve relative paths against the workspace root, not process.cwd(),\n // since the MCP server's cwd may differ (especially in VS Code).\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd);\n }\n \n // Add --additional-packs for commands that need to access local test packs.\n // Only set the default examples path when it actually exists on disk\n // (it may be absent in npm-installed layouts where ql/javascript/examples/\n // is not included in the published package).\n const defaultExamplesPath = resolve(packageRootDir, 'ql', 'javascript', 'examples');\n const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS\n || (existsSync(defaultExamplesPath) ? defaultExamplesPath : undefined);\n if (additionalPacksPath && (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile')) {\n options['additional-packs'] = additionalPacksPath;\n }\n \n // Keep test databases for codeql_test_run to allow subsequent query runs\n if (name === 'codeql_test_run') {\n options['keep-databases'] = true;\n }\n \n result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd);\n } else if (command === 'qlt') {\n result = await executeQLTCommand(subcommand, options, positionalArgs);\n } else {\n throw new Error(`Unsupported command: ${command}`);\n }\n\n // Post-execution processing for codeql_query_run\n if (name === 'codeql_query_run' && result.success && queryLogDir) {\n // Generate SARIF interpretation if results.bqrs exists\n const bqrsPath = options.output as string;\n const sarifPath = join(queryLogDir, 'results.sarif');\n \n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n \n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n \n // Process evaluation results\n result = await processQueryRunResults(result, params, logger);\n }\n\n // Process the result\n const processedResult = resultProcessor(result, params);\n\n return {\n content: [{\n type: 'text' as const,\n text: processedResult\n }],\n isError: !result.success\n };\n\n } catch (error) {\n logger.error(`Error in CLI tool ${name}:`, error);\n \n return {\n content: [{\n type: 'text' as const,\n text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}`\n }],\n isError: true\n };\n } finally {\n // Clean up temporary directories\n for (const tempDir of tempDirsToCleanup) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n logger.info(`Cleaned up temporary directory: ${tempDir}`);\n } catch (cleanupError) {\n logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError);\n }\n }\n }\n }\n );\n}\n\n/**\n * Helper function to create common CodeQL input schemas\n */\nexport const createCodeQLSchemas = {\n database: () => z.string().describe('Path to the CodeQL database'),\n \n query: () => z.string().describe('Path to the CodeQL query file (.ql)'),\n \n output: () => z.string().optional().describe('Output file path'),\n \n outputFormat: () => z.enum(['csv', 'json', 'bqrs', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n \n language: () => z.string().optional().describe('Programming language'),\n \n threads: () => z.number().optional().describe('Number of threads to use'),\n \n ram: () => z.number().optional().describe('Amount of RAM to use (MB)'),\n \n timeout: () => z.number().optional().describe('Timeout in seconds'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments'),\n \n positionalArgs: () => z.array(z.string()).optional().describe('Positional arguments')\n .transform((val) => ({ _positional: val }))\n};\n\n/**\n * Helper function to create common QLT input schemas\n */\nexport const createQLTSchemas = {\n language: () => z.string().describe('Programming language'),\n \n output: () => z.string().optional().describe('Output directory or file path'),\n \n template: () => z.string().optional().describe('Template to use'),\n \n name: () => z.string().optional().describe('Name for generated query'),\n \n description: () => z.string().optional().describe('Description for generated query'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n force: () => z.boolean().optional().describe('Force overwrite existing files'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments')\n};\n\n/**\n * Create a result processor that formats BQRS output specially\n */\nexport const createBQRSResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n // For BQRS commands, provide more context about the output\n let output = result.stdout;\n \n if (params.output) {\n output += `\\n\\nResults saved to: ${params.output}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Create a result processor that formats database creation output\n */\nexport const createDatabaseResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n let output = 'Database creation completed successfully';\n \n if (params.database || params._positional) {\n const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional);\n output += `\\n\\nDatabase location: ${dbPath}`;\n }\n \n if (result.stdout) {\n output += `\\n\\nOutput:\\n${result.stdout}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Resolve query path for codeql_query_run tool\n * If queryName and queryLanguage are provided, resolve using codeql resolve queries\n */\nasync function resolveQueryPath(\n params: Record, \n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n const { queryName, queryLanguage, queryPack, query } = params;\n \n // Validate parameter usage - queryName and query are mutually exclusive\n if (queryName && query) {\n logger.error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n throw new Error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n }\n \n // If no queryName provided, fall back to direct query parameter\n if (!queryName) {\n return query as string || null;\n }\n \n // If queryName provided but no language, we can't resolve\n if (!queryLanguage) {\n logger.error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n throw new Error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n }\n \n try {\n // Determine the query pack path - use absolute path to ensure it works regardless of cwd\n const defaultPackPath = resolveToolQueryPackPath(queryLanguage as string);\n const packPath = queryPack as string || defaultPackPath;\n \n logger.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`);\n \n // Execute codeql resolve queries to get available queries\n const { executeCodeQLCommand } = await import('./cli-executor');\n const resolveResult = await executeCodeQLCommand(\n 'resolve queries',\n { format: 'json' },\n [packPath]\n );\n \n if (!resolveResult.success) {\n logger.error('Failed to resolve queries:', resolveResult.stderr || resolveResult.error);\n throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`);\n }\n \n // Parse the JSON output to find matching queries\n let resolvedQueries: string[];\n try {\n resolvedQueries = JSON.parse(resolveResult.stdout);\n } catch (parseError) {\n logger.error('Failed to parse resolve queries output:', parseError);\n throw new Error('Failed to parse resolve queries output');\n }\n \n // Find the query that matches the requested name exactly\n const matchingQuery = resolvedQueries.find(queryPath => {\n const fileName = basename(queryPath);\n // Match exact query name: \"PrintAST\" should match \"PrintAST.ql\" only\n return fileName === `${queryName}.ql`;\n });\n\n if (!matchingQuery) {\n logger.error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\". Available queries:`, resolvedQueries.map(q => basename(q)));\n throw new Error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\"`);\n }\n \n logger.info(`Resolved query \"${queryName}\" to: ${matchingQuery}`);\n return matchingQuery;\n \n } catch (error) {\n logger.error('Error resolving query path:', error);\n throw error;\n }\n}\n\n/**\n * Interpret BQRS file using codeql bqrs interpret\n */\nasync function interpretBQRSFile(\n bqrsPath: string,\n queryPath: string,\n format: string,\n outputPath: string,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n // Extract query metadata to get id and kind\n const metadata = await extractQueryMetadata(queryPath);\n \n // Validate required metadata fields\n const missingFields = [];\n if (!metadata.id) missingFields.push('id');\n if (!metadata.kind) missingFields.push('kind');\n \n if (missingFields.length > 0) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(', ')}. Ensure the query file contains @id and @kind metadata.`\n };\n }\n \n // Sanitize metadata values to prevent command injection\n const sanitizedKind = (metadata.kind || '').replace(/[^a-zA-Z0-9_-]/g, '');\n const sanitizedId = (metadata.id || '').replace(/[^a-zA-Z0-9_/:-]/g, '');\n \n // Validate format for query kind\n const graphFormats = ['graphtext', 'dgml', 'dot'];\n if (graphFormats.includes(format) && metadata.kind !== 'graph') {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}`\n };\n }\n \n // Ensure output directory exists\n mkdirSync(dirname(outputPath), { recursive: true });\n \n // Build the codeql bqrs interpret command\n const params: Record = {\n format: format,\n output: outputPath,\n t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`]\n };\n \n logger.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`);\n \n // Execute codeql bqrs interpret\n const result = await executeCodeQLCommand(\n 'bqrs interpret',\n params,\n [bqrsPath]\n );\n \n return result;\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Failed to interpret BQRS file: ${error}`\n };\n }\n}\n\n/**\n * Get default output extension based on format\n */\nfunction getDefaultExtension(format: string): string {\n switch (format) {\n case 'sarif-latest':\n case 'sarifv2.1.0':\n return '.sarif';\n case 'csv':\n return '.csv';\n case 'graphtext':\n return '.txt';\n case 'dgml':\n return '.dgml';\n case 'dot':\n return '.dot';\n default:\n return '.txt';\n }\n}\n\n/**\n * Process query run results with optional interpretation or evaluation\n */\nasync function processQueryRunResults(\n result: CLIExecutionResult,\n params: Record,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params;\n \n // If no format or evaluationFunction specified, return as-is\n if (!format && !evaluationFunction) {\n return result;\n }\n \n // Ensure output (bqrs file) was generated\n if (!output) {\n return result;\n }\n \n const bqrsPath = output as string;\n \n // Determine the query path for metadata extraction\n let queryPath: string | null = null;\n \n if (query) {\n queryPath = query as string;\n } else if (queryName && queryLanguage) {\n // Try to resolve the query path again for evaluation\n queryPath = await resolveQueryPath(params, logger);\n }\n \n if (!queryPath) {\n logger.error('Cannot determine query path for interpretation/evaluation');\n return {\n ...result,\n stdout: result.stdout + '\\n\\nWarning: Query interpretation skipped - could not determine query path'\n };\n }\n \n // Handle new format parameter (preferred approach)\n if (format) {\n const outputFormat = format as string;\n \n // Determine output path\n let outputFilePath = interpretedOutput as string | undefined;\n if (!outputFilePath) {\n const ext = getDefaultExtension(outputFormat);\n outputFilePath = bqrsPath.replace('.bqrs', ext);\n }\n \n logger.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`);\n \n // Interpret the BQRS file\n const interpretResult = await interpretBQRSFile(\n bqrsPath,\n queryPath,\n outputFormat,\n outputFilePath,\n logger\n );\n \n if (interpretResult.success) {\n let enhancedOutput = result.stdout;\n enhancedOutput += `\\n\\nQuery results interpreted successfully with format: ${outputFormat}`;\n enhancedOutput += `\\nInterpreted output saved to: ${outputFilePath}`;\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n logger.error('Query interpretation failed:', interpretResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}`\n };\n }\n }\n \n // Handle legacy evaluationFunction parameter (deprecated)\n if (evaluationFunction) {\n logger.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`);\n logger.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`);\n \n // Perform the evaluation\n const evaluationResult: QueryEvaluationResult = await evaluateQueryResults(\n bqrsPath,\n queryPath,\n evaluationFunction as string,\n evaluationOutput as string | undefined\n );\n \n if (evaluationResult.success) {\n // Append evaluation results to the command output\n let enhancedOutput = result.stdout;\n \n if (evaluationResult.outputPath) {\n enhancedOutput += `\\n\\nQuery evaluation completed successfully.`;\n enhancedOutput += `\\nEvaluation output saved to: ${evaluationResult.outputPath}`;\n }\n \n if (evaluationResult.content) {\n enhancedOutput += `\\n\\n=== Query Results Evaluation ===\\n`;\n enhancedOutput += evaluationResult.content;\n }\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n // Evaluation failed, but don't fail the whole operation\n logger.error('Query evaluation failed:', evaluationResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query evaluation failed - ${evaluationResult.error}`\n };\n }\n }\n \n return result;\n } catch (error) {\n logger.error('Error in query results processing:', error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query processing error - ${error}`\n };\n }\n}", "/**\n * Query results evaluation functions for processing .bqrs files\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { writeFileSync, readFileSync } from 'fs';\nimport { dirname, isAbsolute } from 'path';\nimport { mkdirSync } from 'fs';\n\nexport interface QueryEvaluationResult {\n success: boolean;\n outputPath?: string;\n content?: string;\n error?: string;\n}\n\nexport interface QueryMetadata {\n kind?: string;\n name?: string;\n description?: string;\n id?: string;\n tags?: string[];\n}\n\n/**\n * Built-in evaluation functions\n */\nexport const BUILT_IN_EVALUATORS = {\n 'json-decode': 'JSON format decoder for query results',\n 'csv-decode': 'CSV format decoder for query results', \n 'mermaid-graph': 'Mermaid diagram generator for @kind graph queries (like PrintAST)',\n} as const;\n\nexport type BuiltInEvaluator = keyof typeof BUILT_IN_EVALUATORS;\n\n/**\n * Extract metadata from a CodeQL query file\n */\nexport async function extractQueryMetadata(queryPath: string): Promise {\n try {\n const queryContent = readFileSync(queryPath, 'utf-8');\n const metadata: QueryMetadata = {};\n \n // Extract metadata from comments using regex patterns\n const kindMatch = queryContent.match(/@kind\\s+([^\\s]+)/);\n if (kindMatch) metadata.kind = kindMatch[1];\n \n const nameMatch = queryContent.match(/@name\\s+(.+)/);\n if (nameMatch) metadata.name = nameMatch[1].trim();\n \n const descMatch = queryContent.match(/@description\\s+(.+)/);\n if (descMatch) metadata.description = descMatch[1].trim();\n \n const idMatch = queryContent.match(/@id\\s+(.+)/);\n if (idMatch) metadata.id = idMatch[1].trim();\n \n const tagsMatch = queryContent.match(/@tags\\s+(.+)/);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(/\\s+/).filter(t => t.length > 0);\n }\n \n return metadata;\n } catch (error) {\n logger.error('Failed to extract query metadata:', error);\n return {};\n }\n}\n\n/**\n * JSON decoder - converts .bqrs to JSON format\n */\nexport async function evaluateWithJsonDecoder(\n bqrsPath: string, \n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.json');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write JSON results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `JSON evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * CSV decoder - converts .bqrs to CSV format\n */\nexport async function evaluateWithCsvDecoder(\n bqrsPath: string,\n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'csv' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.csv');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write CSV results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `CSV evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Mermaid graph generator - converts @kind graph query results to mermaid diagrams\n */\nexport async function evaluateWithMermaidGraph(\n bqrsPath: string,\n queryPath: string,\n outputPath?: string\n): Promise {\n try {\n // First extract query metadata to confirm this is a graph query\n const metadata = await extractQueryMetadata(queryPath);\n \n if (metadata.kind !== 'graph') {\n logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`);\n return {\n success: false,\n error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`\n };\n }\n \n // Decode the BQRS file to JSON first\n const jsonResult = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!jsonResult.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}`\n };\n }\n \n // Parse the JSON results\n let queryResults;\n try {\n queryResults = JSON.parse(jsonResult.stdout);\n } catch (parseError) {\n return {\n success: false,\n error: `Failed to parse query results JSON: ${parseError}`\n };\n }\n \n // Generate mermaid diagram from graph results\n const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata);\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.md');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write markdown file with mermaid diagram\n writeFileSync(defaultOutputPath, mermaidContent);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: mermaidContent\n };\n } catch (error) {\n return {\n success: false,\n error: `Mermaid graph evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Generate mermaid diagram from CodeQL graph query results\n */\nfunction generateMermaidFromGraphResults(queryResults: unknown, metadata: QueryMetadata): string {\n const queryName = sanitizeMarkdown(metadata.name || 'CodeQL Query Results');\n const queryDesc = sanitizeMarkdown(metadata.description || 'Graph visualization of CodeQL query results');\n \n let mermaidContent = `# ${queryName}\\n\\n${queryDesc}\\n\\n`;\n \n // Handle different result structures that CodeQL graph queries can produce\n if (!queryResults || typeof queryResults !== 'object') {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Results]\\n```\\n';\n return mermaidContent;\n }\n \n // Check if results have the expected structure for graph queries\n const tuples = queryResults.tuples || queryResults;\n \n if (!Array.isArray(tuples) || tuples.length === 0) {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Graph Data]\\n```\\n';\n return mermaidContent;\n }\n \n mermaidContent += '```mermaid\\ngraph TD\\n';\n \n // Track nodes and edges to avoid duplicates\n const nodes = new Set();\n const edges = new Set();\n \n // Process each tuple in the results\n tuples.forEach((tuple: unknown, index: number) => {\n if (Array.isArray(tuple) && tuple.length >= 2) {\n // Extract source and target from tuple\n const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`);\n const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`);\n const label = tuple[2]?.toString() || '';\n \n // Add nodes\n nodes.add(source);\n nodes.add(target);\n \n // Add edge\n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n } else if (typeof tuple === 'object' && tuple !== null) {\n // Handle object-based results\n const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`);\n const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`);\n const label = tuple.label?.toString() || tuple.relation?.toString() || '';\n \n nodes.add(source);\n nodes.add(target);\n \n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n }\n });\n \n // If no edges were created, create a simple diagram showing the first few nodes\n if (edges.size === 0 && nodes.size > 0) {\n const nodeArray = Array.from(nodes).slice(0, 10); // Limit to avoid clutter\n nodeArray.forEach((node, index) => {\n if (index === 0) {\n mermaidContent += ` ${node}[${sanitizeLabel(node)}]\\n`;\n } else {\n mermaidContent += ` ${nodeArray[0]} --> ${node}\\n`;\n }\n });\n }\n \n mermaidContent += '```\\n\\n';\n \n // Add statistics\n mermaidContent += `## Query Statistics\\n\\n`;\n mermaidContent += `- Total nodes: ${nodes.size}\\n`;\n mermaidContent += `- Total edges: ${edges.size}\\n`;\n mermaidContent += `- Total tuples processed: ${tuples.length}\\n`;\n \n return mermaidContent;\n}\n\n/**\n * Sanitize node IDs for mermaid compatibility\n */\nfunction sanitizeNodeId(id: string): string {\n return id\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^(\\d)/, 'n$1') // Prefix with 'n' if starts with number\n .substring(0, 50); // Limit length\n}\n\n/**\n * Sanitize labels for mermaid compatibility\n */\nfunction sanitizeLabel(label: string): string {\n return label\n .replace(/[|\"`<>\\n\\r\\t]/g, '') // Remove problematic characters including backticks, newlines, angle brackets\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 30); // Limit length for readability\n}\n\n/**\n * Sanitize markdown content to prevent injection\n */\nfunction sanitizeMarkdown(content: string): string {\n return content\n .replace(/[<>\"`]/g, '') // Remove potentially dangerous characters\n .replace(/\\n/g, ' ') // Convert newlines to spaces\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 100); // Limit length\n}\n\n/**\n * Main evaluation function that determines which evaluator to use\n */\nexport async function evaluateQueryResults(\n bqrsPath: string,\n queryPath: string,\n evaluationFunction?: string,\n outputPath?: string\n): Promise {\n try {\n // If no evaluation function specified, default to json-decode\n const evalFunc = evaluationFunction || 'json-decode';\n \n logger.info(`Evaluating query results with function: ${evalFunc}`);\n \n // Handle built-in evaluation functions\n switch (evalFunc) {\n case 'json-decode':\n return await evaluateWithJsonDecoder(bqrsPath, outputPath);\n \n case 'csv-decode':\n return await evaluateWithCsvDecoder(bqrsPath, outputPath);\n \n case 'mermaid-graph':\n return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath);\n \n default:\n // Check if it's a path to a custom evaluation script\n if (isAbsolute(evalFunc)) {\n return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath);\n } else {\n return {\n success: false,\n error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(', ')}`\n };\n }\n }\n } catch (error) {\n return {\n success: false,\n error: `Query evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Execute custom evaluation script\n */\nasync function evaluateWithCustomScript(\n _bqrsPath: string,\n _queryPath: string,\n _scriptPath: string,\n _outputPath?: string\n): Promise {\n // TODO: Implement custom script execution\n // This would need to execute the script with bqrsPath and queryPath as arguments\n // and capture the output\n return {\n success: false,\n error: 'Custom evaluation scripts are not yet implemented'\n };\n}", "/**\n * Log directory management utilities for CodeQL query and test runs\n */\n\nimport { mkdirSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { randomBytes } from 'crypto';\nimport { getProjectTmpDir } from '../utils/temp-dir';\n\n/**\n * Ensure that a given path is within a base directory.\n * Throws an error if the path is outside the base directory.\n */\nfunction ensurePathWithinBase(baseDir: string, targetPath: string): string {\n const absBase = resolve(baseDir);\n const absTarget = resolve(targetPath);\n if (!absTarget.startsWith(absBase + '/') && absTarget !== absBase) {\n throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`);\n }\n return absTarget;\n}\n\n/**\n * Get or create a unique log directory for query/test runs\n * \n * @param logDir - Optional custom log directory from parameters\n * @returns Absolute path to the log directory\n */\nexport function getOrCreateLogDirectory(logDir?: string): string {\n // Use CODEQL_QUERY_LOG_DIR env var or default base\n const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir('query-logs');\n\n // If logDir is explicitly provided, validate it is within baseLogDir\n if (logDir) {\n const absLogDir = ensurePathWithinBase(baseLogDir, logDir);\n if (!existsSync(absLogDir)) {\n mkdirSync(absLogDir, { recursive: true });\n }\n return absLogDir;\n }\n \n // Otherwise, use baseLogDir and create a unique subdirectory\n \n // Create base directory if it doesn't exist\n if (!existsSync(baseLogDir)) {\n mkdirSync(baseLogDir, { recursive: true });\n }\n \n // Generate unique subdirectory with timestamp and random ID\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const uniqueId = randomBytes(4).toString('hex');\n const uniqueLogDir = join(baseLogDir, `query-run-${timestamp}-${uniqueId}`);\n \n mkdirSync(uniqueLogDir, { recursive: true });\n \n return uniqueLogDir;\n}\n", "/**\n * Secure project-local temporary directory utilities.\n *\n * All temporary files are created under `/.tmp/` which is\n * `.gitignore`d. This avoids writing to the OS temp directory\n * (`os.tmpdir()` / `/tmp`), which is world-readable and triggers\n * CWE-377 / CWE-378 (js/insecure-temporary-file).\n */\n\nimport { mkdirSync, mkdtempSync } from 'fs';\nimport { join } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n * Stored under `/.tmp` and excluded from version control.\n */\nconst PROJECT_TMP_BASE = join(getPackageRootDir(), '.tmp');\n\n/**\n * Return the project-local `.tmp` base directory, creating it if needed.\n */\nexport function getProjectTmpBase(): string {\n mkdirSync(PROJECT_TMP_BASE, { recursive: true });\n return PROJECT_TMP_BASE;\n}\n\n/**\n * Create a unique temporary directory under the project `.tmp` root.\n *\n * Works identically to `fs.mkdtempSync(os.tmpdir(), prefix)` but is\n * scoped to the repository.\n *\n * @param prefix - Directory name prefix (e.g. `'codeql-external-'`).\n * @returns Absolute path to the newly created directory.\n */\nexport function createProjectTempDir(prefix: string): string {\n const base = getProjectTmpBase();\n return mkdtempSync(join(base, prefix));\n}\n\n/**\n * Return a deterministic subdirectory under `.tmp/`, creating it\n * if it does not already exist.\n *\n * Useful for well-known scratch areas such as `query-logs` or `quickeval`.\n *\n * @param name - Subdirectory name (e.g. `'query-logs'`).\n * @returns Absolute path to the subdirectory.\n */\nexport function getProjectTmpDir(name: string): string {\n const dir = join(getProjectTmpBase(), name);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n", "/**\n * CodeQL BQRS info tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInfoTool: CLIToolDefinition = {\n name: 'codeql_bqrs_info',\n description: 'Get metadata and information about BQRS result files',\n command: 'codeql',\n subcommand: 'bqrs info',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to examine'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs info results.bqrs',\n 'codeql bqrs info --verbose results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * CodeQL BQRS interpret tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInterpretTool: CLIToolDefinition = {\n name: 'codeql_bqrs_interpret',\n description: 'Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)',\n command: 'codeql',\n subcommand: 'bqrs interpret',\n inputSchema: {\n file: z.string().describe('The BQRS file to interpret'),\n format: z.enum(['csv', 'sarif-latest', 'sarifv2.1.0', 'graphtext', 'dgml', 'dot'])\n .describe('Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)'),\n output: createCodeQLSchemas.output(),\n t: z.array(z.string())\n .describe('Query metadata key=value pairs. At least \"kind\" and \"id\" must be specified (e.g., [\"kind=graph\", \"id=js/print-ast\"])'),\n 'max-paths': z.number().optional()\n .describe('Maximum number of paths to produce for each alert with paths (default: 4)'),\n 'sarif-add-file-contents': z.boolean().optional()\n .describe('[SARIF only] Include full file contents for all files referenced in results'),\n 'sarif-add-snippets': z.boolean().optional()\n .describe('[SARIF only] Include code snippets for each location with context'),\n 'sarif-group-rules-by-pack': z.boolean().optional()\n .describe('[SARIF only] Place rule objects under their QL pack in tool.extensions property'),\n 'sarif-multicause-markdown': z.boolean().optional()\n .describe('[SARIF only] Include multi-cause alerts as Markdown-formatted lists'),\n 'sarif-category': z.string().optional()\n .describe('[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)'),\n 'csv-location-format': z.enum(['uri', 'line-column', 'offset-length']).optional()\n .describe('[CSV only] Format for locations in CSV output (default: line-column)'),\n 'dot-location-url-format': z.string().optional()\n .describe('[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})'),\n threads: z.number().optional()\n .describe('Number of threads for computing paths (0 = one per core, -N = leave N cores unused)'),\n 'column-kind': z.enum(['utf8', 'utf16', 'utf32', 'bytes']).optional()\n .describe('[SARIF only] Column kind for interpreting location columns'),\n 'unicode-new-lines': z.boolean().optional()\n .describe('[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs',\n 'codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs',\n 'codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs',\n 'codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs',\n 'codeql bqrs interpret --format=sarif-latest --sarif-add-snippets --sarif-category=security --output=results.sarif -t kind=path-problem -t id=go/path-injection results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};\n", "/**\n * CodeQL database analyze tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseAnalyzeTool: CLIToolDefinition = {\n name: 'codeql_database_analyze',\n description: 'Run queries or query suites against CodeQL databases',\n command: 'codeql',\n subcommand: 'database analyze',\n inputSchema: {\n database: z.string().describe('Path to the CodeQL database'),\n queries: z.string().describe('Queries or query suite to run'),\n output: z.string().optional().describe('Output file path'),\n format: z.enum(['csv', 'json', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n 'download-location': z.string().optional()\n .describe('Location to download missing dependencies'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n timeout: z.number().optional().describe('Timeout in seconds'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif',\n 'codeql database analyze mydb codeql/java-queries --format=csv'\n ]\n};", "/**\n * CodeQL database create tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createDatabaseResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseCreateTool: CLIToolDefinition = {\n name: 'codeql_database_create',\n description: 'Create a CodeQL database from source code',\n command: 'codeql',\n subcommand: 'database create',\n inputSchema: {\n database: z.string().describe('Database path/name to create'),\n language: z.string().optional().describe('Programming language(s) to extract'),\n 'source-root': z.string().optional().describe('Root directory of source code'),\n command: z.string().optional().describe('Build command for compiled languages'),\n 'build-mode': z.enum(['none', 'autobuild', 'manual']).optional()\n .describe('Build mode: none (interpreted langs), autobuild, or manual'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n overwrite: z.boolean().optional().describe('Overwrite existing database if it exists'),\n 'no-cleanup': z.boolean().optional().describe('Skip database cleanup after finalization'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database create --language=java --source-root=/path/to/project mydb',\n 'codeql database create --language=cpp --command=\"make all\" mydb',\n 'codeql database create --language=python,javascript mydb'\n ],\n resultProcessor: createDatabaseResultProcessor()\n};", "/**\n * CodeQL find class position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface ClassPosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a class name identifier in a QL file.\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findClassPosition(filepath: string, className: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Match class definition with the specific class name\n const classNameRegex = new RegExp(`\\\\bclass\\\\s+(${className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})\\\\b`);\n const match = classNameRegex.exec(line);\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The class name is in capture group 1\n const classNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = classNameStart + 1; // 1-based column numbering\n const end_col = start_col + className.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Class name '${className}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find class position tool with the MCP server\n */\nexport function registerFindClassPositionTool(server: McpServer): void {\n server.tool(\n 'find_class_position',\n 'Finds startline, startcol, endline endcol of a class for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the class to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findClassPosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding class position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find predicate position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface PredicatePosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a predicate name in a QL file.\n * Supports: \n * - predicate name(...) - predicates with no return type\n * - Type name(...) - predicates with return type (e.g., string foo())\n * - name(...) (inside class) - member predicates\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findPredicatePosition(filepath: string, predicateName: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n const escapedName = predicateName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Match predicate definition with the specific predicate name\n // Pattern 1: predicate name(...)\n const predicateKeywordRegex = new RegExp(`\\\\bpredicate\\\\s+(${escapedName})\\\\s*\\\\(`);\n let match = predicateKeywordRegex.exec(line);\n \n // Pattern 2: Type name(...) - predicates with return type\n // Matches: string foo(), int bar(), MyClass baz(), etc.\n // Must start at beginning of line (with optional whitespace) or after certain keywords\n if (!match) {\n const returnTypeRegex = new RegExp(`(?:^|\\\\s)(?:abstract\\\\s+)?(?:cached\\\\s+)?(?:private\\\\s+)?(?:deprecated\\\\s+)?(?:\\\\w+)\\\\s+(${escapedName})\\\\s*\\\\(`);\n match = returnTypeRegex.exec(line);\n }\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The predicate name is in capture group 1\n const predicateNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = predicateNameStart + 1; // 1-based column numbering\n const end_col = start_col + predicateName.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find predicate position tool with the MCP server\n */\nexport function registerFindPredicatePositionTool(server: McpServer): void {\n server.tool(\n 'find_predicate_position',\n 'Finds startline, startcol, endline endcol of a predicate for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the predicate to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findPredicatePosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding predicate position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find query files tool\n * Discovers and tracks all files related to a CodeQL query\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { findCodeQLQueryFiles } from '../../lib/query-file-finder';\nimport { logger } from '../../utils/logger';\n\n/**\n * Register the find_codeql_query_files tool\n */\nexport function registerFindCodeQLQueryFilesTool(server: McpServer): void {\n server.tool(\n 'find_codeql_query_files',\n 'Find and track all files and directories related to a CodeQL query, including resolved metadata',\n {\n queryPath: z.string().describe('Path to the CodeQL query file (.ql)'),\n language: z.string().optional().describe('Programming language (optional, will be inferred if not provided)'),\n resolveMetadata: z.boolean().optional().describe('Whether to resolve query metadata (default: true)')\n },\n async ({ queryPath, language, resolveMetadata }) => {\n try {\n const result = await findCodeQLQueryFiles(\n queryPath,\n language,\n resolveMetadata !== false // Default to true if not specified\n );\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]\n };\n } catch (error) {\n logger.error('Error finding CodeQL query files:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }\n ],\n isError: true\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query file finder utilities\n * Handles discovery and tracking of query-related files and directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { QueryFileInfo, QueryFilesResult } from '../types/codeql';\nimport { resolveQueryMetadata } from './metadata-resolver';\n\n// Supported CodeQL languages and their file extensions (alphabetically ordered)\nconst LANGUAGE_EXTENSIONS: Record = {\n actions: 'yml',\n cpp: 'cpp',\n csharp: 'cs',\n go: 'go',\n java: 'java',\n javascript: 'js',\n python: 'py',\n ruby: 'rb',\n swift: 'swift',\n typescript: 'ts'\n};\n\nconst KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS);\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n return LANGUAGE_EXTENSIONS[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Infer the language from the query file's directory structure\n */\nfunction inferLanguageFromPath(queryPath: string): string {\n const parts = queryPath.split(path.sep);\n\n for (const part of parts) {\n if (KNOWN_LANGUAGES.includes(part.toLowerCase())) {\n return part.toLowerCase();\n }\n }\n\n // Default fallback\n return 'unknown';\n}\n\n/**\n * Find the nearest qlpack.yml or codeql-pack.yml file by walking up the directory tree\n */\nfunction findNearestQlpack(startPath: string): string | null {\n let currentPath = startPath;\n const root = path.parse(currentPath).root;\n\n while (currentPath !== root) {\n // Check for codeql-pack.yml first (newer format), then qlpack.yml\n for (const packFile of ['codeql-pack.yml', 'qlpack.yml']) {\n const packPath = path.join(currentPath, packFile);\n if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) {\n return packPath;\n }\n }\n currentPath = path.dirname(currentPath);\n }\n\n return null;\n}\n\n/**\n * Read and parse qlpack.yml file\n */\nfunction readQlpackMetadata(qlpackPath: string): Record | null {\n try {\n const content = fs.readFileSync(qlpackPath, 'utf-8');\n const parsed = yaml.load(content) as Record;\n return parsed;\n } catch (_error) {\n // If we can't parse it, return null rather than failing\n return null;\n }\n}\n\n/**\n * Check if a file exists and return QueryFileInfo\n */\nfunction checkFile(filePath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n return {\n exists,\n path: filePath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: filePath // Return the path even on error\n };\n }\n}\n\n/**\n * Check if a directory exists and return QueryFileInfo\n */\nfunction checkDirectory(dirPath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n return {\n exists,\n path: dirPath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: dirPath // Return the path even on error\n };\n }\n}\n\n/**\n * Find all test code files in the test directory\n */\nfunction findTestCodeFiles(testDir: string, queryName: string, language: string): string[] {\n if (!fs.existsSync(testDir)) {\n return [];\n }\n\n try {\n const files = fs.readdirSync(testDir);\n const languageExt = getLanguageExtension(language);\n const testFiles: string[] = [];\n\n // Look for files matching the query name or other test code files\n const allValidExtensions = [...new Set([...Object.values(LANGUAGE_EXTENSIONS), 'yaml'])]; // Include yaml as alias for yml\n\n for (const file of files) {\n const filePath = path.join(testDir, file);\n const stat = fs.statSync(filePath);\n\n if (stat.isFile()) {\n // Include the primary test file matching query name\n if (file === `${queryName}.${languageExt}`) {\n testFiles.push(filePath);\n }\n // Include other code files (but not .qlref, .expected, .actual files)\n else if (!file.endsWith('.qlref') && !file.endsWith('.expected') && !file.endsWith('.actual')) {\n const ext = path.extname(file).slice(1);\n if (ext === languageExt || allValidExtensions.includes(ext)) {\n testFiles.push(filePath);\n }\n }\n }\n }\n\n return testFiles;\n } catch {\n return [];\n }\n}\n\n/**\n * Find CodeQL query files and directories based on a query file path\n * Optionally resolves metadata if the query file exists\n */\nexport async function findCodeQLQueryFiles(\n queryFilePath: string,\n language?: string,\n resolveMetadata: boolean = true\n): Promise {\n // Resolve absolute path\n const absoluteQueryPath = path.resolve(queryFilePath);\n\n // Extract query name and directory\n const queryName = path.basename(absoluteQueryPath, '.ql');\n const queryDir = path.dirname(absoluteQueryPath);\n\n // Infer language if not provided\n const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath);\n\n // Check query file itself\n const queryPath = checkFile(absoluteQueryPath);\n const queryDirectory = checkDirectory(queryDir);\n\n // Check for documentation files\n const mdPath = path.join(queryDir, `${queryName}.md`);\n const qhelpPath = path.join(queryDir, `${queryName}.qhelp`);\n const mdInfo = checkFile(mdPath);\n const qhelpInfo = checkFile(qhelpPath);\n\n const documentationPath: QueryFileInfo = mdInfo.exists ? mdInfo : (qhelpInfo.exists ? qhelpInfo : {\n exists: false,\n path: mdPath // Suggest .md as the default\n });\n\n // Check for specification file\n const qspecPath = path.join(queryDir, `${queryName}.qspec`);\n const specificationPath = checkFile(qspecPath);\n\n // Determine test directory\n // Pattern: if query is in .../src/QueryName/, test should be in .../test/QueryName/\n let testDir: string;\n if (queryDir.includes(`${path.sep}src${path.sep}`)) {\n // Find the last occurrence of /src/ and replace it with /test/\n const parts = queryDir.split(path.sep);\n const srcIndex = parts.lastIndexOf('src');\n if (srcIndex !== -1) {\n parts[srcIndex] = 'test';\n testDir = parts.join(path.sep);\n } else {\n // Fallback in case split didn't find it\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n } else {\n // Fallback: if not in src directory, construct test dir based on parent\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n const testDirectory = checkDirectory(testDir);\n\n // Check for .qlref file\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const qlrefInfo = checkFile(qlrefPath);\n\n // Find test code files\n const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage);\n\n // Check for expected results\n const expectedPath = path.join(testDir, `${queryName}.expected`);\n const expectedResultsPath = checkFile(expectedPath);\n\n // Check for actual results\n const actualPath = path.join(testDir, `${queryName}.actual`);\n const actualResultsPath = checkFile(actualPath);\n\n // Check for test database\n const testprojPath = path.join(testDir, `${queryName}.testproj`);\n const testDatabasePath = checkDirectory(testprojPath);\n\n // Determine missing files\n const missingFiles: string[] = [];\n if (!queryPath.exists) missingFiles.push(queryPath.path);\n if (!documentationPath.exists) missingFiles.push(documentationPath.path);\n if (!specificationPath.exists) missingFiles.push(specificationPath.path);\n if (!testDirectory.exists) missingFiles.push(testDirectory.path);\n if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path);\n if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`));\n if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path);\n\n const allFilesExist = missingFiles.length === 0;\n\n // Resolve metadata if requested and query file exists\n let metadata: { [key: string]: string | string[] } | undefined;\n if (resolveMetadata && queryPath.exists) {\n const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath);\n if (resolvedMetadata) {\n metadata = resolvedMetadata;\n }\n }\n\n // Resolve pack metadata and directories by finding the nearest qlpack.yml files\n let packMetadata: Record | undefined;\n const queryPackPath = findNearestQlpack(queryDir);\n const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir;\n if (queryPackPath) {\n const parsed = readQlpackMetadata(queryPackPath);\n if (parsed) {\n packMetadata = parsed;\n }\n }\n\n // Find pack directory for test files\n const testPackPath = findNearestQlpack(testDir);\n const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir;\n\n return {\n queryName,\n language: detectedLanguage,\n\n allFilesExist,\n\n files: {\n query: {\n dir: queryDirectory.path,\n doc: path.basename(documentationPath.path),\n packDir: queryPackDir,\n query: path.basename(queryPath.path),\n spec: path.basename(specificationPath.path)\n },\n test: {\n actual: path.basename(actualResultsPath.path),\n dir: testDirectory.path,\n expected: path.basename(expectedResultsPath.path),\n packDir: testPackDir,\n qlref: path.basename(qlrefInfo.path),\n testCode: testCodePaths,\n testDatabaseDir: testDatabasePath.path\n }\n },\n\n metadata,\n\n missingFiles,\n\n packMetadata,\n\n status: {\n actualResultsExist: actualResultsPath.exists,\n documentationExists: documentationPath.exists,\n expectedResultsExist: expectedResultsPath.exists,\n hasTestCode: testCodePaths.length > 0,\n qlrefExists: qlrefInfo.exists,\n queryExists: queryPath.exists,\n specificationExists: specificationPath.exists,\n testDatabaseDirExists: testDatabasePath.exists,\n testDirectoryExists: testDirectory.exists\n }\n };\n}\n", "\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n", "/**\n * CodeQL metadata resolver utilities\n * Handles resolution of query metadata using the CodeQL CLI\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * Query metadata structure returned by codeql resolve metadata\n */\nexport interface QueryMetadata {\n [key: string]: string | string[];\n}\n\n/**\n * Resolve metadata for a CodeQL query file\n * @param queryPath - Absolute or relative path to the .ql query file\n * @returns Parsed metadata object or null if resolution fails\n */\nexport async function resolveQueryMetadata(queryPath: string): Promise {\n try {\n logger.info(`Resolving metadata for query: ${queryPath}`);\n\n const result = await executeCodeQLCommand(\n 'resolve metadata',\n { format: 'json' },\n [queryPath]\n );\n\n if (!result.success) {\n logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error);\n return null;\n }\n\n // Parse the JSON output\n try {\n const metadata = JSON.parse(result.stdout);\n return metadata;\n } catch (parseError) {\n logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError);\n return null;\n }\n } catch (error) {\n logger.error(`Error resolving metadata for ${queryPath}:`, error);\n return null;\n }\n}\n", "/**\n * CodeQL generate log-summary tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateLogSummaryTool: CLIToolDefinition = {\n name: 'codeql_generate_log-summary',\n description: 'Create a summary of a structured JSON evaluator event log file',\n command: 'codeql',\n subcommand: 'generate log-summary',\n inputSchema: {\n inputLog: z.string().describe('Path to the evaluator log file to summarize'),\n outputFile: z.string().optional().describe('Path to write the summary (optional, defaults to stdout)'),\n format: z.enum(['text', 'predicates', 'overall']).optional()\n .describe('Output format: text (human-readable), predicates (JSON), or overall (stats)'),\n 'minify-output': z.boolean().optional().describe('Minify JSON output'),\n utc: z.boolean().optional().describe('Force UTC timestamps'),\n 'deduplicate-stage-summaries': z.boolean().optional().describe('Deduplicate stage summaries'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt',\n 'codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt',\n 'codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL generate query-help tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateQueryHelpTool: CLIToolDefinition = {\n name: 'codeql_generate_query-help',\n description: 'Generate query help documentation from QLDoc comments',\n command: 'codeql',\n subcommand: 'generate query-help',\n inputSchema: {\n query: z.string().describe('Path to the query file to generate help for'),\n outputFile: z.string().optional().describe('Path to write the help documentation'),\n format: z.enum(['markdown', 'text', 'html']).optional()\n .describe('Output format for the help documentation'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate query-help -- MyQuery.ql',\n 'codeql generate query-help --format=markdown -- MyQuery.ql help.md',\n 'codeql generate query-help --format=html -- MyQuery.ql help.html'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL Language Server Eval tool for MCP server\n * Provides real-time QL code validation through LSP communication\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { CodeQLLanguageServer, Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\n// Global language server instance for reuse across evaluations\nlet globalLanguageServer: CodeQLLanguageServer | null = null;\n\nexport interface LanguageServerEvalParams {\n qlCode: string;\n workspaceUri?: string;\n serverOptions?: LanguageServerOptions;\n}\n\nexport interface LanguageServerEvalResult {\n isValid: boolean;\n diagnostics: Diagnostic[];\n summary: {\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n };\n formattedOutput: string;\n}\n\n/**\n * Format diagnostics for human-readable output\n */\nfunction formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '\u2705 No issues found in QL code';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${diagnostics.length} issue(s):\\n`);\n\n diagnostics.forEach((diagnostic, index) => {\n const severityIcon = getSeverityIcon(diagnostic.severity);\n const severityName = getSeverityName(diagnostic.severity);\n const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`;\n \n lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`);\n lines.push(` ${diagnostic.message}`);\n if (diagnostic.source) {\n lines.push(` Source: ${diagnostic.source}`);\n }\n if (diagnostic.code) {\n lines.push(` Code: ${diagnostic.code}`);\n }\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n\nfunction getSeverityIcon(severity: number): string {\n switch (severity) {\n case 1: return '\u274C'; // Error\n case 2: return '\u26A0\uFE0F'; // Warning\n case 3: return '\u2139\uFE0F'; // Information\n case 4: return '\uD83D\uDCA1'; // Hint\n default: return '\u2753';\n }\n}\n\nfunction getSeverityName(severity: number): string {\n switch (severity) {\n case 1: return 'Error';\n case 2: return 'Warning';\n case 3: return 'Information';\n case 4: return 'Hint';\n default: return 'Unknown';\n }\n}\n\n/**\n * Initialize or get existing language server instance\n */\nasync function getLanguageServer(options: LanguageServerOptions = {}): Promise {\n if (globalLanguageServer && globalLanguageServer.isRunning()) {\n return globalLanguageServer;\n }\n\n // Set default options \u2014 use packageRootDir instead of process.cwd()\n // so the QL search path works regardless of where the server is launched.\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n const defaultOptions: LanguageServerOptions = {\n searchPath: resolve(pkgRoot, 'ql'),\n loglevel: 'WARN',\n ...options\n };\n\n globalLanguageServer = new CodeQLLanguageServer(defaultOptions);\n \n try {\n await globalLanguageServer.start();\n \n // Use provided workspace URI or default to ql directory under package root\n const workspaceUri = pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await globalLanguageServer.initialize(workspaceUri);\n \n logger.info('CodeQL Language Server started and initialized successfully');\n return globalLanguageServer;\n } catch (error) {\n logger.error('Failed to start language server:', error);\n globalLanguageServer = null;\n throw error;\n }\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server\n */\nexport async function evaluateQLCode({\n qlCode,\n workspaceUri: _workspaceUri,\n serverOptions = {}\n}: LanguageServerEvalParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n \n const languageServer = await getLanguageServer(serverOptions);\n \n // Generate unique URI for this evaluation\n const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href;\n \n const diagnostics = await languageServer.evaluateQL(qlCode, evalUri);\n \n // Count diagnostics by severity\n const summary = {\n errorCount: diagnostics.filter(d => d.severity === 1).length,\n warningCount: diagnostics.filter(d => d.severity === 2).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n hintCount: diagnostics.filter(d => d.severity === 4).length\n };\n \n const isValid = summary.errorCount === 0;\n const formattedOutput = formatDiagnostics(diagnostics);\n \n logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`);\n \n return {\n isValid,\n diagnostics,\n summary,\n formattedOutput\n };\n \n } catch (error) {\n logger.error('Error evaluating QL code:', error);\n throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Shutdown the global language server\n */\nexport async function shutdownLanguageServer(): Promise {\n if (globalLanguageServer) {\n logger.info('Shutting down CodeQL Language Server...');\n await globalLanguageServer.shutdown();\n globalLanguageServer = null;\n }\n}\n\n/**\n * Register the language server eval tool with the MCP server\n */\nexport function registerLanguageServerEvalTool(server: McpServer): void {\n server.tool(\n 'codeql_language_server_eval',\n 'Authoritative syntax and semantic validation of CodeQL (QL) code via the CodeQL Language Server. Compiles the query and provides real-time diagnostics with precise error locations. Use this for accurate validation; for quick heuristic checks without compilation, use validate_codeql_query instead.',\n {\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level')\n },\n async ({ ql_code, workspace_uri, search_path, log_level }) => {\n try {\n const serverOptions: LanguageServerOptions = {};\n \n if (search_path) {\n serverOptions.searchPath = search_path;\n }\n if (log_level) {\n serverOptions.loglevel = log_level;\n }\n \n const result = await evaluateQLCode({\n qlCode: ql_code,\n workspaceUri: workspace_uri,\n serverOptions\n });\n \n // Return structured result\n const responseContent = {\n isValid: result.isValid,\n summary: result.summary,\n formattedOutput: result.formattedOutput,\n diagnostics: result.diagnostics.map(d => ({\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n severity: getSeverityName(d.severity),\n message: d.message,\n code: d.code,\n source: d.source\n }))\n };\n \n return {\n content: [\n { \n type: 'text', \n text: JSON.stringify(responseContent, null, 2) \n }\n ],\n };\n \n } catch (error) {\n logger.error('Error in language server eval tool:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n \n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownLanguageServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownLanguageServer();\n });\n}", "/**\n * CodeQL Language Server manager for LSP communication\n * Manages the lifecycle and communication with the CodeQL language server process\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { setTimeout, clearTimeout } from 'timers';\nimport { pathToFileURL } from 'url';\nimport { delimiter, join } from 'path';\nimport { logger } from '../utils/logger';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\n\nexport interface LSPMessage {\n jsonrpc: '2.0';\n id?: number | string;\n method: string;\n params?: unknown;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport interface Diagnostic {\n range: {\n start: { line: number; character: number };\n end: { line: number; character: number };\n };\n severity: number; // 1=Error, 2=Warning, 3=Information, 4=Hint\n source?: string;\n message: string;\n code?: string | number;\n}\n\nexport interface PublishDiagnosticsParams {\n uri: string;\n diagnostics: Diagnostic[];\n}\n\nexport interface LanguageServerOptions {\n searchPath?: string;\n logdir?: string;\n loglevel?: 'OFF' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'ALL';\n synchronous?: boolean;\n verbosity?: 'errors' | 'warnings' | 'progress' | 'progress+' | 'progress++' | 'progress+++';\n}\n\nexport class CodeQLLanguageServer extends EventEmitter {\n private server: ChildProcess | null = null;\n private messageId = 1;\n private pendingResponses = new Map void; reject: (_error: Error) => void }>();\n private isInitialized = false;\n private messageBuffer = '';\n\n constructor(private _options: LanguageServerOptions = {}) {\n super();\n }\n\n async start(): Promise {\n if (this.server) {\n throw new Error('Language server is already running');\n }\n\n logger.info('Starting CodeQL Language Server...');\n\n const args = [\n 'execute', 'language-server',\n '--check-errors=ON_CHANGE'\n ];\n\n // Add optional arguments\n if (this._options.searchPath) {\n args.push(`--search-path=${this._options.searchPath}`);\n }\n if (this._options.logdir) {\n args.push(`--logdir=${this._options.logdir}`);\n }\n if (this._options.loglevel) {\n args.push(`--loglevel=${this._options.loglevel}`);\n }\n if (this._options.synchronous) {\n args.push('--synchronous');\n }\n if (this._options.verbosity) {\n args.push(`--verbosity=${this._options.verbosity}`);\n }\n\n // Build environment with CODEQL_PATH directory prepended to PATH\n // (mirrors the approach in cli-executor.ts getSafeEnvironment).\n const spawnEnv = { ...process.env };\n const codeqlDir = getResolvedCodeQLDir();\n if (codeqlDir && spawnEnv.PATH) {\n spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`;\n } else if (codeqlDir) {\n spawnEnv.PATH = codeqlDir;\n }\n\n this.server = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv\n });\n\n this.server.stderr?.on('data', (data) => {\n logger.debug('CodeQL LS stderr:', data.toString());\n });\n\n this.server.stdout?.on('data', (data) => {\n this.handleStdout(data);\n });\n\n this.server.on('error', (error) => {\n logger.error('CodeQL Language Server error:', error);\n this.emit('error', error);\n });\n\n this.server.on('exit', (code) => {\n logger.info('CodeQL Language Server exited with code:', code);\n this.server = null;\n this.isInitialized = false;\n this.emit('exit', code);\n });\n\n // Wait for server to be ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n private handleStdout(data: Buffer): void {\n this.messageBuffer += data.toString();\n \n let headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n while (headerEnd !== -1) {\n const header = this.messageBuffer.substring(0, headerEnd);\n const contentLengthMatch = header.match(/Content-Length: (\\d+)/);\n \n if (contentLengthMatch) {\n const contentLength = parseInt(contentLengthMatch[1]);\n const messageStart = headerEnd + 4;\n const messageEnd = messageStart + contentLength;\n \n if (this.messageBuffer.length >= messageEnd) {\n const messageContent = this.messageBuffer.substring(messageStart, messageEnd);\n this.messageBuffer = this.messageBuffer.substring(messageEnd);\n \n try {\n const message: LSPMessage = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse LSP message:', error, messageContent);\n }\n \n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid LSP header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: LSPMessage): void {\n logger.debug('Received LSP message:', message);\n\n // Handle responses to our requests\n if (message.id !== undefined && this.pendingResponses.has(Number(message.id))) {\n const pending = this.pendingResponses.get(Number(message.id))!;\n this.pendingResponses.delete(Number(message.id));\n \n if (message.error) {\n pending.reject(new Error(`LSP Error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications from server\n if (message.method === 'textDocument/publishDiagnostics') {\n this.emit('diagnostics', message.params as PublishDiagnosticsParams);\n }\n }\n\n private sendMessage(message: LSPMessage): void {\n if (!this.server?.stdin) {\n throw new Error('Language server is not running');\n }\n\n const messageStr = JSON.stringify(message);\n const contentLength = Buffer.byteLength(messageStr, 'utf8');\n const header = `Content-Length: ${contentLength}\\r\\n\\r\\n`;\n const fullMessage = header + messageStr;\n\n logger.debug('Sending LSP message:', fullMessage);\n this.server.stdin.write(fullMessage);\n }\n\n private sendRequest(method: string, params?: unknown): Promise {\n const id = this.messageId++;\n const message: LSPMessage = {\n jsonrpc: '2.0',\n id,\n method,\n params\n };\n\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n this.sendMessage(message);\n \n // Add timeout\n setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 10000); // 10 second timeout\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n const message: LSPMessage = {\n jsonrpc: '2.0',\n method,\n params\n };\n this.sendMessage(message);\n }\n\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n return;\n }\n\n logger.info('Initializing CodeQL Language Server...');\n\n const initParams = {\n processId: process.pid,\n clientInfo: {\n name: 'codeql-development-mcp-server',\n version: '2.23.9'\n },\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n didClose: true\n },\n publishDiagnostics: {}\n }\n }\n };\n\n if (workspaceUri) {\n (initParams as unknown as { workspaceFolders: unknown[] }).workspaceFolders = [{\n uri: workspaceUri,\n name: 'codeql-workspace'\n }];\n }\n\n await this.sendRequest('initialize', initParams);\n this.sendNotification('initialized', {});\n \n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n async evaluateQL(qlCode: string, uri?: string): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n\n // Default to a project-local virtual URI rather than /tmp\n const documentUri = uri || pathToFileURL(join(getProjectTmpDir('lsp-eval'), 'eval.ql')).href;\n\n return new Promise((resolve, reject) => {\n let diagnosticsReceived = false;\n const timeout = setTimeout(() => {\n if (!diagnosticsReceived) {\n this.removeAllListeners('diagnostics');\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 5000);\n\n // Listen for diagnostics\n const diagnosticsHandler = (params: PublishDiagnosticsParams) => {\n if (params.uri === documentUri) {\n diagnosticsReceived = true;\n clearTimeout(timeout);\n this.removeListener('diagnostics', diagnosticsHandler);\n\n // Close the document\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri: documentUri }\n });\n\n resolve(params.diagnostics);\n }\n };\n\n this.on('diagnostics', diagnosticsHandler);\n\n // Open the document with the QL code\n this.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri: documentUri,\n languageId: 'ql',\n version: 1,\n text: qlCode\n }\n });\n });\n }\n\n async shutdown(): Promise {\n if (!this.server) {\n return;\n }\n\n logger.info('Shutting down CodeQL Language Server...');\n\n try {\n await this.sendRequest('shutdown', {});\n this.sendNotification('exit', {});\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n }, 1000);\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL pack install tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackInstallTool: CLIToolDefinition = {\n name: 'codeql_pack_install',\n description: 'Install CodeQL pack dependencies',\n command: 'codeql',\n subcommand: 'pack install',\n inputSchema: {\n packDir: z.string().optional().describe('Directory containing qlpack.yml (default: current)'),\n force: z.boolean().optional().describe('Force reinstall of dependencies'),\n 'no-strict-mode': z.boolean().optional()\n .describe('Allow non-strict dependency resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack install',\n 'codeql pack install --force /path/to/pack',\n 'codeql pack install --no-strict-mode'\n ]\n};", "/**\n * CodeQL pack ls tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackLsTool: CLIToolDefinition = {\n name: 'codeql_pack_ls',\n description: 'List CodeQL packs under some local directory path',\n command: 'codeql',\n subcommand: 'pack ls',\n inputSchema: {\n dir: z.string().optional().describe('The root directory of the package or workspace, defaults to the current working directory'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format: text (default) or json'),\n groups: z.string().optional()\n .describe('List of CodeQL pack groups to include or exclude'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack ls -- .',\n 'codeql pack ls --format=json -- /path/to/pack-directory',\n 'codeql pack ls --format=json --groups=queries,tests -- .'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL query profiling tool\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand } from '../../lib/cli-executor';\nimport { logger } from '../../utils/logger';\nimport { writeFileSync, readFileSync, existsSync } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { mkdirSync } from 'fs';\n\ninterface EvaluatorLogEvent {\n time: string;\n type: string;\n eventId: number;\n nanoTime: number;\n [key: string]: unknown;\n}\n\ninterface PipelineNode {\n eventId: number;\n name: string;\n position?: string;\n type?: string;\n startTime: number;\n endTime: number;\n duration: number;\n resultSize?: number;\n tupleCount?: number;\n dependencies: string[];\n dependencyEventIds: number[];\n}\n\ninterface ProfileData {\n queryName: string;\n totalDuration: number;\n totalEvents: number;\n pipelines: PipelineNode[];\n}\n\n/**\n * Parse evaluator log and create profile data\n */\nfunction parseEvaluatorLog(logPath: string): ProfileData {\n const logContent = readFileSync(logPath, 'utf-8');\n \n // Split by empty lines to get each JSON object (handles both JSONL and pretty-printed JSON)\n const jsonObjects = logContent.split('\\n\\n').filter((s) => s.trim());\n const events: EvaluatorLogEvent[] = jsonObjects\n .map((obj) => {\n try {\n return JSON.parse(obj);\n } catch (_error) {\n logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`);\n return null;\n }\n })\n .filter((event): event is EvaluatorLogEvent => event !== null);\n\n // Map to track pipeline nodes by their start event ID\n const pipelineMap = new Map>();\n // Map to track dependency event IDs by predicate name\n const predicateNameToEventId = new Map();\n \n let queryName = '';\n let queryStartTime = 0;\n let queryEndTime = 0;\n\n for (const event of events) {\n switch (event.type) {\n case 'QUERY_STARTED':\n queryName = (event.queryName as string) || '';\n queryStartTime = event.nanoTime;\n break;\n\n case 'QUERY_COMPLETED':\n queryEndTime = event.nanoTime;\n break;\n\n case 'PREDICATE_STARTED': {\n const predicateName = event.predicateName as string;\n const position = event.position as string | undefined;\n const predicateType = event.predicateType as string | undefined;\n const dependencies = event.dependencies as Record | undefined;\n \n // Track this predicate's event ID by name for dependency resolution\n predicateNameToEventId.set(predicateName, event.eventId);\n \n // Get dependency event IDs\n const dependencyEventIds: number[] = [];\n const dependencyNames: string[] = [];\n if (dependencies) {\n for (const depName of Object.keys(dependencies)) {\n dependencyNames.push(depName);\n const depEventId = predicateNameToEventId.get(depName);\n if (depEventId !== undefined) {\n dependencyEventIds.push(depEventId);\n }\n }\n }\n\n pipelineMap.set(event.eventId, {\n eventId: event.eventId,\n name: predicateName,\n position,\n type: predicateType,\n startTime: event.nanoTime,\n dependencies: dependencyNames,\n dependencyEventIds,\n });\n break;\n }\n\n case 'PREDICATE_COMPLETED': {\n const startEventId = event.startEvent as number;\n const pipelineInfo = pipelineMap.get(startEventId);\n if (pipelineInfo) {\n const startEvent = events.find((e) => e.eventId === startEventId);\n if (startEvent) {\n const duration = (event.nanoTime - startEvent.nanoTime) / 1_000_000; // Convert to ms\n pipelineInfo.endTime = event.nanoTime;\n pipelineInfo.duration = duration;\n pipelineInfo.resultSize = event.resultSize as number | undefined;\n pipelineInfo.tupleCount = event.tupleCount as number | undefined;\n }\n }\n break;\n }\n }\n }\n\n // Convert to array and maintain original evaluation order (by eventId)\n const pipelines: PipelineNode[] = Array.from(pipelineMap.values())\n .filter((p): p is PipelineNode => p.duration !== undefined)\n .sort((a, b) => a.eventId - b.eventId);\n\n const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1_000_000 : 0;\n\n return {\n queryName,\n totalDuration,\n totalEvents: events.length,\n pipelines,\n };\n}\n\n/**\n * Format profile data as JSON\n */\nfunction formatAsJson(profile: ProfileData): string {\n return JSON.stringify(profile, null, 2);\n}\n\n/**\n * Format profile data as Mermaid diagram\n * Creates a graph showing the query evaluation pipelines in order of execution\n * with dependencies as edges, annotated with duration and result sizes\n */\nfunction formatAsMermaid(profile: ProfileData): string {\n const lines: string[] = [];\n\n lines.push('```mermaid');\n lines.push('graph TD');\n lines.push('');\n \n // Add query root node\n lines.push(` QUERY[\"${basename(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms\"]`);\n lines.push('');\n \n // Create nodes for each pipeline in evaluation order (already sorted by eventId)\n profile.pipelines.forEach((pipeline) => {\n const nodeId = `P${pipeline.eventId}`;\n const duration = pipeline.duration.toFixed(2);\n const resultSize = pipeline.resultSize !== undefined ? pipeline.resultSize : '?';\n // Sanitize predicate name for Mermaid\n const name = pipeline.name.replace(/[<>]/g, '').substring(0, 40);\n lines.push(` ${nodeId}[\"${name}
${duration}ms | ${resultSize} results\"]`);\n });\n \n lines.push('');\n \n // Add edges from QUERY to root pipelines (those with no dependencies)\n const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0);\n \n rootPipelines.forEach((pipeline) => {\n lines.push(` QUERY --> P${pipeline.eventId}`);\n });\n \n lines.push('');\n \n // Add edges between pipelines based on dependencies (using eventIds to preserve links)\n profile.pipelines.forEach((pipeline) => {\n pipeline.dependencyEventIds.forEach((depEventId) => {\n const duration = pipeline.duration.toFixed(2);\n lines.push(` P${depEventId} -->|\"${duration}ms\"| P${pipeline.eventId}`);\n });\n });\n \n lines.push('');\n lines.push(' classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px');\n lines.push(' classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px');\n lines.push(' class QUERY query');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Register the profile_codeql_query tool\n */\nexport function registerProfileCodeQLQueryTool(server: McpServer): void {\n server.tool(\n 'profile_codeql_query',\n 'Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file',\n {\n query: z.string().describe('Path to the .ql query file'),\n database: z.string().describe('Path to the CodeQL database directory'),\n evaluatorLog: z\n .string()\n .optional()\n .describe(\n 'Path to an existing structured JSON log (e.g., evaluator-log.jsonl) file. If not provided, the tool will run the query to generate one.'\n ),\n outputDir: z\n .string()\n .optional()\n .describe('Directory to write profiling data files (defaults to same directory as evaluator log)'),\n },\n async (params) => {\n try {\n const { query, database, evaluatorLog, outputDir } = params;\n let logPath = evaluatorLog;\n let bqrsPath: string | undefined;\n let sarifPath: string | undefined;\n\n // If evaluator log not provided, run the query to generate one\n if (!logPath) {\n logger.info('No evaluator log provided, running query to generate one');\n\n // Determine output directory\n const defaultOutputDir = outputDir || join(dirname(query as string), 'profile-output');\n mkdirSync(defaultOutputDir, { recursive: true });\n\n logPath = join(defaultOutputDir, 'evaluator-log.jsonl');\n bqrsPath = join(defaultOutputDir, 'query-results.bqrs');\n sarifPath = join(defaultOutputDir, 'query-results.sarif');\n\n // Run query with evaluator logging and tuple counting\n const queryResult = await executeCodeQLCommand(\n 'query run',\n {\n database: database as string,\n output: bqrsPath,\n 'evaluator-log': logPath,\n 'tuple-counting': true,\n 'evaluator-log-level': 5,\n },\n [query as string]\n );\n\n if (!queryResult.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to run query: ${queryResult.stderr || queryResult.error}`,\n },\n ],\n isError: true,\n };\n }\n\n // Generate SARIF interpretation\n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n\n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n }\n\n // Verify evaluator log exists\n if (!existsSync(logPath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Evaluator log not found at: ${logPath}`,\n },\n ],\n isError: true,\n };\n }\n\n // Parse the evaluator log\n logger.info(`Parsing evaluator log from: ${logPath}`);\n const profile = parseEvaluatorLog(logPath);\n\n // Determine output directory for profile\n const profileOutputDir = outputDir || dirname(logPath);\n mkdirSync(profileOutputDir, { recursive: true });\n\n // Write profile JSON file\n const jsonPath = join(profileOutputDir, 'query-evaluation-profile.json');\n const jsonContent = formatAsJson(profile);\n writeFileSync(jsonPath, jsonContent);\n logger.info(`Profile JSON written to: ${jsonPath}`);\n\n // Write profile Mermaid diagram file\n const mdPath = join(profileOutputDir, 'query-evaluation-profile.md');\n const mdContent = formatAsMermaid(profile);\n writeFileSync(mdPath, mdContent);\n logger.info(`Profile Mermaid diagram written to: ${mdPath}`);\n\n // Build response message\n const outputFiles: string[] = [\n `Profile JSON: ${jsonPath}`,\n `Profile Mermaid: ${mdPath}`,\n `Evaluator Log: ${logPath}`,\n ];\n\n if (bqrsPath) {\n outputFiles.push(`Query Results (BQRS): ${bqrsPath}`);\n }\n\n if (sarifPath && existsSync(sarifPath)) {\n outputFiles.push(`Query Results (SARIF): ${sarifPath}`);\n }\n\n const responseText = [\n 'Query profiling completed successfully!',\n '',\n 'Output Files:',\n ...outputFiles.map((f) => ` - ${f}`),\n '',\n 'Profile Summary:',\n ` - Query: ${basename(profile.queryName)}`,\n ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`,\n ` - Total Pipelines: ${profile.pipelines.length}`,\n ` - Total Events: ${profile.totalEvents}`,\n '',\n 'First 5 Pipeline Nodes (in evaluation order):',\n ...profile.pipelines.slice(0, 5).map((p, idx) => {\n return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || '?'} results)`;\n }),\n ].join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n };\n } catch (error) {\n logger.error('Error profiling CodeQL query:', error);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query compile tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryCompileTool: CLIToolDefinition = {\n name: 'codeql_query_compile',\n description: 'Compile and validate CodeQL queries',\n command: 'codeql',\n subcommand: 'query compile',\n inputSchema: {\n query: z.string().describe('Path to the CodeQL query file (.ql)'),\n database: z.string().optional().describe('Path to the CodeQL database'),\n library: z.string().optional().describe('Path to query library'),\n output: z.string().optional().describe('Output file path'),\n warnings: z.enum(['hide', 'show', 'error']).optional()\n .describe('How to handle compilation warnings'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql query compile --database=/path/to/db MyQuery.ql',\n 'codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql'\n ]\n};", "/**\n * CodeQL query format tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Custom result processor for codeql query format tool\n * Exit code 1 with --check-only means \"file would change\" - this is success for format checking\n */\nfunction formatResultProcessor(result: CLIExecutionResult, params: Record): string {\n const isCheckOnly = params['check-only'];\n const hasFormatChanges = result.exitCode === 1;\n \n if (isCheckOnly && hasFormatChanges) {\n // Mark as success for the CLI tool registry since detecting format changes is the intended behavior\n result.success = true;\n return result.stdout || result.stderr || 'File would change by autoformatting.';\n }\n \n return defaultCLIResultProcessor(result, params);\n}\n\nexport const codeqlQueryFormatTool: CLIToolDefinition = {\n name: 'codeql_query_format',\n description: 'Automatically format CodeQL source code files',\n command: 'codeql',\n subcommand: 'query format',\n inputSchema: {\n files: z.array(z.string()).describe('One or more .ql or .qll source files to format'),\n output: z.string().optional().describe('Write formatted code to this file instead of stdout'),\n 'in-place': z.boolean().optional().describe('Overwrite each input file with formatted version'),\n 'check-only': z.boolean().optional().describe('Check formatting without writing output'),\n backup: z.string().optional().describe('Backup extension when overwriting existing files'),\n 'no-syntax-errors': z.boolean().optional().describe('Ignore syntax errors and pretend file is formatted'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query format -i -- ExampleQuery.ql',\n 'codeql query format --in-place -- queries/*.ql',\n 'codeql query format --check-only -- queries/*.ql'\n ],\n resultProcessor: formatResultProcessor\n};", "/**\n * CodeQL query run tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryRunTool: CLIToolDefinition = {\n name: 'codeql_query_run',\n description: 'Execute a CodeQL query against a database. Use either \"query\" parameter for direct file path OR \"queryName\" + \"queryLanguage\" for pre-defined tool queries.',\n command: 'codeql',\n subcommand: 'query run',\n inputSchema: {\n query: z.string().optional().describe('Path to the CodeQL query file (.ql) - cannot be used with queryName'),\n queryName: z.string().optional().describe('Name of pre-defined query to run (e.g., \"PrintAST\", \"CallGraphFrom\", \"CallGraphTo\") - requires queryLanguage'),\n queryLanguage: z.string().optional().describe('Programming language for tools queries (e.g., \"javascript\", \"java\", \"python\") - required when using queryName'),\n queryPack: z.string().optional().describe('Query pack path (defaults to server/ql//tools/src/ for tool queries)'),\n sourceFiles: z.string().optional().describe('Comma-separated list of source file paths for PrintAST queries (e.g., \"src/main.js,src/utils.js\" or just \"main.js\")'),\n sourceFunction: z.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., \"main,processData\")'),\n targetFunction: z.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., \"helper,validateInput\")'),\n database: createCodeQLSchemas.database(),\n output: createCodeQLSchemas.output(),\n external: z.array(z.string()).optional()\n .describe('External predicate data: predicate=file.csv'),\n timeout: createCodeQLSchemas.timeout(),\n logDir: z.string().optional()\n .describe('Custom directory for query execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n 'evaluator-log': z.string().optional().describe('Path to save evaluator log (deprecated: use logDir instead)'),\n 'evaluator-log-minify': z.boolean().optional()\n .describe('Minimize evaluator log for smaller size'),\n 'evaluator-log-level': z.number().min(1).max(5).optional()\n .describe('Evaluator log verbosity level (1-5, default 5)'),\n 'tuple-counting': z.boolean().optional()\n .describe('Display tuple counts for each evaluation step in evaluator logs'),\n format: z.enum(['sarif-latest', 'sarifv2.1.0', 'csv', 'graphtext', 'dgml', 'dot']).optional()\n .describe('Output format for query results via codeql bqrs interpret. Defaults to sarif-latest for @kind problem/path-problem queries, graphtext for @kind graph queries. Graph formats (graphtext, dgml, dot) only work with @kind graph queries.'),\n interpretedOutput: z.string().optional()\n .describe('Output file for interpreted results (e.g., results.sarif, results.txt). If not provided, defaults based on format: .sarif for SARIF, .txt for graphtext/csv, .dgml for dgml, .dot for dot'),\n evaluationFunction: z.string().optional()\n .describe('[DEPRECATED - use format parameter instead] Built-in function for query results evaluation (e.g., \"mermaid-graph\", \"json-decode\", \"csv-decode\") or path to custom evaluation script'),\n evaluationOutput: z.string().optional()\n .describe('[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query run --database=mydb --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=src/index.js --output=results.bqrs --format=graphtext --interpreted-output=results.txt',\n 'codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif',\n 'codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=\"main.js,utils.js\" --format=graphtext',\n 'codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql'\n ]\n};", "/**\n * CodeQL quick evaluate tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { join, resolve } from 'path';\nimport { findClassPosition } from './find-class-position';\nimport { findPredicatePosition } from './find-predicate-position';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\n\nexport interface QuickEvaluateParams {\n file: string;\n db: string;\n symbol: string;\n output_path?: string;\n}\n\n/**\n * Quick evaluate either a class or a predicate in a CodeQL query.\n * This allows debugging a select portion of QL code without running the whole query.\n */\nexport async function quickEvaluate({\n file,\n db: _db,\n symbol,\n output_path\n}: QuickEvaluateParams): Promise {\n try {\n // Try to find as a class first, then as a predicate\n try {\n await findClassPosition(file, symbol);\n } catch {\n try {\n await findPredicatePosition(file, symbol);\n } catch {\n throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`);\n }\n }\n \n const resolvedOutput = resolve(output_path || join(getProjectTmpDir('quickeval'), 'quickeval.bqrs'));\n \n // For now, return the resolved output path\n // In a full implementation, this would use the CodeQL CLI or query server\n // to perform the actual quick evaluation with the position parameters\n return resolvedOutput;\n } catch (error) {\n throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the quick evaluate tool with the MCP server\n */\nexport function registerQuickEvaluateTool(server: McpServer): void {\n server.tool(\n 'quick_evaluate',\n 'Quick evaluate either a class or a predicate in a CodeQL query for debugging',\n {\n file: z.string().describe('Path to the .ql file containing the symbol'),\n db: z.string().describe('Path to the CodeQL database'),\n symbol: z.string().describe('Name of the class or predicate to evaluate'),\n output_path: z.string().optional().describe('Output path for results (defaults to project-local .tmp/quickeval/)'),\n },\n async ({ file, db, symbol, output_path }) => {\n try {\n const result = await quickEvaluate({ file, db, symbol, output_path });\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error in quick evaluate:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL register database tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { access, constants } from 'fs/promises';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger';\n\nexport interface DatabaseRegistration {\n uri: string;\n content: {\n sourceArchiveZip: string;\n dbDir: string;\n };\n}\n\n/**\n * Register a CodeQL database given a local path to the database directory.\n * Validates that the database exists and has required structure.\n * Supports both full databases (with src.zip) and test databases (with src/ folder).\n */\nexport async function registerDatabase(dbPath: string): Promise {\n try {\n const resolvedPath = resolve(dbPath);\n \n // Check if database directory exists\n await access(resolvedPath, constants.F_OK);\n \n // Check for codeql-database.yml (required for all CodeQL databases)\n const dbYmlPath = resolve(resolvedPath, 'codeql-database.yml');\n await access(dbYmlPath, constants.F_OK);\n \n // Check if src.zip exists (for full databases) OR src/ directory exists (for test databases)\n const srcZipPath = resolve(resolvedPath, 'src.zip');\n const srcDirPath = resolve(resolvedPath, 'src');\n \n let hasSrcZip = false;\n let hasSrcDir = false;\n \n try {\n await access(srcZipPath, constants.F_OK);\n hasSrcZip = true;\n } catch {\n // src.zip not found, check for src/ directory\n }\n \n if (!hasSrcZip) {\n try {\n await access(srcDirPath, constants.F_OK);\n hasSrcDir = true;\n } catch {\n // src directory not found either\n }\n }\n \n if (!hasSrcZip && !hasSrcDir) {\n throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`);\n }\n \n // For now, we just validate and return success message\n // In a full implementation, this would register with a query server\n const sourceType = hasSrcZip ? 'src.zip' : 'src/';\n return `Database registered: ${dbPath} (source: ${sourceType})`;\n } catch (error) {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === 'ENOENT') {\n if (error.message.includes('codeql-database.yml')) {\n throw new Error(`Missing required codeql-database.yml in: ${dbPath}`);\n }\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n if (errorCode === 'EACCES') {\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n }\n throw new Error(`Failed to register database: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the register database tool with the MCP server\n */\nexport function registerRegisterDatabaseTool(server: McpServer): void {\n server.tool(\n 'register_database',\n 'Register a CodeQL database given a local path to the database directory',\n {\n db_path: z.string().describe('Path to the CodeQL database directory'),\n },\n async ({ db_path }) => {\n try {\n const result = await registerDatabase(db_path);\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error registering database:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL resolve database tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveDatabaseTool: CLIToolDefinition = {\n name: 'codeql_resolve_database',\n description: 'Resolve database path and validate database structure',\n command: 'codeql',\n subcommand: 'resolve database',\n inputSchema: {\n database: z.string().describe('Database path to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for database information'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve database -- /path/to/database',\n 'codeql resolve database --format=json -- my-database',\n 'codeql resolve database --format=betterjson -- database-dir'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve languages tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLanguagesTool: CLIToolDefinition = {\n name: 'codeql_resolve_languages',\n description: 'List installed CodeQL extractor packs',\n command: 'codeql',\n subcommand: 'resolve languages',\n inputSchema: {\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for language information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve languages --format=text',\n 'codeql resolve languages --format=json',\n 'codeql resolve languages --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve library-path tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLibraryPathTool: CLIToolDefinition = {\n name: 'codeql_resolve_library-path',\n description: 'Resolve library path for CodeQL queries and libraries',\n command: 'codeql',\n subcommand: 'resolve library-path',\n inputSchema: {\n language: z.string().optional().describe('Programming language to resolve library path for'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for library path information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve library-path --language=java',\n 'codeql resolve library-path --format=json --language=python',\n 'codeql resolve library-path --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve metadata tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveMetadataTool: CLIToolDefinition = {\n name: 'codeql_resolve_metadata',\n description: 'Resolve and return the key-value metadata pairs from a CodeQL query source file.',\n command: 'codeql',\n subcommand: 'resolve metadata',\n inputSchema: {\n query: z.string().describe('Query file to resolve metadata for'),\n format: z.enum(['json']).optional()\n .describe('Output format for metadata information (always JSON, optional for future compatibility)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve metadata -- relative-path/2/MyQuery.ql',\n 'codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve qlref tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveQlrefTool: CLIToolDefinition = {\n name: 'codeql_resolve_qlref',\n description: 'Resolve qlref files to their corresponding query files',\n command: 'codeql',\n subcommand: 'resolve qlref',\n inputSchema: {\n qlref: z.string().describe('Path to the .qlref file to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for qlref resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve qlref -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=json -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=betterjson -- test/MyQuery.qlref'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve queries tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Result processor that only returns stdout for JSON formats\n * This prevents warnings/info from stderr from corrupting JSON output\n */\nconst jsonOnlyResultProcessor = (\n result: CLIExecutionResult,\n params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n\n // For JSON formats (including bylanguage), only return stdout to avoid mixing warnings with JSON\n if (params.format === 'json' || params.format === 'betterjson' || params.format === 'bylanguage') {\n return result.stdout || '[]';\n }\n\n // For text format, include warnings\n let output = '';\n\n if (result.stdout) {\n output += result.stdout;\n }\n\n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n\n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n\n return output;\n};\n\nexport const codeqlResolveQueriesTool: CLIToolDefinition = {\n name: 'codeql_resolve_queries',\n description: 'List available CodeQL queries found on the local filesystem',\n command: 'codeql',\n subcommand: 'resolve queries',\n inputSchema: {\n directory: z.string().optional().describe('Directory to search for queries'),\n language: z.string().optional().describe('Filter queries by programming language'),\n format: z.enum(['text', 'json', 'betterjson', 'bylanguage']).optional()\n .describe('Output format for query list'),\n 'additional-packs': z.union([z.string(), z.array(z.string())]).optional()\n .describe('Additional pack directories to search for CodeQL packs'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve queries',\n 'codeql resolve queries --language=java --format=json',\n 'codeql resolve queries --format=betterjson -- /path/to/queries',\n 'codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries'\n ],\n resultProcessor: jsonOnlyResultProcessor\n};", "/**\n * CodeQL resolve tests tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveTestsTool: CLIToolDefinition = {\n name: 'codeql_resolve_tests',\n description: 'Resolve the local filesystem paths of unit tests and/or queries under some base directory',\n command: 'codeql',\n subcommand: 'resolve tests',\n inputSchema: {\n tests: z.array(z.string()).optional().describe('One or more tests (.ql, .qlref files, or test directories)'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format for test list'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve tests',\n 'codeql resolve tests --format=json -- test-directory',\n 'codeql resolve tests --format=json -- test1.ql test2.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test accept tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestAcceptTool: CLIToolDefinition = {\n name: 'codeql_test_accept',\n description: 'Accept new test results as the expected baseline',\n command: 'codeql',\n subcommand: 'test accept',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref',\n 'codeql test accept -- languages/java/test/MyQuery/',\n 'codeql test accept -- languages/java/src/MyQuery/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test extract tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestExtractTool: CLIToolDefinition = {\n name: 'codeql_test_extract',\n description: 'Extract test databases for CodeQL query tests',\n command: 'codeql',\n subcommand: 'test extract',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more test directories or files'),\n language: z.string().optional().describe('Programming language for extraction'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test extract -- languages/java/test/MyQuery/',\n 'codeql test extract --language=java --threads=4 -- test-directory',\n 'codeql test extract --threads=2 --ram=2048 -- multiple/test/directories'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test run tool\n */\n\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\nimport { z } from 'zod';\n\nexport const codeqlTestRunTool: CLIToolDefinition = {\n name: 'codeql_test_run',\n description: 'Run CodeQL query tests',\n command: 'codeql',\n subcommand: 'test run',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n 'show-extractor-output': z.boolean().optional()\n .describe('Show output from extractors during test execution'),\n 'keep-databases': z.boolean().optional()\n .describe('Keep test databases after running tests'),\n 'learn': z.boolean().optional()\n .describe('Accept current output as expected for failing tests'),\n logDir: z.string().optional()\n .describe('Custom directory for test execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test run /path/to/tests',\n 'codeql test run --learn /path/to/failing/tests',\n 'codeql test run --threads=4 --keep-databases /path/to/tests',\n 'codeql test run --log-dir=/custom/log/path /path/to/tests'\n ]\n};", "/**\n * CodeQL tools registration for MCP server\n * Includes both high-level helpers and CLI command wrappers\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { validateCodeQLSyntax } from '../lib/validation';\nimport { createCodeQLQuery } from '../lib/query-scaffolding';\nimport { registerCLITool } from '../lib/cli-tool-registry';\nimport {\n codeqlBqrsDecodeTool,\n codeqlBqrsInfoTool,\n codeqlBqrsInterpretTool,\n codeqlDatabaseAnalyzeTool,\n codeqlDatabaseCreateTool,\n codeqlGenerateLogSummaryTool,\n codeqlGenerateQueryHelpTool,\n codeqlPackInstallTool,\n codeqlPackLsTool,\n codeqlQueryCompileTool,\n codeqlQueryFormatTool,\n codeqlQueryRunTool,\n codeqlResolveDatabaseTool,\n codeqlResolveLanguagesTool,\n codeqlResolveLibraryPathTool,\n codeqlResolveMetadataTool,\n codeqlResolveQlrefTool,\n codeqlResolveQueriesTool,\n codeqlResolveTestsTool,\n codeqlTestAcceptTool,\n codeqlTestExtractTool,\n codeqlTestRunTool,\n registerFindClassPositionTool,\n registerFindCodeQLQueryFilesTool,\n registerFindPredicatePositionTool,\n registerLanguageServerEvalTool,\n registerProfileCodeQLQueryTool,\n registerQuickEvaluateTool,\n registerRegisterDatabaseTool\n} from './codeql';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all CodeQL tools with the MCP server\n */\nexport function registerCodeQLTools(server: McpServer): void {\n // Register high-level helper tools\n \n // Tool: Validate CodeQL Query (heuristic-based)\n server.tool(\n 'validate_codeql_query',\n 'Quick heuristic validation for CodeQL query structure - checks for common patterns like from/where/select clauses and metadata presence. Does NOT compile the query. For authoritative validation with actual compilation, use codeql_language_server_eval instead.',\n {\n query: z.string().describe('The CodeQL query to validate'),\n language: z.string().optional().describe('Target programming language'),\n },\n async ({ query, language }) => {\n try {\n const validation = validateCodeQLSyntax(query, language);\n return {\n content: [{ type: 'text', text: JSON.stringify(validation, null, 2) }],\n };\n } catch (error) {\n logger.error('Error validating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Create CodeQL Query\n server.tool(\n 'create_codeql_query',\n 'Create directory structure and files for a new CodeQL query with tests',\n {\n basePath: z.string().describe('Base path where src/ and test/ directories will be created'),\n queryName: z.string().describe('Name of the query (e.g., MySecurityQuery)'),\n language: z.string().describe('Target programming language (e.g., javascript, python, java)'),\n description: z.string().optional().describe('Description of what the query does'),\n queryId: z.string().optional().describe('Custom query ID (defaults to language/example/queryname)'),\n },\n async ({ basePath, queryName, language, description, queryId }) => {\n try {\n const result = createCodeQLQuery({\n basePath,\n queryName,\n language,\n description,\n queryId\n });\n \n const summary = {\n success: true,\n queryPath: result.queryPath,\n testPath: result.testPath,\n qlrefPath: result.qlrefPath,\n testCodePath: result.testCodePath,\n filesCreated: result.filesCreated,\n nextSteps: [\n 'Review and customize the generated query in: ' + result.queryPath,\n 'Add test cases to: ' + result.testCodePath,\n 'Run codeql_pack_install to install dependencies',\n 'Run codeql_test_extract to create test database',\n 'Run codeql_test_run to execute tests'\n ]\n };\n \n return {\n content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }],\n };\n } catch (error) {\n logger.error('Error creating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register CLI tools (alphabetically by tool name)\n registerCLITool(server, codeqlBqrsDecodeTool);\n registerCLITool(server, codeqlBqrsInfoTool);\n registerCLITool(server, codeqlBqrsInterpretTool);\n registerCLITool(server, codeqlDatabaseAnalyzeTool);\n registerCLITool(server, codeqlDatabaseCreateTool);\n registerCLITool(server, codeqlGenerateLogSummaryTool);\n registerCLITool(server, codeqlGenerateQueryHelpTool);\n registerCLITool(server, codeqlPackInstallTool);\n registerCLITool(server, codeqlPackLsTool);\n registerCLITool(server, codeqlQueryCompileTool);\n registerCLITool(server, codeqlQueryFormatTool);\n registerCLITool(server, codeqlQueryRunTool);\n registerCLITool(server, codeqlResolveDatabaseTool);\n registerCLITool(server, codeqlResolveLanguagesTool);\n registerCLITool(server, codeqlResolveLibraryPathTool);\n registerCLITool(server, codeqlResolveMetadataTool);\n registerCLITool(server, codeqlResolveQlrefTool);\n registerCLITool(server, codeqlResolveQueriesTool);\n registerCLITool(server, codeqlResolveTestsTool);\n registerCLITool(server, codeqlTestAcceptTool);\n registerCLITool(server, codeqlTestExtractTool);\n registerCLITool(server, codeqlTestRunTool);\n\n // Register new MCP tools (inspired by JordyZomer/codeql-mcp repository)\n registerFindClassPositionTool(server);\n registerFindCodeQLQueryFilesTool(server);\n registerFindPredicatePositionTool(server);\n registerLanguageServerEvalTool(server);\n registerProfileCodeQLQueryTool(server);\n registerQuickEvaluateTool(server);\n registerRegisterDatabaseTool(server);\n}\n", "/**\n * CodeQL query validation utilities\n */\n\nimport { resolve, normalize, isAbsolute, relative } from 'path';\n\nexport interface CodeQLValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n suggestions: string[];\n}\n\n/**\n * Validates CodeQL query syntax and structure\n */\nexport function validateCodeQLSyntax(query: string, _language?: string): CodeQLValidationResult {\n const validation: CodeQLValidationResult = {\n isValid: true,\n errors: [],\n warnings: [],\n suggestions: [],\n };\n\n if (!query.trim()) {\n validation.isValid = false;\n validation.errors.push('Query cannot be empty');\n return validation;\n }\n\n if (!query.includes('from') && !query.includes('select')) {\n validation.warnings.push('Query should typically include \"from\" and \"select\" clauses');\n }\n\n if (!query.includes('@name') && !query.includes('@description')) {\n validation.suggestions.push('Consider adding @name and @description metadata');\n }\n\n return validation;\n}\n\n/**\n * Validates a file path to prevent path traversal attacks\n * @param filePath - The file path to validate\n * @param workspaceRoot - Optional workspace root directory. If not provided, allows any absolute path but still blocks traversal attempts\n * @returns The validated absolute path\n * @throws Error if the path contains path traversal sequences\n */\nexport function validateFilePath(filePath: string, workspaceRoot?: string): string {\n // Normalize the path to resolve any . or .. segments\n const normalizedPath = normalize(filePath);\n \n // Check for path traversal attempts in the normalized path\n // This blocks paths like \"../../../etc/passwd\" even after normalization\n if (normalizedPath.includes('..')) {\n throw new Error(`Invalid file path: path traversal detected in \"${filePath}\"`);\n }\n \n // Resolve to absolute path\n const absolutePath = isAbsolute(normalizedPath) \n ? normalizedPath \n : resolve(workspaceRoot || process.cwd(), normalizedPath);\n \n // If workspace root is specified, ensure the resolved path is within it\n if (workspaceRoot) {\n const relativePath = relative(workspaceRoot, absolutePath);\n \n // If relative path starts with .. or is absolute, it's outside workspace\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Invalid file path: \"${filePath}\" is outside the workspace root`);\n }\n }\n \n return absolutePath;\n}", "/**\n * CodeQL query scaffolding utilities\n * Handles creation of query directory structure and files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface QueryScaffoldingOptions {\n basePath: string;\n queryName: string;\n language: string;\n description?: string;\n queryId?: string;\n}\n\nexport interface QueryScaffoldingResult {\n queryPath: string;\n testPath: string;\n qlrefPath: string;\n testCodePath: string;\n filesCreated: string[];\n}\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n const extensions: Record = {\n javascript: 'js',\n typescript: 'ts',\n python: 'py',\n java: 'java',\n csharp: 'cs',\n cpp: 'cpp',\n go: 'go',\n ruby: 'rb',\n actions: 'yml'\n };\n return extensions[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Generate query template content\n */\nfunction generateQueryTemplate(\n queryName: string,\n language: string,\n description?: string,\n queryId?: string\n): string {\n const desc = description || `${queryName} query`;\n const id = queryId || `${language}/example/${queryName.toLowerCase()}`;\n \n return `/**\n * @id ${id}\n * @name ${queryName}\n * @description ${desc}\n * @kind problem\n * @precision medium\n * @problem.severity warning\n */\n\nimport ${language}\n\n// TODO: Implement query logic\nfrom File f\nwhere f.getBaseName() = \"${queryName}.${getLanguageExtension(language)}\"\nselect f, \"TODO: Add query logic\"\n`;\n}\n\n/**\n * Create the directory structure and files for a new CodeQL query\n */\nexport function createCodeQLQuery(options: QueryScaffoldingOptions): QueryScaffoldingResult {\n const { basePath, queryName, language, description, queryId } = options;\n \n // Resolve absolute paths\n const absoluteBasePath = path.resolve(basePath);\n \n // Define paths with intermediate directory\n const srcDir = path.join(absoluteBasePath, 'src', queryName);\n const testDir = path.join(absoluteBasePath, 'test', queryName);\n \n const queryPath = path.join(srcDir, `${queryName}.ql`);\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const testCodePath = path.join(testDir, `${queryName}.${getLanguageExtension(language)}`);\n \n const filesCreated: string[] = [];\n \n try {\n // Create directories (recursive: true is a no-op if they already exist)\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(testDir, { recursive: true });\n \n // Create files atomically using 'wx' flag (exclusive create) to avoid\n // TOCTOU race between existsSync check and writeFileSync (CWE-367).\n // The 'wx' flag fails with EEXIST if the file already exists.\n try {\n const queryContent = generateQueryTemplate(queryName, language, description, queryId);\n fs.writeFileSync(queryPath, queryContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(queryPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const qlrefContent = `${queryName}/${queryName}.ql\\n`;\n fs.writeFileSync(qlrefPath, qlrefContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(qlrefPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const testCodeContent = `// Test code for ${queryName}\\n// TODO: Add test cases\\n`;\n fs.writeFileSync(testCodePath, testCodeContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(testCodePath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n return {\n queryPath,\n testPath: testDir,\n qlrefPath,\n testCodePath,\n filesCreated\n };\n } catch (error) {\n throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n", "/**\n * CodeQL learning resources utilities\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the getting started guide content\n */\nexport function getGettingStartedGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/getting-started.md'), 'utf-8');\n } catch {\n return 'Getting started guide not available';\n }\n}\n\n/**\n * Get the query basics guide content\n */\nexport function getQueryBasicsGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/query-basics.md'), 'utf-8');\n } catch {\n return 'Query basics guide not available';\n }\n}\n\n/**\n * Get the security templates content\n */\nexport function getSecurityTemplates(): string {\n try {\n return readFileSync(join(__dirname, '../resources/security-templates.md'), 'utf-8');\n } catch {\n return 'Security templates not available';\n }\n}\n\n/**\n * Get the performance patterns content\n */\nexport function getPerformancePatterns(): string {\n try {\n return readFileSync(join(__dirname, '../resources/performance-patterns.md'), 'utf-8');\n } catch {\n return 'Performance patterns not available';\n }\n}", "/**\n * CodeQL resources registration for MCP server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getGettingStartedGuide,\n getQueryBasicsGuide,\n getSecurityTemplates,\n getPerformancePatterns,\n} from '../lib/resources';\n\n/**\n * Register all CodeQL resources with the MCP server\n */\nexport function registerCodeQLResources(server: McpServer): void {\n // Getting Started Guide\n server.resource(\n 'CodeQL Getting Started',\n 'codeql://learning/getting-started',\n {\n description: 'Comprehensive introduction to CodeQL for beginners',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/getting-started',\n mimeType: 'text/markdown',\n text: getGettingStartedGuide(),\n },\n ],\n };\n }\n );\n\n // Query Basics Guide\n server.resource(\n 'CodeQL Query Basics',\n 'codeql://learning/query-basics',\n {\n description: 'Learn the fundamentals of writing CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/query-basics',\n mimeType: 'text/markdown',\n text: getQueryBasicsGuide(),\n },\n ],\n };\n }\n );\n\n // Security Templates\n server.resource(\n 'CodeQL Security Templates',\n 'codeql://templates/security',\n {\n description: 'Ready-to-use security query templates',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://templates/security',\n mimeType: 'text/markdown',\n text: getSecurityTemplates(),\n },\n ],\n };\n }\n );\n\n // Performance Patterns\n server.resource(\n 'CodeQL Performance Patterns',\n 'codeql://patterns/performance',\n {\n description: 'Best practices for writing efficient CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://patterns/performance',\n mimeType: 'text/markdown',\n text: getPerformancePatterns(),\n },\n ],\n };\n }\n );\n}\n", "/**\n * Language-specific resources implementation\n * Dynamically loads and serves language-specific AST references and security patterns\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { LANGUAGE_RESOURCES } from '../types/language-types';\nimport { workspaceRootDir } from '../utils/package-paths';\nimport { logger } from '../utils/logger';\n\n/**\n * Get the base path for ql resources.\n * Uses the workspace root (monorepo root or package root) so that\n * resource files are found regardless of the server's process.cwd().\n */\nfunction getQLBasePath(): string {\n return workspaceRootDir;\n}\n\n/**\n * Load content from a resource file\n */\nfunction loadResourceContent(relativePath: string): string | null {\n try {\n const fullPath = join(getQLBasePath(), relativePath);\n \n if (!existsSync(fullPath)) {\n logger.warn(`Resource file not found: ${fullPath}`);\n return null;\n }\n \n return readFileSync(fullPath, 'utf-8');\n } catch (error) {\n logger.error(`Error loading resource file ${relativePath}:`, error);\n return null;\n }\n}\n\n/**\n * Register language-specific AST resources\n */\nexport function registerLanguageASTResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.astFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/ast`;\n \n server.resource(\n `${langResource.language.toUpperCase()} AST Reference`,\n resourceUri,\n {\n description: `CodeQL AST class reference for ${langResource.language} programs`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.astFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} AST Reference\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register language-specific security pattern resources\n */\nexport function registerLanguageSecurityResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.securityFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/security`;\n \n server.resource(\n `${langResource.language.toUpperCase()} Security Patterns`,\n resourceUri,\n {\n description: `CodeQL security query patterns and framework modeling for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.securityFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} Security Patterns\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register additional language-specific resources (like Go's dataflow patterns)\n */\nexport function registerLanguageAdditionalResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.additionalFiles) continue;\n \n for (const [resourceType, filePath] of Object.entries(langResource.additionalFiles)) {\n const resourceUri = `codeql://languages/${langResource.language}/${resourceType}`;\n \n server.resource(\n `${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}`,\n resourceUri,\n {\n description: `CodeQL ${resourceType.replace('-', ' ')} guide for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(filePath);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n }\n}\n\n/**\n * Register all language-specific resources\n */\nexport function registerLanguageResources(server: McpServer): void {\n logger.info('Registering language-specific resources...');\n \n // Register AST references for all languages\n registerLanguageASTResources(server);\n \n // Register security patterns for languages that have them\n registerLanguageSecurityResources(server);\n \n // Register additional resources (like Go's dataflow patterns)\n registerLanguageAdditionalResources(server);\n \n logger.info(`Registered resources for ${LANGUAGE_RESOURCES.length} languages`);\n}", "/**\n * Type definitions and constants for language-specific resources\n */\n\n// Language mappings to resource files\nexport interface LanguageResource {\n language: string;\n astFile?: string;\n securityFile?: string;\n additionalFiles?: Record;\n}\n\nexport const LANGUAGE_RESOURCES: LanguageResource[] = [\n {\n language: 'actions',\n astFile: 'ql/languages/actions/tools/dev/actions_ast.prompt.md'\n },\n {\n language: 'cpp',\n astFile: 'ql/languages/cpp/tools/dev/cpp_ast.prompt.md',\n securityFile: 'ql/languages/cpp/tools/dev/cpp_security_query_guide.prompt.md'\n },\n {\n language: 'csharp',\n astFile: 'ql/languages/csharp/tools/dev/csharp_ast.prompt.md',\n securityFile: 'ql/languages/csharp/tools/dev/csharp_security_query_guide.prompt.md'\n },\n {\n language: 'go',\n astFile: 'ql/languages/go/tools/dev/go_ast.prompt.md',\n securityFile: 'ql/languages/go/tools/dev/go_security_query_guide.prompt.md',\n additionalFiles: {\n 'dataflow': 'ql/languages/go/tools/dev/go_dataflow.prompt.md',\n 'library-modeling': 'ql/languages/go/tools/dev/go_library_modeling.prompt.md',\n 'basic-queries': 'ql/languages/go/tools/dev/go_basic_queries.prompt.md'\n }\n },\n {\n language: 'java',\n astFile: 'ql/languages/java/tools/dev/java_ast.prompt.md'\n },\n {\n language: 'javascript',\n astFile: 'ql/languages/javascript/tools/dev/javascript_ast.prompt.md',\n securityFile: 'ql/languages/javascript/tools/dev/javascript_security_query_guide.prompt.md'\n },\n {\n language: 'python',\n astFile: 'ql/languages/python/tools/dev/python_ast.prompt.md',\n securityFile: 'ql/languages/python/tools/dev/python_security_query_guide.prompt.md'\n },\n {\n language: 'ql',\n astFile: 'ql/languages/ql/tools/dev/ql_ast.prompt.md'\n },\n {\n language: 'ruby',\n astFile: 'ql/languages/ruby/tools/dev/ruby_ast.prompt.md'\n }\n];", "/**\n * MCP Server workflow prompts for CodeQL development\n *\n * All prompt content is loaded from .prompt.md files in this directory.\n * This file only handles prompt registration and parameter processing.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { basename } from 'path';\nimport { loadPromptTemplate, processPromptTemplate } from './prompt-loader';\nimport { logger } from '../utils/logger';\n\n/** Supported CodeQL languages for tools queries */\nexport const SUPPORTED_LANGUAGES = [\n 'actions',\n 'cpp',\n 'csharp',\n 'go',\n 'java',\n 'javascript',\n 'python',\n 'ruby',\n 'swift'\n] as const;\n\n/**\n * Schema for workshop_creation_workflow prompt parameters.\n * Uses z.coerce.number() for numStages to handle string inputs from VSCode slash commands.\n */\nexport const workshopCreationWorkflowSchema = z.object({\n queryPath: z\n .string()\n .describe('Path to the production-grade CodeQL query (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n workshopName: z\n .string()\n .optional()\n .describe('Name for the workshop directory'),\n numStages: z\n .coerce.number()\n .optional()\n .describe('Number of incremental stages (default: 4-8)')\n});\n\n/**\n * Register MCP workflow prompts\n *\n * Each prompt loads its content from a corresponding .prompt.md file\n * and processes any parameter substitutions.\n */\nexport function registerWorkflowPrompts(server: McpServer): void {\n // Test-Driven Development Prompt\n server.prompt(\n 'test_driven_development',\n 'Test-driven development workflow for CodeQL queries using MCP tools',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n queryName: queryName || '[QueryName]'\n });\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `## Context\\n\\n- **Language**: ${language}\\n${queryName ? `- **Query Name**: ${queryName}\\n` : ''}\\n${content}`\n }\n }\n ]\n };\n }\n );\n\n // Tools Query Workflow Prompt\n server.prompt(\n 'tools_query_workflow',\n 'Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n database: z.string().describe('Path to the CodeQL database'),\n sourceFiles: z\n .string()\n .optional()\n .describe(\n 'Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'\n ),\n sourceFunction: z\n .string()\n .optional()\n .describe(\n 'Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'\n ),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")')\n },\n async ({\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n }) => {\n const template = loadPromptTemplate('tools-query-workflow.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n database\n });\n\n const contextSection = buildToolsQueryContext(\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + content\n }\n }\n ]\n };\n }\n );\n\n // Workshop Creation Workflow Prompt\n server.prompt(\n 'workshop_creation_workflow',\n 'Guide for creating CodeQL query development workshops from production-grade queries',\n workshopCreationWorkflowSchema.shape,\n async ({ queryPath, language, workshopName, numStages }) => {\n const template = loadPromptTemplate('workshop-creation-workflow.prompt.md');\n\n // Derive workshop name from query path if not provided\n const derivedName =\n workshopName ||\n basename(queryPath)\n .replace(/\\.(ql|qlref)$/, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') ||\n 'codeql-workshop';\n\n const contextSection = buildWorkshopContext(\n queryPath,\n language,\n derivedName,\n numStages\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Basic Prompt - Test-Driven Development Checklist\n server.prompt(\n 'ql_tdd_basic',\n 'Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (language || queryName) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Advanced Prompt - Advanced Techniques with AST/CFG/CallGraph\n server.prompt(\n 'ql_tdd_advanced',\n 'Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop'),\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis')\n },\n async ({ language, queryName, database }) => {\n const template = loadPromptTemplate('ql-tdd-advanced.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (database) {\n contextSection += `- **Database**: ${database}\\n`;\n }\n if (language || queryName || database) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank False Positives Prompt\n server.prompt(\n 'sarif_rank_false_positives',\n 'Analyze SARIF results to identify likely false positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-false-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank True Positives Prompt\n server.prompt(\n 'sarif_rank_true_positives',\n 'Analyze SARIF results to identify likely true positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-true-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Explain CodeQL Query Prompt (for workshop learning content)\n server.prompt(\n 'explain_codeql_query',\n 'Generate detailed explanation of a CodeQL query for workshop learning content - uses MCP tools to gather context and produces both verbal explanations and mermaid evaluation diagrams',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling')\n },\n async ({ queryPath, language, databasePath }) => {\n const template = loadPromptTemplate('explain-codeql-query.prompt.md');\n\n let contextSection = '## Query to Explain\\n\\n';\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n contextSection += `- **Language**: ${language}\\n`;\n if (databasePath) {\n contextSection += `- **Database Path**: ${databasePath}\\n`;\n }\n contextSection += '\\n';\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Document CodeQL Query Prompt\n server.prompt(\n 'document_codeql_query',\n 'Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query')\n },\n async ({ queryPath, language }) => {\n const template = loadPromptTemplate('document-codeql-query.prompt.md');\n\n const contextSection = `## Query to Document\n\n- **Query Path**: ${queryPath}\n- **Language**: ${language}\n\n`;\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n logger.info('Registered 9 workflow prompts');\n}\n\n/**\n * Build context section for tools query workflow\n */\nexport function buildToolsQueryContext(\n language: string,\n database: string,\n sourceFiles?: string,\n sourceFunction?: string,\n targetFunction?: string\n): string {\n const lines = [\n '## Your Context',\n '',\n `- **Language**: ${language}`,\n `- **Database**: ${database}`\n ];\n\n if (sourceFiles) {\n lines.push(`- **Source Files**: ${sourceFiles}`);\n }\n if (sourceFunction) {\n lines.push(`- **Source Function**: ${sourceFunction}`);\n }\n if (targetFunction) {\n lines.push(`- **Target Function**: ${targetFunction}`);\n }\n\n lines.push('', '## Recommended Next Steps', '');\n\n if (sourceFiles) {\n lines.push(\n `1. Run \\`codeql_query_run\\` with queryName=\"PrintAST\", sourceFiles=\"${sourceFiles}\"`\n );\n } else {\n lines.push('1. Identify source files to analyze with PrintAST');\n }\n\n if (sourceFunction) {\n lines.push(\n `2. Run \\`codeql_query_run\\` with queryName=\"PrintCFG\" or \"CallGraphFrom\", sourceFunction=\"${sourceFunction}\"`\n );\n } else {\n lines.push(\n '2. Identify key functions for CFG or call graph analysis'\n );\n }\n\n if (targetFunction) {\n lines.push(\n `3. Run \\`codeql_query_run\\` with queryName=\"CallGraphTo\", targetFunction=\"${targetFunction}\"`\n );\n } else {\n lines.push('3. Identify target functions to find callers');\n }\n\n lines.push('', '');\n return lines.join('\\n');\n}\n\n/**\n * Build context section for workshop creation workflow\n */\nexport function buildWorkshopContext(\n queryPath: string,\n language: string,\n workshopName: string,\n numStages?: number\n): string {\n return `## Your Workshop Context\n\n- **Target Query**: ${queryPath}\n- **Language**: ${language}\n- **Workshop Name**: ${workshopName}\n- **Suggested Stages**: ${numStages || '4-8 (auto-detect based on query complexity)'}\n\n## Immediate Actions\n\n1. **Locate query files**: Use \\`find_codeql_query_files\\` with queryPath=\"${queryPath}\"\n2. **Understand query for learning content**: Use the \\`explain_codeql_query\\` prompt with queryPath=\"${queryPath}\" and language=\"${language}\"\n3. **Document each workshop stage**: Use the \\`document_codeql_query\\` prompt to create/update documentation for each solution query\n4. **Verify tests pass**: Use \\`codeql_test_run\\` on existing tests\n5. **Run tools queries**: Generate AST/CFG understanding for workshop materials\n\n`;\n}\n", "/**\n * Utility functions for loading prompt template files\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Load a prompt template from a .prompt.md file\n */\nexport function loadPromptTemplate(promptFileName: string): string {\n try {\n const promptPath = join(__dirname, promptFileName);\n return readFileSync(promptPath, 'utf-8');\n } catch (error) {\n return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n}\n\n/**\n * Process prompt template by replacing placeholders with actual values\n */\nexport function processPromptTemplate(template: string, variables: Record): string {\n let processed = template;\n \n // Replace variables in the format {{variable}} or {variable}\n for (const [key, value] of Object.entries(variables)) {\n const patterns = [\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'),\n new RegExp(`\\\\{${key}\\\\}`, 'g')\n ];\n \n for (const pattern of patterns) {\n processed = processed.replace(pattern, value);\n }\n }\n \n return processed;\n}", "/**\n * Monitoring Tools - MCP tool implementations for session management and reporting\n * Provides the MCP Tool APIs specified in the monitoring specification\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport { sessionDataManager } from '../lib/session-data-manager';\nimport {\n QueryDevelopmentSession,\n SessionFilter,\n QualityScoreRecord,\n ComparisonReport,\n AggregateReport,\n ExportResult,\n FunctionalTestResult,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all monitoring and reporting tools with the MCP server\n * Note: These tools are opt-in and disabled by default for end-users.\n * Set enableMonitoringTools: true in monitoring config to enable them.\n */\nexport function registerMonitoringTools(server: McpServer): void {\n const config = sessionDataManager.getConfig();\n \n // Check if monitoring tools are enabled (opt-in, disabled by default)\n if (!config.enableMonitoringTools) {\n logger.info('Monitoring tools are disabled (opt-in). Set enableMonitoringTools: true to enable session_* tools.');\n return;\n }\n\n // Session Management Tools - session_start removed per feedback (auto-creation instead)\n registerSessionEndTool(server);\n registerSessionGetTool(server);\n registerSessionListTool(server);\n registerSessionUpdateStateTool(server);\n\n // Session Analytics Tools\n registerSessionGetCallHistoryTool(server);\n registerSessionGetTestHistoryTool(server);\n registerSessionGetScoreHistoryTool(server);\n registerSessionCalculateCurrentScoreTool(server);\n\n // Batch Operations Tools\n registerSessionsCompareTool(server);\n registerSessionsAggregateTool(server);\n registerSessionsExportTool(server);\n\n // Note: Functional Testing Support Tools are internal only, not exposed as MCP tools\n\n logger.info('Registered monitoring and reporting tools');\n}\n\n/**\n * Session Management Tools\n */\n\n// session_start tool removed - sessions are now auto-created when needed\n// Sessions are automatically created when MCP tools are called with queryPath\n// If explicit session creation is needed, provide sessionId=null and it will auto-create\n\nfunction registerSessionEndTool(server: McpServer): void {\n server.tool(\n 'session_end',\n 'End a query development session with final status',\n {\n sessionId: z.string().describe('ID of the session to end'),\n status: z.enum(['completed', 'failed', 'abandoned']).describe('Final status of the session'),\n },\n async ({ sessionId, status }) => {\n try {\n const session = await sessionDataManager.endSession(sessionId, status);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error ending session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error ending session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTool(server: McpServer): void {\n server.tool(\n 'session_get',\n 'Get complete details of a specific query development session',\n {\n sessionId: z.string().describe('ID of the session to retrieve'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionListTool(server: McpServer): void {\n server.tool(\n 'session_list',\n 'List query development sessions with optional filtering',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const sessionList = {\n totalSessions: sessions.length,\n sessions: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n language: s.language,\n status: s.status,\n startTime: s.startTime,\n endTime: s.endTime,\n mcpCallsCount: s.mcpCalls.length,\n testExecutionsCount: s.testExecutions.length,\n currentScore: s.qualityScores.length > 0 \n ? s.qualityScores[s.qualityScores.length - 1].overallScore \n : null,\n })),\n };\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(sessionList, null, 2),\n },\n ],\n recommendations: generateListRecommendations(sessions),\n };\n } catch (error) {\n logger.error('Error listing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error listing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionUpdateStateTool(server: McpServer): void {\n server.tool(\n 'session_update_state',\n 'Update the current state of a query development session',\n {\n sessionId: z.string().describe('ID of the session to update'),\n filesPresent: z.array(z.string()).optional().describe('List of files present in the query development'),\n compilationStatus: z.enum(['unknown', 'success', 'failed']).optional().describe('Current compilation status'),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']).optional().describe('Current test status'),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']).optional().describe('Documentation status'),\n },\n async ({ sessionId, filesPresent, compilationStatus, testStatus, documentationStatus }) => {\n try {\n const stateUpdate: Record = {};\n if (filesPresent !== undefined) stateUpdate.filesPresent = filesPresent;\n if (compilationStatus !== undefined) stateUpdate.compilationStatus = compilationStatus;\n if (testStatus !== undefined) stateUpdate.testStatus = testStatus;\n if (documentationStatus !== undefined) stateUpdate.documentationStatus = documentationStatus;\n\n const session = await sessionDataManager.updateSessionState(sessionId, stateUpdate);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n recommendations: generateRecommendations(session, 'session_update_state'),\n };\n } catch (error) {\n logger.error('Error updating session state:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error updating session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Session Analytics Tools\n */\n\nfunction registerSessionGetCallHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_call_history',\n 'Get MCP call history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of calls to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let calls = [...session.mcpCalls].reverse(); // Most recent first\n if (limit && limit > 0) {\n calls = calls.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalCalls: session.mcpCalls.length,\n callHistory: calls,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting call history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting call history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTestHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_test_history',\n 'Get test execution history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of test executions to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let tests = [...session.testExecutions].reverse(); // Most recent first\n if (limit && limit > 0) {\n tests = tests.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalTests: session.testExecutions.length,\n testHistory: tests,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting test history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting test history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetScoreHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_score_history',\n 'Get quality score history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of scores to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let scores = [...session.qualityScores].reverse(); // Most recent first\n if (limit && limit > 0) {\n scores = scores.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalScores: session.qualityScores.length,\n scoreHistory: scores,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting score history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting score history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionCalculateCurrentScoreTool(server: McpServer): void {\n server.tool(\n 'session_calculate_current_score',\n 'Calculate current quality score for a session based on its state',\n {\n sessionId: z.string().describe('ID of the session'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n // Calculate quality score based on current state\n const scoreRecord = calculateQualityScore(session);\n \n // Add the score to the session\n await sessionDataManager.addQualityScore(sessionId, scoreRecord);\n \n // Get updated session with new score\n const updatedSession = await sessionDataManager.getSession(sessionId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(scoreRecord, null, 2),\n },\n ],\n recommendations: generateRecommendations(updatedSession, 'session_calculate_current_score'),\n };\n } catch (error) {\n logger.error('Error calculating current score:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error calculating current score: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Batch Operations Tools\n */\n\nfunction registerSessionsCompareTool(server: McpServer): void {\n server.tool(\n 'sessions_compare',\n 'Compare multiple query development sessions across specified dimensions',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to compare'),\n dimensions: z.array(z.string()).optional().describe('Specific dimensions to compare (default: all)'),\n },\n async ({ sessionIds, dimensions }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for comparison',\n },\n ],\n isError: true,\n };\n }\n\n const comparison = await compareSessions(validSessions, dimensions);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(comparison, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error comparing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error comparing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsAggregateTool(server: McpServer): void {\n server.tool(\n 'sessions_aggregate',\n 'Generate aggregate insights from multiple sessions based on filters',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const aggregate = await aggregateSessions(sessions, filters);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(aggregate, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error aggregating sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error aggregating sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsExportTool(server: McpServer): void {\n server.tool(\n 'sessions_export',\n 'Export session data in specified format for external analysis',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to export'),\n format: z.enum(['json', 'html', 'markdown']).optional().default('json').describe('Export format'),\n },\n async ({ sessionIds, format = 'json' }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for export',\n },\n ],\n isError: true,\n };\n }\n\n const exportResult = await exportSessions(validSessions, format);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(exportResult, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error exporting sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error exporting sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Helper Functions\n */\n\n/**\n * Calculate quality score for a session based on current state and history\n */\nfunction calculateQualityScore(session: QueryDevelopmentSession): QualityScoreRecord {\n const timestamp = new Date().toISOString();\n \n // Calculate syntactic correctness (25%)\n const syntacticCorrectness = session.currentState.compilationStatus === 'success' ? 100 :\n session.currentState.compilationStatus === 'failed' ? 0 : 50;\n\n // Calculate test coverage and results (30%)\n const testCoverageResults = session.currentState.testStatus === 'passing' ? 100 :\n session.currentState.testStatus === 'failing' ? 25 :\n session.currentState.testStatus === 'no_tests' ? 0 : 50;\n\n // Calculate documentation quality (20%)\n const documentationQuality = session.currentState.documentationStatus === 'present' ? 100 :\n session.currentState.documentationStatus === 'incomplete' ? 60 :\n session.currentState.documentationStatus === 'missing' ? 0 : 50;\n\n // Calculate functional correctness (25%) - based on successful test runs\n const successfulTests = session.testExecutions.filter(t => t.success && t.type === 'test_run').length;\n const totalTests = session.testExecutions.filter(t => t.type === 'test_run').length;\n const functionalCorrectness = totalTests > 0 ? (successfulTests / totalTests) * 100 : 50;\n\n // Calculate overall score\n const overallScore = Math.round(\n (syntacticCorrectness * 0.25) +\n (testCoverageResults * 0.30) +\n (documentationQuality * 0.20) +\n (functionalCorrectness * 0.25)\n );\n\n // Determine grade\n const grade = overallScore >= 90 ? 'A' :\n overallScore >= 80 ? 'B' :\n overallScore >= 70 ? 'C' :\n overallScore >= 60 ? 'D' : 'F';\n\n // Generate recommendations\n const recommendations: string[] = [];\n if (syntacticCorrectness < 100) {\n recommendations.push('Fix compilation errors to improve syntactic correctness');\n }\n if (testCoverageResults < 70) {\n recommendations.push('Add comprehensive tests and ensure they pass');\n }\n if (documentationQuality < 80) {\n recommendations.push('Add or improve query documentation with examples');\n }\n if (functionalCorrectness < 80) {\n recommendations.push('Improve test pass rate and verify query logic');\n }\n\n return {\n scoreId: randomUUID(),\n timestamp,\n overallScore,\n dimensions: {\n syntacticCorrectness,\n testCoverageResults,\n documentationQuality,\n functionalCorrectness,\n },\n grade,\n recommendations,\n };\n}\n\n/**\n * Compare multiple sessions\n */\nasync function compareSessions(\n sessions: QueryDevelopmentSession[],\n dimensions?: string[]\n): Promise {\n const timestamp = new Date().toISOString();\n const sessionIds = sessions.map(s => s.sessionId);\n \n const results: Record = {\n sessionCount: sessions.length,\n sessionOverview: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n status: s.status,\n mcpCallsCount: s.mcpCalls.length,\n duration: s.endTime ? \n new Date(s.endTime).getTime() - new Date(s.startTime).getTime() : \n new Date().getTime() - new Date(s.startTime).getTime(),\n currentScore: s.qualityScores.length > 0 ? \n s.qualityScores[s.qualityScores.length - 1].overallScore : null,\n })),\n };\n\n if (!dimensions || dimensions.includes('quality')) {\n const qualityScores = sessions.map(s => \n s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1] : null\n );\n results.qualityComparison = {\n averageScore: qualityScores\n .filter(q => q !== null)\n .reduce((sum, q) => sum + q!.overallScore, 0) / qualityScores.filter(q => q !== null).length,\n scoreRange: {\n min: Math.min(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n max: Math.max(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n },\n };\n }\n\n if (!dimensions || dimensions.includes('activity')) {\n results.activityComparison = {\n totalMCPCalls: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0),\n averageCallsPerSession: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length,\n mostActiveTool: getMostUsedTool(sessions),\n };\n }\n\n return {\n sessionIds,\n dimensions: dimensions || ['all'],\n timestamp,\n results,\n };\n}\n\n/**\n * Aggregate insights from multiple sessions\n */\nasync function aggregateSessions(\n sessions: QueryDevelopmentSession[],\n filters: SessionFilter\n): Promise {\n const timestamp = new Date().toISOString();\n \n const completedSessions = sessions.filter(s => s.status === 'completed');\n const successRate = sessions.length > 0 ? completedSessions.length / sessions.length : 0;\n \n const qualityScores = sessions\n .map(s => s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1].overallScore : null)\n .filter(score => score !== null) as number[];\n \n const averageQualityScore = qualityScores.length > 0 ? \n qualityScores.reduce((sum, score) => sum + score, 0) / qualityScores.length : 0;\n\n const commonPatterns = identifyCommonPatterns(sessions);\n const recommendations = generateAggregateRecommendations(sessions);\n\n return {\n filters,\n timestamp,\n totalSessions: sessions.length,\n successRate,\n averageQualityScore,\n commonPatterns,\n recommendations,\n };\n}\n\n/**\n * Export sessions in specified format\n */\nasync function exportSessions(\n sessions: QueryDevelopmentSession[],\n format: 'json' | 'html' | 'markdown'\n): Promise {\n const timestamp = new Date().toISOString();\n const filename = `session-export-${timestamp.replace(/[:.]/g, '-')}.${format}`;\n \n let content: string;\n \n switch (format) {\n case 'json':\n content = JSON.stringify(sessions, null, 2);\n break;\n case 'html':\n content = generateHTMLReport(sessions);\n break;\n case 'markdown':\n content = generateMarkdownReport(sessions);\n break;\n }\n\n return {\n format,\n filename,\n content,\n timestamp,\n };\n}\n\n/**\n * Utility functions\n */\n\nfunction getMostUsedTool(sessions: QueryDevelopmentSession[]): string {\n const toolCounts: Record = {};\n \n sessions.forEach(session => {\n session.mcpCalls.forEach(call => {\n toolCounts[call.toolName] = (toolCounts[call.toolName] || 0) + 1;\n });\n });\n\n return Object.entries(toolCounts)\n .sort(([, a], [, b]) => b - a)[0]?.[0] || 'none';\n}\n\nfunction identifyCommonPatterns(sessions: QueryDevelopmentSession[]): string[] {\n const patterns: string[] = [];\n \n const commonTools = getMostUsedTool(sessions);\n if (commonTools && commonTools !== 'none') {\n patterns.push(`Most commonly used tool: ${commonTools}`);\n }\n\n const completionRate = sessions.filter(s => s.status === 'completed').length / sessions.length;\n if (completionRate > 0.8) {\n patterns.push('High completion rate indicates effective workflow');\n } else if (completionRate < 0.5) {\n patterns.push('Low completion rate suggests workflow issues');\n }\n\n return patterns;\n}\n\nfunction generateAggregateRecommendations(sessions: QueryDevelopmentSession[]): string[] {\n const recommendations: string[] = [];\n \n const failedSessions = sessions.filter(s => s.status === 'failed');\n if (failedSessions.length > sessions.length * 0.3) {\n recommendations.push('High failure rate - consider improving error handling and guidance');\n }\n\n const averageCallsPerSession = sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length;\n if (averageCallsPerSession > 20) {\n recommendations.push('High number of MCP calls per session - consider workflow optimization');\n }\n\n return recommendations;\n}\n\nfunction generateHTMLReport(sessions: QueryDevelopmentSession[]): string {\n const html = `\n\n\n\n Session Export Report\n \n\n\n

Query Development Sessions Report

\n

Generated: ${new Date().toISOString()}

\n

Total Sessions: ${sessions.length}

\n \n ${sessions.map(session => `\n
\n

Session: ${session.sessionId}

\n

Query Path: ${session.queryPath}

\n

Status: ${session.status}

\n

Language: ${session.language}

\n

Start Time: ${session.startTime}

\n

MCP Calls: ${session.mcpCalls.length}

\n

Test Executions: ${session.testExecutions.length}

\n

Quality Scores: ${session.qualityScores.length}

\n
\n `).join('')}\n\n`;\n \n return html;\n}\n\nfunction generateMarkdownReport(sessions: QueryDevelopmentSession[]): string {\n const md = `# Query Development Sessions Report\n\nGenerated: ${new Date().toISOString()}\nTotal Sessions: ${sessions.length}\n\n## Session Summary\n\n| Session ID | Query Path | Status | Language | MCP Calls | Test Executions |\n|------------|-----------|--------|----------|-----------|-----------------|\n${sessions.map(session => \n `| ${session.sessionId} | ${session.queryPath} | ${session.status} | ${session.language} | ${session.mcpCalls.length} | ${session.testExecutions.length} |`\n).join('\\n')}\n\n## Detailed Sessions\n\n${sessions.map(session => `\n### Session: ${session.sessionId}\n\n- **Query Path:** ${session.queryPath}\n- **Status:** ${session.status}\n- **Language:** ${session.language}\n- **Start Time:** ${session.startTime}\n- **End Time:** ${session.endTime || 'N/A'}\n- **MCP Calls:** ${session.mcpCalls.length}\n- **Test Executions:** ${session.testExecutions.length}\n- **Quality Scores:** ${session.qualityScores.length}\n\n${session.recommendations.length > 0 ? `\n**Current Recommendations:**\n${session.recommendations.map(rec => `- ${rec}`).join('\\n')}\n` : ''}\n`).join('\\n')}`;\n\n return md;\n}\n\nfunction _calculateAverageDuration(sessions: QueryDevelopmentSession[]): number {\n const completedSessions = sessions.filter(s => s.endTime);\n if (completedSessions.length === 0) return 0;\n\n const totalDuration = completedSessions.reduce((sum, session) => {\n return sum + (new Date(session.endTime!).getTime() - new Date(session.startTime).getTime());\n }, 0);\n\n return totalDuration / completedSessions.length;\n}\n\nfunction _identifyFailureReasons(results: FunctionalTestResult[]): string[] {\n const failedResults = results.filter(r => !r.passed);\n const reasons: Record = {};\n\n failedResults.forEach(result => {\n Object.entries(result.criteria).forEach(([criterion, passed]) => {\n if (!passed) {\n reasons[criterion] = (reasons[criterion] || 0) + 1;\n }\n });\n });\n\n return Object.entries(reasons)\n .sort(([, a], [, b]) => b - a)\n .map(([reason, count]) => `${reason}: ${count} sessions`);\n}\n\n/**\n * Generate recommendations for MCP tool responses\n * Returns a map of MCP primitive paths to recommendation reasons\n */\nfunction generateRecommendations(\n session: QueryDevelopmentSession | null,\n currentTool: string\n): Record {\n if (!session) {\n return {};\n }\n\n const recommendations: Record = {};\n\n // Session state-based recommendations\n if (session.currentState.compilationStatus === 'failed') {\n recommendations['codeql_query_format'] = 'Format query to fix potential syntax issues';\n recommendations['codeql_query_compile'] = 'Recompile after fixing syntax errors';\n } else if (session.currentState.compilationStatus === 'success') {\n if (session.currentState.testStatus === 'unknown' || session.currentState.testStatus === 'no_tests') {\n recommendations['codeql_test_run'] = 'Run tests to validate query functionality';\n } else if (session.currentState.testStatus === 'failing') {\n recommendations['session_get_test_history'] = 'Review test failures to identify issues';\n recommendations['codeql_query_compile'] = 'Verify query logic matches test expectations';\n } else if (session.currentState.testStatus === 'passing') {\n recommendations['session_calculate_current_score'] = 'Calculate quality score for completed query';\n }\n }\n\n // Tool-specific follow-up recommendations\n switch (currentTool) {\n case 'session_get':\n if (session.mcpCalls.length === 0) {\n recommendations['codeql_query_compile'] = 'Start development by compiling the query';\n }\n break;\n case 'session_end':\n if (session.status === 'completed') {\n recommendations['sessions_export'] = 'Export session data for analysis';\n }\n break;\n case 'session_calculate_current_score': {\n const latestScore = session.qualityScores[session.qualityScores.length - 1];\n if (latestScore && latestScore.overallScore < 80) {\n if (latestScore.dimensions.syntacticCorrectness < 100) {\n recommendations['codeql_query_format'] = 'Improve syntax and formatting';\n }\n if (latestScore.dimensions.testCoverageResults < 70) {\n recommendations['codeql_test_run'] = 'Improve test coverage and results';\n }\n }\n break;\n }\n case 'session_update_state':\n // Recommend next logical step based on updated state\n if (session.currentState.compilationStatus === 'success' && session.currentState.testStatus === 'unknown') {\n recommendations['codeql_test_run'] = 'Run tests now that compilation is successful';\n }\n break;\n }\n\n return recommendations;\n}\n\n/**\n * Generate recommendations for session list results\n */\nfunction generateListRecommendations(sessions: QueryDevelopmentSession[]): Record {\n const recommendations: Record = {};\n\n const activeSessions = sessions.filter(s => s.status === 'active');\n const completedSessions = sessions.filter(s => s.status === 'completed');\n\n if (activeSessions.length > 0) {\n recommendations['session_get'] = `Review details of ${activeSessions.length} active session(s)`;\n }\n\n if (completedSessions.length > 1) {\n recommendations['sessions_compare'] = 'Compare completed sessions to identify patterns';\n recommendations['sessions_aggregate'] = 'Generate aggregate insights from multiple sessions';\n }\n\n if (sessions.length > 5) {\n recommendations['sessions_export'] = 'Export session data for comprehensive analysis';\n }\n\n return recommendations;\n}", "function checkArgs(adapter, defaultData) {\n if (adapter === undefined)\n throw new Error('lowdb: missing adapter');\n if (defaultData === undefined)\n throw new Error('lowdb: missing default data');\n}\nexport class Low {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n async read() {\n const data = await this.adapter.read();\n if (data)\n this.data = data;\n }\n async write() {\n if (this.data)\n await this.adapter.write(this.data);\n }\n async update(fn) {\n fn(this.data);\n await this.write();\n }\n}\nexport class LowSync {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n read() {\n const data = this.adapter.read();\n if (data)\n this.data = data;\n }\n write() {\n if (this.data)\n this.adapter.write(this.data);\n }\n update(fn) {\n fn(this.data);\n this.write();\n }\n}\n", "import { readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Writer } from 'steno';\nexport class TextFile {\n #filename;\n #writer;\n constructor(filename) {\n this.#filename = filename;\n this.#writer = new Writer(filename);\n }\n async read() {\n let data;\n try {\n data = await readFile(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n return this.#writer.write(str);\n }\n}\nexport class TextFileSync {\n #tempFilename;\n #filename;\n constructor(filename) {\n this.#filename = filename;\n const f = filename.toString();\n this.#tempFilename = path.join(path.dirname(f), `.${path.basename(f)}.tmp`);\n }\n read() {\n let data;\n try {\n data = readFileSync(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n writeFileSync(this.#tempFilename, str);\n renameSync(this.#tempFilename, this.#filename);\n }\n}\n", "import { TextFile, TextFileSync } from './TextFile.js';\nexport class DataFile {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFile(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n async read() {\n const data = await this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n return this.#adapter.write(this.#stringify(obj));\n }\n}\nexport class DataFileSync {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFileSync(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n read() {\n const data = this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n this.#adapter.write(this.#stringify(obj));\n }\n}\n", "import { DataFile, DataFileSync } from './DataFile.js';\nexport class JSONFile extends DataFile {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\nexport class JSONFileSync extends DataFileSync {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\n", "/**\n * Session Data Management\n * Provides unified JSON storage and session lifecycle management using lowdb\n */\n\nimport { Low } from 'lowdb';\nimport { JSONFileSync } from 'lowdb/node';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport { getPackageRootDir } from '../utils/package-paths';\nimport {\n QueryDevelopmentSession,\n QueryState,\n MCPCallRecord,\n TestExecutionRecord,\n QualityScoreRecord,\n SessionFilter,\n MonitoringConfig,\n MonitoringConfigSchema,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Database schema for lowdb - sessions only\n */\ninterface SessionDatabase {\n sessions: QueryDevelopmentSession[];\n}\n\n/**\n * Session Data Manager - handles all session persistence and lifecycle\n */\nexport class SessionDataManager {\n private db: Low;\n private config: MonitoringConfig;\n private storageDir: string;\n\n constructor(configOverrides: Partial = {}) {\n this.config = MonitoringConfigSchema.parse({\n ...MonitoringConfigSchema.parse({}),\n ...configOverrides,\n });\n\n this.storageDir = this.config.storageLocation;\n this.ensureStorageDirectory();\n\n const adapter = new JSONFileSync(join(this.storageDir, 'sessions.json'));\n this.db = new Low(adapter, {\n sessions: [],\n });\n\n this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n async initialize(): Promise {\n await this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n private async initializeDatabase(): Promise {\n try {\n await this.db.read();\n \n logger.info(`Session data manager initialized with ${this.db.data.sessions.length} sessions`);\n } catch (error) {\n logger.error('Failed to initialize session database:', error);\n throw error;\n }\n }\n\n /**\n * Ensure storage directory structure exists\n */\n private ensureStorageDirectory(): void {\n try {\n // mkdirSync with recursive: true is a no-op if directories already exist\n mkdirSync(this.storageDir, { recursive: true });\n\n // Create subdirectories\n const subdirs = ['sessions-archive', 'exports'];\n for (const subdir of subdirs) {\n mkdirSync(join(this.storageDir, subdir), { recursive: true });\n }\n\n // Use 'wx' flag (exclusive create) to atomically create config only\n // if it doesn't exist, avoiding TOCTOU race (CWE-367).\n const configPath = join(this.storageDir, 'config.json');\n try {\n writeFileSync(configPath, JSON.stringify(this.config, null, 2), { flag: 'wx' });\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n\n logger.debug(`Storage directory initialized: ${this.storageDir}`);\n } catch (error) {\n logger.error('Failed to create storage directory:', error);\n throw error;\n }\n }\n\n /**\n * Start a new query development session\n */\n async startSession(\n queryPath: string,\n language?: string,\n queryType?: string,\n description?: string\n ): Promise {\n const sessionId = randomUUID();\n const startTime = new Date().toISOString();\n\n const session: QueryDevelopmentSession = {\n sessionId,\n queryPath,\n language: language || 'unknown',\n queryType,\n description,\n startTime,\n status: 'active',\n mcpCalls: [],\n testExecutions: [],\n qualityScores: [],\n currentState: {\n filesPresent: [],\n compilationStatus: 'unknown',\n testStatus: 'unknown',\n documentationStatus: 'unknown',\n lastActivity: startTime,\n },\n recommendations: [],\n };\n\n await this.db.read();\n this.db.data.sessions.push(session);\n await this.db.write();\n\n logger.info(`Started new session: ${sessionId} for query: ${queryPath}`);\n return sessionId;\n }\n\n /**\n * End a session with final status\n */\n async endSession(\n sessionId: string,\n status: 'completed' | 'failed' | 'abandoned'\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.status = status;\n session.endTime = new Date().toISOString();\n session.currentState.lastActivity = session.endTime;\n\n await this.db.write();\n\n // Archive completed session if enabled\n if (this.config.archiveCompletedSessions && status === 'completed') {\n await this.archiveSession(sessionId);\n }\n\n logger.info(`Ended session: ${sessionId} with status: ${status}`);\n return session;\n }\n\n /**\n * Get a specific session by ID\n */\n async getSession(sessionId: string): Promise {\n await this.db.read();\n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n return session || null;\n }\n\n /**\n * List sessions with optional filtering\n */\n async listSessions(filters?: SessionFilter): Promise {\n await this.db.read();\n let sessions = [...this.db.data.sessions];\n\n if (filters) {\n if (filters.queryPath) {\n sessions = sessions.filter(s => s.queryPath.includes(filters.queryPath!));\n }\n if (filters.status) {\n sessions = sessions.filter(s => s.status === filters.status);\n }\n if (filters.language) {\n sessions = sessions.filter(s => s.language === filters.language);\n }\n if (filters.queryType) {\n sessions = sessions.filter(s => s.queryType === filters.queryType);\n }\n if (filters.dateRange) {\n const [start, end] = filters.dateRange;\n sessions = sessions.filter(s => \n s.startTime >= start && s.startTime <= end\n );\n }\n }\n\n return sessions;\n }\n\n /**\n * Update session state\n */\n async updateSessionState(\n sessionId: string,\n stateUpdate: Partial\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.currentState = {\n ...session.currentState,\n ...stateUpdate,\n lastActivity: new Date().toISOString(),\n };\n\n await this.db.write();\n return session;\n }\n\n /**\n * Add MCP call record to session\n */\n async addMCPCall(sessionId: string, callRecord: MCPCallRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for MCP call: ${sessionId}`);\n return;\n }\n\n session.mcpCalls.push(callRecord);\n session.currentState.lastActivity = callRecord.timestamp;\n\n // Update next suggested tool if provided\n if (callRecord.nextSuggestedTool) {\n session.nextSuggestedTool = callRecord.nextSuggestedTool;\n }\n\n await this.db.write();\n }\n\n /**\n * Add test execution record to session\n */\n async addTestExecution(sessionId: string, testRecord: TestExecutionRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for test execution: ${sessionId}`);\n return;\n }\n\n session.testExecutions.push(testRecord);\n session.currentState.lastActivity = testRecord.timestamp;\n\n // Update compilation/test status based on execution\n if (testRecord.type === 'compilation') {\n session.currentState.compilationStatus = testRecord.success ? 'success' : 'failed';\n } else if (testRecord.type === 'test_run') {\n session.currentState.testStatus = testRecord.success ? 'passing' : 'failing';\n }\n\n await this.db.write();\n }\n\n /**\n * Add quality score record to session\n */\n async addQualityScore(sessionId: string, scoreRecord: QualityScoreRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for quality score: ${sessionId}`);\n return;\n }\n\n session.qualityScores.push(scoreRecord);\n session.currentState.lastActivity = scoreRecord.timestamp;\n session.recommendations = scoreRecord.recommendations;\n\n await this.db.write();\n }\n\n /**\n * Archive a completed session to monthly file\n */\n private async archiveSession(sessionId: string): Promise {\n try {\n const session = await this.getSession(sessionId);\n if (!session) return;\n\n const date = new Date(session.endTime || session.startTime);\n const monthDir = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;\n const archiveDir = join(this.storageDir, 'sessions-archive', monthDir);\n\n mkdirSync(archiveDir, { recursive: true });\n\n const archiveFile = join(archiveDir, `${sessionId}.json`);\n writeFileSync(archiveFile, JSON.stringify(session, null, 2));\n\n // Remove from active sessions\n await this.db.read();\n this.db.data.sessions = this.db.data.sessions.filter(s => s.sessionId !== sessionId);\n await this.db.write();\n\n logger.info(`Archived session: ${sessionId} to ${archiveFile}`);\n } catch (error) {\n logger.error(`Failed to archive session ${sessionId}:`, error);\n }\n }\n\n /**\n * Get active sessions for a specific query path\n */\n async getActiveSessionsForQuery(queryPath: string): Promise {\n await this.db.read();\n return this.db.data.sessions.filter(s => \n s.queryPath === queryPath && s.status === 'active'\n );\n }\n\n /**\n * Clean up old sessions based on retention policy\n */\n async cleanupOldSessions(): Promise {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);\n const cutoffTimestamp = cutoffDate.toISOString();\n\n await this.db.read();\n const sessionsToRemove = this.db.data.sessions.filter(s => \n s.endTime && s.endTime < cutoffTimestamp\n );\n\n if (sessionsToRemove.length > 0) {\n this.db.data.sessions = this.db.data.sessions.filter(s => \n !s.endTime || s.endTime >= cutoffTimestamp\n );\n await this.db.write();\n\n logger.info(`Cleaned up ${sessionsToRemove.length} old sessions`);\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): MonitoringConfig {\n return this.config;\n }\n\n /**\n * Update configuration\n */\n async updateConfig(configUpdate: Partial): Promise {\n this.config = MonitoringConfigSchema.parse({\n ...this.config,\n ...configUpdate,\n });\n\n // Update config.json file only\n const configPath = join(this.storageDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(this.config, null, 2));\n\n logger.info('Updated monitoring configuration');\n }\n}\n\n/**\n * Parse boolean environment variable\n */\nfunction parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolean {\n if (envVar === undefined) return defaultValue;\n return envVar.toLowerCase() === 'true' || envVar === '1';\n}\n\n// Export singleton instance with environment variable support\nexport const sessionDataManager = new SessionDataManager({\n storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getPackageRootDir(), '.ql-mcp-tracking'),\n enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false),\n});", "import { z } from 'zod';\n\n/**\n * Monitoring and Reporting types for CodeQL Development MCP Server\n * Based on the specification in docs/mcp-server-monitoring-and-reporting.md\n */\n\n/**\n * MCP Call Record - captures individual MCP tool calls\n */\nexport const MCPCallRecordSchema = z.object({\n callId: z.string(),\n timestamp: z.string(), // ISO timestamp\n toolName: z.string(),\n parameters: z.record(z.any()),\n result: z.any(),\n success: z.boolean(),\n duration: z.number(), // milliseconds\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type MCPCallRecord = z.infer;\n\n/**\n * Test Execution Record - captures query compilation and test runs\n */\nexport const TestExecutionRecordSchema = z.object({\n executionId: z.string(),\n timestamp: z.string(),\n type: z.enum(['compilation', 'test_run', 'database_build']),\n success: z.boolean(),\n details: z.record(z.any()),\n metrics: z.object({\n passRate: z.number().optional(),\n coverage: z.number().optional(),\n performance: z.number().optional(),\n }).optional(),\n});\n\nexport type TestExecutionRecord = z.infer;\n\n/**\n * Quality Score Record - multi-dimensional quality assessment\n */\nexport const QualityScoreRecordSchema = z.object({\n scoreId: z.string(),\n timestamp: z.string(),\n overallScore: z.number().min(0).max(100), // 0-100\n dimensions: z.object({\n syntacticCorrectness: z.number().min(0).max(100),\n testCoverageResults: z.number().min(0).max(100),\n documentationQuality: z.number().min(0).max(100),\n functionalCorrectness: z.number().min(0).max(100),\n }),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n recommendations: z.array(z.string()),\n});\n\nexport type QualityScoreRecord = z.infer;\n\n/**\n * Query State - current state of the query development\n */\nexport const QueryStateSchema = z.object({\n filesPresent: z.array(z.string()),\n compilationStatus: z.enum(['unknown', 'success', 'failed']),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']),\n lastActivity: z.string(), // ISO timestamp\n});\n\nexport type QueryState = z.infer;\n\n/**\n * Query Development Session - main data structure for tracking\n */\nexport const QueryDevelopmentSessionSchema = z.object({\n // Session Metadata\n sessionId: z.string(),\n queryPath: z.string(),\n language: z.string(),\n queryType: z.string().optional(),\n description: z.string().optional(),\n startTime: z.string(), // ISO timestamp\n endTime: z.string().optional(), // ISO timestamp\n status: z.enum(['active', 'completed', 'failed', 'abandoned']),\n\n // MCP Call History\n mcpCalls: z.array(MCPCallRecordSchema),\n\n // Test Execution Records\n testExecutions: z.array(TestExecutionRecordSchema),\n\n // Quality Metrics\n qualityScores: z.array(QualityScoreRecordSchema),\n\n // Development State\n currentState: QueryStateSchema,\n recommendations: z.array(z.string()),\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type QueryDevelopmentSession = z.infer;\n\n/**\n * Session Filter for listing and searching\n */\nexport const SessionFilterSchema = z.object({\n queryPath: z.string().optional(),\n status: z.string().optional(),\n dateRange: z.tuple([z.string(), z.string()]).optional(),\n language: z.string().optional(),\n queryType: z.string().optional(),\n});\n\nexport type SessionFilter = z.infer;\n\n/**\n * Comparison Report for analyzing multiple sessions\n */\nexport const ComparisonReportSchema = z.object({\n sessionIds: z.array(z.string()),\n dimensions: z.array(z.string()),\n timestamp: z.string(),\n results: z.record(z.any()),\n});\n\nexport type ComparisonReport = z.infer;\n\n/**\n * Aggregate Report for batch analysis\n */\nexport const AggregateReportSchema = z.object({\n filters: SessionFilterSchema,\n timestamp: z.string(),\n totalSessions: z.number(),\n successRate: z.number(),\n averageQualityScore: z.number(),\n commonPatterns: z.array(z.string()),\n recommendations: z.array(z.string()),\n});\n\nexport type AggregateReport = z.infer;\n\n/**\n * Export Result for data export operations\n */\nexport const ExportResultSchema = z.object({\n format: z.enum(['json', 'html', 'markdown']),\n filename: z.string(),\n content: z.string(),\n timestamp: z.string(),\n});\n\nexport type ExportResult = z.infer;\n\n/**\n * Functional Test Result for automated testing\n */\nexport const FunctionalTestResultSchema = z.object({\n sessionId: z.string(),\n queryPath: z.string(),\n passed: z.boolean(),\n criteria: z.record(z.any()),\n details: z.record(z.any()),\n timestamp: z.string(),\n});\n\nexport type FunctionalTestResult = z.infer;\n\n/**\n * Test Report for comprehensive test analysis\n */\nexport const TestReportSchema = z.object({\n sessionIds: z.array(z.string()),\n criteria: z.record(z.any()),\n timestamp: z.string(),\n overallPassRate: z.number(),\n results: z.array(FunctionalTestResultSchema),\n summary: z.record(z.any()),\n});\n\nexport type TestReport = z.infer;\n\n/**\n * Monitoring Configuration\n */\nexport const MonitoringConfigSchema = z.object({\n storageLocation: z.string().default('.ql-mcp-tracking/'),\n autoTrackSessions: z.boolean().default(true),\n retentionDays: z.number().default(90),\n includeCallParameters: z.boolean().default(true),\n includeCallResults: z.boolean().default(true),\n maxActiveSessionsPerQuery: z.number().default(3),\n scoringFrequency: z.enum(['per_call', 'periodic', 'manual']).default('per_call'),\n archiveCompletedSessions: z.boolean().default(true),\n enableRecommendations: z.boolean().default(true),\n enableMonitoringTools: z.boolean().default(false), // Opt-in: session_* tools disabled by default for end-users\n});\n\nexport type MonitoringConfig = z.infer;"], - "mappings": "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", + "sourcesContent": ["/**\n * Simple logger utility.\n *\n * All log output is written to stderr. In stdio transport mode, stdout is\n * reserved exclusively for the MCP JSON-RPC protocol \u2014 any non-protocol\n * bytes on stdout would corrupt the message stream.\n */\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n console.error(`[INFO] ${new Date().toISOString()} ${message}`, ...args);\n },\n error: (message: string, ...args: unknown[]) => {\n console.error(`[ERROR] ${new Date().toISOString()} ${message}`, ...args);\n },\n warn: (message: string, ...args: unknown[]) => {\n console.error(`[WARN] ${new Date().toISOString()} ${message}`, ...args);\n },\n debug: (message: string, ...args: unknown[]) => {\n if (process.env.DEBUG) {\n console.error(`[DEBUG] ${new Date().toISOString()} ${message}`, ...args);\n }\n },\n};\n", "/**\n * Generic CLI command execution utilities for CodeQL and QLT commands\n */\n\nimport { execFile } from 'child_process';\nimport { existsSync } from 'fs';\nimport { basename, delimiter, dirname, isAbsolute } from 'path';\nimport { promisify } from 'util';\nimport { logger } from '../utils/logger';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CLIExecutionResult {\n stdout: string;\n stderr: string;\n success: boolean;\n error?: string;\n exitCode?: number;\n}\n\nexport interface CLIExecutionOptions {\n command: string;\n args: string[];\n cwd?: string;\n timeout?: number;\n env?: Record;\n}\n\n// Whitelist of allowed commands to prevent arbitrary command execution\nconst ALLOWED_COMMANDS = new Set([\n 'codeql',\n 'git',\n 'node',\n 'npm',\n 'qlt',\n 'which'\n]);\n\n// Additional commands allowed in test environments\nlet testCommands: Set | null = null;\n\n// Whitelist of safe environment variables to pass to child processes\n// This prevents potentially malicious environment variables from being passed through\nconst SAFE_ENV_VARS = [\n 'HOME', // User home directory\n 'LANG', // Locale setting\n 'LC_ALL', // Locale setting\n 'LC_CTYPE', // Locale setting\n 'PATH', // Required to find executables\n 'SHELL', // User's shell (Unix)\n 'TEMP', // Temporary directory (Windows)\n 'TERM', // Terminal type (Unix)\n 'TMP', // Temporary directory (Windows)\n 'TMPDIR', // Temporary directory (Unix)\n 'USER', // Current user (Unix)\n 'USERNAME', // Current user (Windows)\n] as const;\n\n// Whitelist of safe environment variable prefixes\n// These are needed for CodeQL and Node.js functionality\nconst SAFE_ENV_PREFIXES = [\n 'CODEQL_', // CodeQL-specific variables\n 'NODE_', // Node.js-specific variables (for npm, etc.)\n] as const;\n\n// Pattern for dangerous control characters in CLI arguments\n// Rejected characters:\n// \\x01-\\x08: SOH through BS (start of heading, text, null control chars, backspace)\n// \\x0B: Vertical tab - rarely used legitimately, can cause display issues\n// \\x0C: Form feed - can cause unexpected page breaks in output\n// \\x0E-\\x1F: SO through US (shift out/in, device controls, separators)\n// Allowed characters:\n// \\x00: Null byte - handled separately for clearer error messaging\n// \\x09: Horizontal tab - commonly used in file paths and arguments\n// \\x0A: Newline (LF) - may appear in multi-line arguments\n// \\x0D: Carriage return (CR) - may appear with newlines on Windows\n// eslint-disable-next-line no-control-regex\nconst DANGEROUS_CONTROL_CHARS = /[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F]/;\n\n/**\n * Enable test-specific commands for testing purposes\n * This should only be called in test environments\n */\nexport function enableTestCommands(): void {\n testCommands = new Set([\n 'cat',\n 'echo',\n 'ls',\n 'sh',\n 'sleep'\n ]);\n}\n\n/**\n * Disable test-specific commands\n */\nexport function disableTestCommands(): void {\n testCommands = null;\n}\n\n/**\n * Check if a command is allowed\n */\nfunction isCommandAllowed(command: string): boolean {\n return ALLOWED_COMMANDS.has(command) || (testCommands !== null && testCommands.has(command));\n}\n\n// Resolved CodeQL binary directory from CODEQL_PATH.\n// When set, this directory is prepended to PATH for all child processes\n// so that `execFile('codeql', ...)` finds the correct binary via execvp().\n// Using PATH lookup (rather than an absolute path) is essential because\n// execvp() handles shell-script shebangs correctly, whereas passing an\n// absolute path to execFile() can fail with ENOENT for shell scripts.\nlet resolvedCodeQLDir: string | null = null;\n\n// Cached result from resolveCodeQLBinary(). `undefined` means not yet resolved.\nlet resolvedBinaryResult: string | undefined;\n\n/**\n * Resolve the CodeQL CLI binary path.\n *\n * Resolution order:\n * 1. `CODEQL_PATH` environment variable \u2014 must point to an existing file whose\n * basename is `codeql` (or `codeql.exe` / `codeql.cmd` on Windows).\n * The parent directory is prepended to PATH for child processes.\n * 2. Falls back to the bare `codeql` command (resolved via PATH at exec time).\n *\n * The resolved value is cached for the lifetime of the process. Call this once\n * at startup; subsequent calls are a no-op and return the cached value.\n */\nexport function resolveCodeQLBinary(): string {\n // Short-circuit if already resolved\n if (resolvedBinaryResult !== undefined) {\n return resolvedBinaryResult;\n }\n\n const envPath = process.env.CODEQL_PATH;\n\n if (!envPath) {\n resolvedCodeQLDir = null;\n resolvedBinaryResult = 'codeql';\n return resolvedBinaryResult;\n }\n\n // Validate the path points to a plausible CodeQL binary\n const base = basename(envPath).toLowerCase();\n const validBaseNames = ['codeql', 'codeql.exe', 'codeql.cmd'];\n if (!validBaseNames.includes(base)) {\n throw new Error(\n `CODEQL_PATH must point to a CodeQL CLI binary (expected basename: codeql), got: ${base}`\n );\n }\n\n // Require an absolute path to avoid ambiguity\n if (!isAbsolute(envPath)) {\n throw new Error(\n `CODEQL_PATH must be an absolute path, got: ${envPath}`\n );\n }\n\n // Verify the file exists\n if (!existsSync(envPath)) {\n throw new Error(\n `CODEQL_PATH points to a file that does not exist: ${envPath}`\n );\n }\n\n resolvedCodeQLDir = dirname(envPath);\n resolvedBinaryResult = 'codeql';\n logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`);\n return resolvedBinaryResult;\n}\n\n/**\n * Get the currently resolved CodeQL binary directory, or null if using PATH.\n */\nexport function getResolvedCodeQLDir(): string | null {\n return resolvedCodeQLDir;\n}\n\n/**\n * Reset the resolved CodeQL binary to the default (for testing only).\n */\nexport function resetResolvedCodeQLBinary(): void {\n resolvedCodeQLDir = null;\n resolvedBinaryResult = undefined;\n}\n\n/**\n * Validate that the resolved CodeQL binary is actually callable.\n *\n * Runs `codeql version --format=terse` and verifies the process exits\n * successfully. This catches the case where `CODEQL_PATH` is unset and\n * `codeql` is not on PATH \u2014 the server would otherwise start normally\n * but every tool invocation would fail.\n *\n * @returns The version string reported by the CodeQL CLI.\n * @throws Error if the binary is not reachable or returns a non-zero exit code.\n */\nexport async function validateCodeQLBinaryReachable(): Promise {\n const binary = resolvedBinaryResult ?? 'codeql';\n const env = { ...process.env };\n if (resolvedCodeQLDir) {\n env.PATH = resolvedCodeQLDir + delimiter + (env.PATH || '');\n }\n\n try {\n const { stdout } = await execFileAsync(binary, ['version', '--format=terse'], {\n env,\n timeout: 15_000,\n });\n return stdout.trim();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `CodeQL CLI is not reachable (binary: ${binary}). ` +\n `Ensure codeql is on PATH or set the CODEQL_PATH environment variable ` +\n `to the absolute path of the CodeQL CLI binary. Details: ${message}`\n );\n }\n}\n\n/**\n * Sanitize a CLI argument to prevent potential issues with special characters.\n * \n * While execFile() does not spawn a shell (preventing shell injection), we still\n * validate arguments to:\n * 1. Reject null bytes that could truncate strings in C-based commands\n * 2. Reject control characters that could cause unexpected behavior\n * 3. Provide defense-in-depth against potential issues\n * \n * @param arg - The argument to sanitize\n * @returns The sanitized argument\n * @throws Error if the argument contains dangerous characters\n */\nexport function sanitizeCLIArgument(arg: string): string {\n // Reject null bytes - these can truncate strings in C-based commands\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n if (arg.includes('\\0')) {\n throw new Error(`CLI argument contains null byte: argument rejected for security`);\n }\n \n // Reject control characters using the module-level constant pattern\n if (DANGEROUS_CONTROL_CHARS.test(arg)) {\n // Error message intentionally excludes argument content to avoid logging potentially sensitive data\n throw new Error(`CLI argument contains control characters: argument rejected for security`);\n }\n \n return arg;\n}\n\n/**\n * Sanitize an array of CLI arguments\n * @param args - The arguments to sanitize\n * @returns The sanitized arguments\n * @throws Error if any argument contains dangerous characters\n */\nexport function sanitizeCLIArguments(args: string[]): string[] {\n return args.map(sanitizeCLIArgument);\n}\n\n/**\n * Filter environment variables to only include safe ones\n * This prevents potentially malicious environment variables from being passed to child processes\n */\nfunction getSafeEnvironment(additionalEnv?: Record): Record {\n const safeEnv: Record = {};\n \n // Copy whitelisted environment variables from process.env\n for (const key of SAFE_ENV_VARS) {\n if (process.env[key] !== undefined) {\n safeEnv[key] = process.env[key]!;\n }\n }\n \n // Copy environment variables with whitelisted prefixes\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && SAFE_ENV_PREFIXES.some(prefix => key.startsWith(prefix))) {\n safeEnv[key] = value;\n }\n }\n \n // When CODEQL_PATH was set, prepend the resolved directory to PATH so that\n // `execFile('codeql', ...)` finds the user-specified binary via execvp().\n // This approach (PATH manipulation + bare command name) is essential because\n // execvp() handles shell-script shebangs correctly, whereas passing an\n // absolute path to execFile() fails with ENOENT for shell-script launchers.\n if (resolvedCodeQLDir && safeEnv.PATH) {\n safeEnv.PATH = `${resolvedCodeQLDir}${delimiter}${safeEnv.PATH}`;\n } else if (resolvedCodeQLDir) {\n safeEnv.PATH = resolvedCodeQLDir;\n }\n \n // Merge with explicitly provided environment variables\n // These are trusted as they come from the application code, not external sources\n if (additionalEnv) {\n Object.assign(safeEnv, additionalEnv);\n }\n \n return safeEnv;\n}\n\n/**\n * Execute a CLI command and return the result.\n * \n * Security: This function uses execFile() instead of exec() to avoid shell interpretation.\n * Arguments are passed directly to the executable as an array, preventing shell injection.\n * Additional security measures include:\n * - Command whitelist validation\n * - Shell metacharacter detection in command names\n * - CLI argument sanitization (null bytes, control characters)\n * - Environment variable filtering\n */\nexport async function executeCLICommand(options: CLIExecutionOptions): Promise {\n try {\n const { command, args, cwd, timeout = 300000, env } = options; // 5 minute default timeout\n \n // Validate command is in the whitelist to prevent arbitrary command execution\n if (!isCommandAllowed(command)) {\n throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`);\n }\n \n // Validate command to ensure it doesn't contain shell metacharacters\n if (command.includes(';') || command.includes('|') || command.includes('&') || \n command.includes('$') || command.includes('`') || command.includes('\\n') ||\n command.includes('\\r')) {\n throw new Error(`Invalid command: contains shell metacharacters: ${command}`);\n }\n \n // Sanitize CLI arguments to prevent issues with special characters\n // This provides defense-in-depth even though execFile() doesn't use a shell\n const sanitizedArgs = sanitizeCLIArguments(args);\n \n logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout });\n \n const execOptions = {\n cwd,\n timeout,\n env: getSafeEnvironment(env),\n };\n \n // execFile() is used instead of exec() to avoid shell interpretation\n // Arguments are passed as an array, not interpolated into a command string\n const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions);\n\n return {\n stdout,\n stderr,\n success: true,\n exitCode: 0\n };\n\n } catch (error: unknown) {\n logger.error('CLI command execution failed:', error);\n \n const err = error as Error & { code?: number; stdout?: string; stderr?: string };\n const errorMessage = err instanceof Error ? err.message : String(error);\n const exitCode = err.code || 1;\n \n return {\n stdout: err.stdout || '',\n stderr: err.stderr || errorMessage,\n success: false,\n error: errorMessage,\n exitCode\n };\n }\n}\n\n/**\n * Build CodeQL command arguments with proper escaping\n */\nexport function buildCodeQLArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n // Single-letter parameters that should use -key=value format (with equals sign)\n // Note: CodeQL CLI uses -t=key=value format for metadata, not -t key=value\n const singleLetterParams = new Set(['t', 'o', 'v', 'q', 'h', 'J']);\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n const isSingleLetter = key.length === 1 && singleLetterParams.has(key);\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(isSingleLetter ? `-${key}` : `--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values (e.g., multiple -t flags for metadata)\n for (const item of value) {\n if (isSingleLetter) {\n // For single-letter params like -t, use -key=value format\n args.push(`-${key}=${String(item)}`);\n } else {\n // For long params, use --key=value format\n args.push(`--${key}=${String(item)}`);\n }\n }\n } else {\n // Handle string, number, and other values\n if (isSingleLetter) {\n // For single-letter params, use -key=value format\n args.push(`-${key}=${String(value)}`);\n } else {\n args.push(`--${key}=${String(value)}`);\n }\n }\n }\n \n return args;\n}\n\n/**\n * Build QLT command arguments with proper escaping\n */\nexport function buildQLTArgs(subcommand: string, options: Record): string[] {\n const args = [subcommand];\n \n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || value === null) {\n continue;\n }\n \n if (typeof value === 'boolean') {\n if (value) {\n args.push(`--${key}`);\n }\n } else if (Array.isArray(value)) {\n // Handle array values\n for (const item of value) {\n args.push(`--${key}`, String(item));\n }\n } else {\n // Handle string, number, and other values\n args.push(`--${key}`, String(value));\n }\n }\n \n return args;\n}\n\n/**\n * Execute a CodeQL command.\n * Always uses the bare `codeql` command name so that execvp() PATH lookup\n * handles shell-script shebangs correctly. When CODEQL_PATH is set, the\n * resolved directory is prepended to PATH via getSafeEnvironment().\n */\nexport async function executeCodeQLCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = [],\n cwd?: string\n): Promise {\n const args = buildCodeQLArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'codeql',\n args,\n cwd\n });\n}\n\n/**\n * Execute a QLT command\n */\nexport async function executeQLTCommand(\n subcommand: string, \n options: Record, \n additionalArgs: string[] = []\n): Promise {\n const args = buildQLTArgs(subcommand, options);\n args.push(...additionalArgs);\n \n return executeCLICommand({\n command: 'qlt',\n args\n });\n}\n\n/**\n * Get help text for a CLI command\n */\nexport async function getCommandHelp(command: string, subcommand?: string): Promise {\n const args = subcommand ? [subcommand, '--help'] : ['--help'];\n \n const result = await executeCLICommand({\n command,\n args\n });\n \n return result.stdout || result.stderr || 'No help available';\n}\n\n/**\n * Validate that a command exists on the system.\n */\nexport async function validateCommandExists(command: string): Promise {\n try {\n const result = await executeCLICommand({\n command: 'which',\n args: [command]\n });\n return result.success;\n } catch {\n return false;\n }\n}", "/**\n * Utilities for resolving filesystem paths relative to the server package root.\n *\n * The server can run from three different directory layouts:\n *\n * 1. **Source** (dev): `server/src/lib/` \u2192 packageRoot = `server/`\n * 2. **Bundle in monorepo** (dev/CI): `server/dist/` \u2192 packageRoot = `server/`\n * 3. **Bundle via npm** (production): `/dist/` \u2192 packageRoot = `/`\n *\n * In all three cases, the bundled QL tool query packs live at\n * `/ql//tools/src/`.\n *\n * The \"workspace root\" (monorepo root) is one level above packageRoot when\n * running from the monorepo checkout, and the packageRoot itself when running\n * from an npm install (no parent monorepo).\n */\n\nimport { dirname, resolve } from 'path';\nimport { existsSync, readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Detect whether the current __dirname looks like source code (`src/lib` or\n * `src/utils`) vs a bundled flat output directory (`dist/`).\n *\n * Uses a tail-of-path check so that unrelated `/src/` segments earlier in the\n * install path (e.g. `~/src/project/node_modules/.../dist`) don't cause a\n * false positive.\n */\nfunction isRunningFromSource(dir: string): boolean {\n const normalized = dir.replace(/\\\\/g, '/');\n return /\\/src(\\/[^/]+)?$/.test(normalized);\n}\n\n/**\n * Get the server package root directory.\n *\n * - From source (`server/src/utils/`): up 2 levels \u2192 `server/`\n * - From bundle (`server/dist/` or `/dist/`): up 1 level \u2192 package root\n */\nexport function getPackageRootDir(currentDir: string = __dirname): string {\n return isRunningFromSource(currentDir)\n ? resolve(currentDir, '..', '..') // src/utils \u2192 server/\n : resolve(currentDir, '..'); // dist/ \u2192 package root\n}\n\n/**\n * Get the workspace root directory (monorepo root when applicable).\n *\n * If a `package.json` with `workspaces` exists one level above the package\n * root, we're in a monorepo and that parent is the workspace root. Otherwise,\n * the packageRoot itself is the workspace root (npm install scenario).\n */\nexport function getWorkspaceRootDir(packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n const parentDir = resolve(pkgRoot, '..');\n\n // In the monorepo, the parent directory contains a package.json with workspaces\n try {\n const parentPkgPath = resolve(parentDir, 'package.json');\n if (existsSync(parentPkgPath)) {\n const parentPkg = JSON.parse(readFileSync(parentPkgPath, 'utf8'));\n if (parentPkg.workspaces) {\n return parentDir;\n }\n }\n } catch {\n // Not in a monorepo \u2014 fall through\n }\n\n return pkgRoot;\n}\n\n/**\n * Resolve the path to a tool query pack's source directory.\n *\n * @param language - CodeQL language identifier (e.g., \"javascript\", \"cpp\")\n * @param packageRoot - Override the package root (for testing)\n * @returns Absolute path to `ql//tools/src/`\n */\nexport function resolveToolQueryPackPath(language: string, packageRoot?: string): string {\n const pkgRoot = packageRoot ?? getPackageRootDir();\n return resolve(pkgRoot, 'ql', language, 'tools', 'src');\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\n", "/**\n * CodeQL Development MCP McpServer\n * Main entry point for the server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport express from 'express';\nimport cors from 'cors';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { pathToFileURL } from 'url';\nimport { registerCodeQLTools, registerCodeQLResources } from './tools';\nimport { registerLanguageResources } from './resources/language-resources';\nimport { registerWorkflowPrompts } from './prompts/workflow-prompts';\nimport { registerMonitoringTools } from './tools/monitoring-tools';\nimport { sessionDataManager } from './lib/session-data-manager';\nimport { resolveCodeQLBinary, validateCodeQLBinaryReachable } from './lib/cli-executor';\nimport { packageRootDir } from './utils/package-paths';\nimport { logger } from './utils/logger';\n\n// Load environment variables from a .env file co-located with the package root.\n// Uses the package directory (not CWD) so that npm-installed users don't\n// accidentally inherit a .env from their project.\ndotenv.config({ path: resolve(packageRootDir, '.env') });\n\nconst PACKAGE_NAME = 'codeql-development-mcp-server';\nconst VERSION = '2.23.9';\n\n/**\n * Start the MCP server\n */\nexport async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise {\n logger.info(`Starting CodeQL Development MCP McpServer v${VERSION} in ${mode} mode`);\n\n // Resolve the CodeQL CLI binary path (honors CODEQL_PATH env var).\n // This must happen before any tool registration so that all CodeQL commands\n // use the user-specified binary.\n const codeqlBinary = resolveCodeQLBinary();\n logger.info(`CodeQL CLI binary: ${codeqlBinary}`);\n\n // Validate that the resolved binary is actually callable. This catches\n // misconfigurations early (e.g. codeql not on PATH and CODEQL_PATH unset)\n // instead of failing silently and producing confusing tool-level errors.\n const codeqlVersion = await validateCodeQLBinaryReachable();\n logger.info(`CodeQL CLI version: ${codeqlVersion}`);\n\n const server = new McpServer({\n name: PACKAGE_NAME,\n version: VERSION,\n });\n\n // Register CodeQL tools (legacy high-level helpers)\n registerCodeQLTools(server);\n\n // Register CodeQL resources (static guides)\n registerCodeQLResources(server);\n\n // Register language-specific resources (AST references, security patterns)\n registerLanguageResources(server);\n\n // Register high-level workflow prompts (complete development workflows)\n registerWorkflowPrompts(server);\n\n // Register monitoring and reporting tools\n registerMonitoringTools(server);\n\n // Initialize session data manager\n await sessionDataManager.initialize();\n\n if (mode === 'stdio') {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info('McpServer started successfully on STDIO transport');\n } else {\n // HTTP mode\n const app = express();\n app.use(cors());\n app.use(express.json());\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => Math.random().toString(36).substring(7),\n });\n await server.connect(transport);\n\n app.all('/mcp', (req, res) => {\n transport.handleRequest(req, res, req.body).catch((err) => {\n logger.error('Error handling MCP request:', err);\n if (!res.headersSent) {\n res.status(500).json({ error: 'Internal McpServer Error' });\n }\n });\n });\n\n app.get('/', (_req, res) => {\n res.json({\n name: PACKAGE_NAME,\n version: VERSION,\n description: 'CodeQL Development MCP McpServer',\n status: 'running',\n });\n });\n\n const host = process.env.HTTP_HOST || 'localhost';\n const port = Number(process.env.HTTP_PORT || process.env.PORT) || 3000;\n \n // Return a promise that keeps the process alive\n return new Promise((resolve, reject) => {\n const httpServer = app.listen(port, host, () => {\n logger.info(`HTTP server listening on http://${host}:${port}/mcp`);\n resolve();\n });\n \n httpServer.on('error', (error) => {\n logger.error('HTTP server error:', error);\n reject(error);\n });\n });\n }\n\n setupGracefulShutdown(server);\n return server;\n}\n\n/**\n * Set up graceful shutdown handling\n */\nfunction setupGracefulShutdown(server: McpServer): void {\n const shutdown = async () => {\n logger.info('Shutting down server...');\n try {\n await server.close();\n logger.info('McpServer closed gracefully');\n process.exit(0);\n } catch (error) {\n logger.error('Error during shutdown:', error);\n process.exit(1);\n }\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\n/**\n * Main function to start the server\n */\nasync function main(): Promise {\n try {\n const transportMode = (process.env.TRANSPORT_MODE || 'stdio').toLowerCase();\n const mode: 'stdio' | 'http' = transportMode === 'http' ? 'http' : 'stdio';\n await startServer(mode);\n } catch (error) {\n logger.error('Failed to start server:', error);\n process.exit(1);\n }\n}\n\n// Start the server if this file is run directly\nconst scriptPath = process.argv[1] ? resolve(process.argv[1]) : undefined;\nif (scriptPath && import.meta.url === pathToFileURL(scriptPath).href) {\n main();\n}\n", "/**\n * CodeQL BQRS decode tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsDecodeTool: CLIToolDefinition = {\n name: 'codeql_bqrs_decode',\n description: 'Decode BQRS result files to human-readable formats',\n command: 'codeql',\n subcommand: 'bqrs decode',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to decode'),\n output: createCodeQLSchemas.output(),\n format: z.enum(['csv', 'json']).optional().describe('Output format'),\n 'max-paths': z.number().optional().describe('Maximum number of paths to output'),\n 'start-at': z.number().optional().describe('Start output at result number'),\n 'max-results': z.number().optional().describe('Maximum number of results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs decode --format=csv --output=results.csv results.bqrs',\n 'codeql bqrs decode --format=json --max-results=100 results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * Generic tool registry for creating MCP tools from CLI command definitions\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator';\nimport { getOrCreateLogDirectory } from './log-directory-manager';\nimport { packageRootDir, resolveToolQueryPackPath, workspaceRootDir } from '../utils/package-paths';\nimport { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs';\nimport { basename, dirname, isAbsolute, join, resolve } from 'path';\nimport { createProjectTempDir } from '../utils/temp-dir';\n\nexport type { CLIExecutionResult } from './cli-executor';\n\nexport interface CLIToolDefinition {\n name: string;\n description: string;\n command: 'codeql' | 'qlt';\n subcommand: string;\n inputSchema: Record;\n examples?: string[];\n resultProcessor?: (_result: CLIExecutionResult, _params: Record) => string;\n}\n\n/**\n * Default result processor that formats CLI output appropriately\n */\nexport const defaultCLIResultProcessor = (\n result: CLIExecutionResult, \n _params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n \n let output = '';\n \n if (result.stdout) {\n output += result.stdout;\n }\n \n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n \n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n \n return output;\n};\n\n/**\n * Register a CLI tool with the MCP server\n */\nexport function registerCLITool(server: McpServer, definition: CLIToolDefinition): void {\n const {\n name,\n description,\n command,\n subcommand,\n inputSchema,\n resultProcessor = defaultCLIResultProcessor\n } = definition;\n\n server.tool(\n name,\n description,\n inputSchema,\n async (params: Record) => {\n // Track temporary directories for cleanup\n const tempDirsToCleanup: string[] = [];\n \n try {\n logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params });\n\n // Separate positional arguments from named options\n // Extract tool-specific parameters that should not be passed to CLI\n // Note: format is extracted for tools that use it internally but not on CLI\n // For codeql_bqrs_interpret, codeql_bqrs_decode, codeql_generate_query-help, and codeql_database_analyze, format should be passed to CLI\n const formatShouldBePassedToCLI = name === 'codeql_bqrs_interpret' || name === 'codeql_bqrs_decode' || name === 'codeql_generate_query-help' || name === 'codeql_database_analyze';\n \n const extractedParams = formatShouldBePassedToCLI\n ? {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack,\n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n }\n : {\n _positional: params._positional || [],\n files: params.files,\n file: params.file,\n dir: params.dir,\n packDir: params.packDir,\n tests: params.tests,\n query: params.query,\n queryName: params.queryName,\n queryLanguage: params.queryLanguage,\n queryPack: params.queryPack, \n sourceFiles: params.sourceFiles,\n sourceFunction: params.sourceFunction,\n targetFunction: params.targetFunction,\n format: params.format,\n interpretedOutput: params.interpretedOutput,\n evaluationFunction: params.evaluationFunction,\n evaluationOutput: params.evaluationOutput,\n directory: params.directory,\n logDir: params.logDir,\n qlref: params.qlref\n };\n\n const {\n _positional = [],\n files,\n file,\n dir,\n packDir,\n tests,\n query,\n queryName,\n queryLanguage: _queryLanguage,\n queryPack: _queryPack,\n sourceFiles,\n sourceFunction,\n targetFunction,\n format: _format,\n interpretedOutput: _interpretedOutput,\n evaluationFunction: _evaluationFunction,\n evaluationOutput: _evaluationOutput,\n directory,\n logDir: customLogDir,\n qlref,\n } = extractedParams;\n\n // Get remaining options (everything not extracted above)\n const options = {...params};\n Object.keys(extractedParams).forEach(key => delete options[key]);\n let positionalArgs = Array.isArray(_positional) ? _positional as string[] : [_positional as string];\n\n // Handle files parameter as positional arguments for certain tools\n if (files && Array.isArray(files)) {\n positionalArgs = [...positionalArgs, ...files as string[]];\n }\n\n // Handle file parameter as positional argument for BQRS tools\n if (file && name.startsWith('codeql_bqrs_')) {\n positionalArgs = [...positionalArgs, file as string];\n }\n\n // Handle qlref parameter as positional argument for resolve qlref tool\n if (qlref && name === 'codeql_resolve_qlref') {\n positionalArgs = [...positionalArgs, qlref as string];\n }\n\n // Handle database parameter as positional argument for resolve database tool\n if (options.database && name === 'codeql_resolve_database') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database parameter as positional argument for database create tool\n if (options.database && name === 'codeql_database_create') {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n\n // Handle database and queries parameters as positional arguments for database analyze tool\n if (name === 'codeql_database_analyze') {\n if (options.database) {\n positionalArgs = [...positionalArgs, options.database as string];\n delete options.database;\n }\n if (options.queries) {\n positionalArgs = [...positionalArgs, options.queries as string];\n delete options.queries;\n }\n }\n\n // Handle query parameter as positional argument for generate query-help tool\n if (query && name === 'codeql_generate_query-help') {\n positionalArgs = [...positionalArgs, query as string];\n }\n\n // Handle dir parameter as positional argument for pack tools\n if (dir && (name === 'codeql_pack_ls')) {\n positionalArgs = [...positionalArgs, dir as string];\n }\n \n // Handle tool-specific parameters using switch pattern for better maintainability\n switch (name) {\n case 'codeql_test_accept':\n case 'codeql_test_extract':\n case 'codeql_test_run':\n case 'codeql_resolve_tests':\n // Handle tests parameter as positional arguments for test tools.\n // Resolve relative paths against workspaceRootDir since the MCP\n // server's cwd may not be the repo root.\n if (tests && Array.isArray(tests)) {\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(workspaceRootDir, t)\n )];\n }\n break;\n \n case 'codeql_query_run': {\n // Resolve database path to absolute path if it's relative\n if (options.database && typeof options.database === 'string' && !isAbsolute(options.database)) {\n options.database = resolve(workspaceRootDir, options.database);\n logger.info(`Resolved database path to: ${options.database}`);\n }\n \n // Implement query resolution logic with enhanced results processing\n const resolvedQuery = await resolveQueryPath(params, logger);\n if (resolvedQuery) {\n positionalArgs = [...positionalArgs, resolvedQuery];\n } else if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n \n // Handle external predicates for tool queries\n if (queryName === 'PrintAST' && sourceFiles) {\n // Create a CSV file with the source file paths for the external predicate\n // The external predicate expects a CSV file with one column containing file paths\n const filePaths = (sourceFiles as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir); // Track for cleanup\n csvPath = join(tempDir, 'selectedSourceFiles.csv');\n\n // Create CSV content\n const csvContent = filePaths.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`selectedSourceFiles=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphFrom queries\n if (queryName === 'CallGraphFrom' && sourceFunction) {\n const functionNames = (sourceFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'sourceFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`sourceFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n \n // Handle external predicates for CallGraphTo queries\n if (queryName === 'CallGraphTo' && targetFunction) {\n const functionNames = (targetFunction as string).split(',').map((f: string) => f.trim());\n let tempDir: string;\n let csvPath: string;\n try {\n tempDir = createProjectTempDir('codeql-external-');\n tempDirsToCleanup.push(tempDir);\n csvPath = join(tempDir, 'targetFunction.csv');\n\n // Create CSV content\n const csvContent = functionNames.join('\\n') + '\\n';\n\n writeFileSync(csvPath, csvContent, 'utf8');\n } catch (err) {\n logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || '[unknown]'}: ${err instanceof Error ? err.message : String(err)}`);\n throw err;\n }\n \n // Add the external predicate with the CSV file path\n const currentExternal = options.external || [];\n const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal];\n externalArray.push(`targetFunction=${csvPath}`);\n options.external = externalArray;\n \n logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(', ')}`);\n }\n break;\n }\n \n case 'codeql_query_compile':\n case 'codeql_resolve_metadata':\n // Handle query parameter as positional argument for query compilation and metadata tools\n if (query) {\n positionalArgs = [...positionalArgs, query as string];\n }\n break;\n \n case 'codeql_resolve_queries':\n // Handle directory parameter as positional argument\n if (directory) {\n positionalArgs = [...positionalArgs, directory as string];\n }\n break;\n \n default:\n // No special parameter handling needed for other tools\n break;\n }\n\n // Set up logging directory for query/test runs\n let queryLogDir: string | undefined;\n if (name === 'codeql_query_run' || name === 'codeql_test_run') {\n queryLogDir = getOrCreateLogDirectory(customLogDir as string | undefined);\n logger.info(`Using log directory for ${name}: ${queryLogDir}`);\n \n // Create timestamp file to track when query/test run started\n const timestampPath = join(queryLogDir, 'timestamp');\n writeFileSync(timestampPath, Date.now().toString(), 'utf8');\n \n // Set the --logdir option for CodeQL CLI\n options.logdir = queryLogDir;\n \n // Set verbosity to progress+ to generate detailed query.log/test.log\n if (!options.verbosity) {\n options.verbosity = 'progress+';\n }\n \n // For query run, also handle the deprecated evaluator-log parameter and default output\n if (name === 'codeql_query_run') {\n // If evaluator-log was explicitly provided (deprecated), use it\n // Otherwise, set it to the log directory\n if (!options['evaluator-log']) {\n options['evaluator-log'] = join(queryLogDir, 'evaluator-log.jsonl');\n }\n \n // If output was not explicitly provided, set it to the log directory\n if (!options.output) {\n options.output = join(queryLogDir, 'results.bqrs');\n }\n }\n }\n\n let result: CLIExecutionResult;\n \n if (command === 'codeql') {\n // For pack commands, set the working directory to where qlpack.yml is located.\n // Resolve to absolute path since the MCP server's cwd may differ from\n // the workspace root (especially when launched by VS Code).\n let cwd: string | undefined;\n if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) {\n const rawCwd = (dir || packDir) as string;\n // Resolve relative paths against the workspace root, not process.cwd(),\n // since the MCP server's cwd may differ (especially in VS Code).\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd);\n }\n \n // Add --additional-packs for commands that need to access local test packs.\n // Only set the default examples path when it actually exists on disk\n // (it may be absent in npm-installed layouts where ql/javascript/examples/\n // is not included in the published package).\n const defaultExamplesPath = resolve(packageRootDir, 'ql', 'javascript', 'examples');\n const additionalPacksPath = process.env.CODEQL_ADDITIONAL_PACKS\n || (existsSync(defaultExamplesPath) ? defaultExamplesPath : undefined);\n if (additionalPacksPath && (name === 'codeql_test_run' || name === 'codeql_query_run' || name === 'codeql_query_compile')) {\n options['additional-packs'] = additionalPacksPath;\n }\n \n // Keep test databases for codeql_test_run to allow subsequent query runs\n if (name === 'codeql_test_run') {\n options['keep-databases'] = true;\n }\n \n result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd);\n } else if (command === 'qlt') {\n result = await executeQLTCommand(subcommand, options, positionalArgs);\n } else {\n throw new Error(`Unsupported command: ${command}`);\n }\n\n // Post-execution processing for codeql_query_run\n if (name === 'codeql_query_run' && result.success && queryLogDir) {\n // Generate SARIF interpretation if results.bqrs exists\n const bqrsPath = options.output as string;\n const sarifPath = join(queryLogDir, 'results.sarif');\n \n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n \n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n \n // Process evaluation results\n result = await processQueryRunResults(result, params, logger);\n }\n\n // Process the result\n const processedResult = resultProcessor(result, params);\n\n return {\n content: [{\n type: 'text' as const,\n text: processedResult\n }],\n isError: !result.success\n };\n\n } catch (error) {\n logger.error(`Error in CLI tool ${name}:`, error);\n \n return {\n content: [{\n type: 'text' as const,\n text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}`\n }],\n isError: true\n };\n } finally {\n // Clean up temporary directories\n for (const tempDir of tempDirsToCleanup) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n logger.info(`Cleaned up temporary directory: ${tempDir}`);\n } catch (cleanupError) {\n logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError);\n }\n }\n }\n }\n );\n}\n\n/**\n * Helper function to create common CodeQL input schemas\n */\nexport const createCodeQLSchemas = {\n database: () => z.string().describe('Path to the CodeQL database'),\n \n query: () => z.string().describe('Path to the CodeQL query file (.ql)'),\n \n output: () => z.string().optional().describe('Output file path'),\n \n outputFormat: () => z.enum(['csv', 'json', 'bqrs', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n \n language: () => z.string().optional().describe('Programming language'),\n \n threads: () => z.number().optional().describe('Number of threads to use'),\n \n ram: () => z.number().optional().describe('Amount of RAM to use (MB)'),\n \n timeout: () => z.number().optional().describe('Timeout in seconds'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments'),\n \n positionalArgs: () => z.array(z.string()).optional().describe('Positional arguments')\n .transform((val) => ({ _positional: val }))\n};\n\n/**\n * Helper function to create common QLT input schemas\n */\nexport const createQLTSchemas = {\n language: () => z.string().describe('Programming language'),\n \n output: () => z.string().optional().describe('Output directory or file path'),\n \n template: () => z.string().optional().describe('Template to use'),\n \n name: () => z.string().optional().describe('Name for generated query'),\n \n description: () => z.string().optional().describe('Description for generated query'),\n \n verbose: () => z.boolean().optional().describe('Enable verbose output'),\n \n force: () => z.boolean().optional().describe('Force overwrite existing files'),\n \n additionalArgs: () => z.array(z.string()).optional().describe('Additional command-line arguments')\n};\n\n/**\n * Create a result processor that formats BQRS output specially\n */\nexport const createBQRSResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n // For BQRS commands, provide more context about the output\n let output = result.stdout;\n \n if (params.output) {\n output += `\\n\\nResults saved to: ${params.output}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Create a result processor that formats database creation output\n */\nexport const createDatabaseResultProcessor = () => (\n result: CLIExecutionResult, \n params: Record\n): string => {\n if (!result.success) {\n return defaultCLIResultProcessor(result, params);\n }\n \n let output = 'Database creation completed successfully';\n \n if (params.database || params._positional) {\n const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional);\n output += `\\n\\nDatabase location: ${dbPath}`;\n }\n \n if (result.stdout) {\n output += `\\n\\nOutput:\\n${result.stdout}`;\n }\n \n if (result.stderr) {\n output += `\\n\\nAdditional information:\\n${result.stderr}`;\n }\n \n return output;\n};\n\n/**\n * Resolve query path for codeql_query_run tool\n * If queryName and queryLanguage are provided, resolve using codeql resolve queries\n */\nasync function resolveQueryPath(\n params: Record, \n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n const { queryName, queryLanguage, queryPack, query } = params;\n \n // Validate parameter usage - queryName and query are mutually exclusive\n if (queryName && query) {\n logger.error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n throw new Error('Cannot use both \"query\" and \"queryName\" parameters simultaneously. Use either \"query\" for direct file path OR \"queryName\" + \"queryLanguage\" for tool queries.');\n }\n \n // If no queryName provided, fall back to direct query parameter\n if (!queryName) {\n return query as string || null;\n }\n \n // If queryName provided but no language, we can't resolve\n if (!queryLanguage) {\n logger.error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n throw new Error('queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift');\n }\n \n try {\n // Determine the query pack path - use absolute path to ensure it works regardless of cwd\n const defaultPackPath = resolveToolQueryPackPath(queryLanguage as string);\n const packPath = queryPack as string || defaultPackPath;\n \n logger.info(`Resolving query: ${queryName} for language: ${queryLanguage} in pack: ${packPath}`);\n \n // Execute codeql resolve queries to get available queries\n const { executeCodeQLCommand } = await import('./cli-executor');\n const resolveResult = await executeCodeQLCommand(\n 'resolve queries',\n { format: 'json' },\n [packPath]\n );\n \n if (!resolveResult.success) {\n logger.error('Failed to resolve queries:', resolveResult.stderr || resolveResult.error);\n throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`);\n }\n \n // Parse the JSON output to find matching queries\n let resolvedQueries: string[];\n try {\n resolvedQueries = JSON.parse(resolveResult.stdout);\n } catch (parseError) {\n logger.error('Failed to parse resolve queries output:', parseError);\n throw new Error('Failed to parse resolve queries output');\n }\n \n // Find the query that matches the requested name exactly\n const matchingQuery = resolvedQueries.find(queryPath => {\n const fileName = basename(queryPath);\n // Match exact query name: \"PrintAST\" should match \"PrintAST.ql\" only\n return fileName === `${queryName}.ql`;\n });\n\n if (!matchingQuery) {\n logger.error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\". Available queries:`, resolvedQueries.map(q => basename(q)));\n throw new Error(`Query \"${queryName}.ql\" not found in pack \"${packPath}\"`);\n }\n \n logger.info(`Resolved query \"${queryName}\" to: ${matchingQuery}`);\n return matchingQuery;\n \n } catch (error) {\n logger.error('Error resolving query path:', error);\n throw error;\n }\n}\n\n/**\n * Interpret BQRS file using codeql bqrs interpret\n */\nasync function interpretBQRSFile(\n bqrsPath: string,\n queryPath: string,\n format: string,\n outputPath: string,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n // Extract query metadata to get id and kind\n const metadata = await extractQueryMetadata(queryPath);\n \n // Validate required metadata fields\n const missingFields = [];\n if (!metadata.id) missingFields.push('id');\n if (!metadata.kind) missingFields.push('kind');\n \n if (missingFields.length > 0) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(', ')}. Ensure the query file contains @id and @kind metadata.`\n };\n }\n \n // Sanitize metadata values to prevent command injection\n const sanitizedKind = (metadata.kind || '').replace(/[^a-zA-Z0-9_-]/g, '');\n const sanitizedId = (metadata.id || '').replace(/[^a-zA-Z0-9_/:-]/g, '');\n \n // Validate format for query kind\n const graphFormats = ['graphtext', 'dgml', 'dot'];\n if (graphFormats.includes(format) && metadata.kind !== 'graph') {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}`\n };\n }\n \n // Ensure output directory exists\n mkdirSync(dirname(outputPath), { recursive: true });\n \n // Build the codeql bqrs interpret command\n const params: Record = {\n format: format,\n output: outputPath,\n t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`]\n };\n \n logger.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`);\n \n // Execute codeql bqrs interpret\n const result = await executeCodeQLCommand(\n 'bqrs interpret',\n params,\n [bqrsPath]\n );\n \n return result;\n } catch (error) {\n return {\n success: false,\n exitCode: 1,\n stdout: '',\n stderr: '',\n error: `Failed to interpret BQRS file: ${error}`\n };\n }\n}\n\n/**\n * Get default output extension based on format\n */\nfunction getDefaultExtension(format: string): string {\n switch (format) {\n case 'sarif-latest':\n case 'sarifv2.1.0':\n return '.sarif';\n case 'csv':\n return '.csv';\n case 'graphtext':\n return '.txt';\n case 'dgml':\n return '.dgml';\n case 'dot':\n return '.dot';\n default:\n return '.txt';\n }\n}\n\n/**\n * Process query run results with optional interpretation or evaluation\n */\nasync function processQueryRunResults(\n result: CLIExecutionResult,\n params: Record,\n logger: { info: (_message: string, ..._args: unknown[]) => void; error: (_message: string, ..._args: unknown[]) => void }\n): Promise {\n try {\n const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params;\n \n // If no format or evaluationFunction specified, return as-is\n if (!format && !evaluationFunction) {\n return result;\n }\n \n // Ensure output (bqrs file) was generated\n if (!output) {\n return result;\n }\n \n const bqrsPath = output as string;\n \n // Determine the query path for metadata extraction\n let queryPath: string | null = null;\n \n if (query) {\n queryPath = query as string;\n } else if (queryName && queryLanguage) {\n // Try to resolve the query path again for evaluation\n queryPath = await resolveQueryPath(params, logger);\n }\n \n if (!queryPath) {\n logger.error('Cannot determine query path for interpretation/evaluation');\n return {\n ...result,\n stdout: result.stdout + '\\n\\nWarning: Query interpretation skipped - could not determine query path'\n };\n }\n \n // Handle new format parameter (preferred approach)\n if (format) {\n const outputFormat = format as string;\n \n // Determine output path\n let outputFilePath = interpretedOutput as string | undefined;\n if (!outputFilePath) {\n const ext = getDefaultExtension(outputFormat);\n outputFilePath = bqrsPath.replace('.bqrs', ext);\n }\n \n logger.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`);\n \n // Interpret the BQRS file\n const interpretResult = await interpretBQRSFile(\n bqrsPath,\n queryPath,\n outputFormat,\n outputFilePath,\n logger\n );\n \n if (interpretResult.success) {\n let enhancedOutput = result.stdout;\n enhancedOutput += `\\n\\nQuery results interpreted successfully with format: ${outputFormat}`;\n enhancedOutput += `\\nInterpreted output saved to: ${outputFilePath}`;\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n logger.error('Query interpretation failed:', interpretResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}`\n };\n }\n }\n \n // Handle legacy evaluationFunction parameter (deprecated)\n if (evaluationFunction) {\n logger.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`);\n logger.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`);\n \n // Perform the evaluation\n const evaluationResult: QueryEvaluationResult = await evaluateQueryResults(\n bqrsPath,\n queryPath,\n evaluationFunction as string,\n evaluationOutput as string | undefined\n );\n \n if (evaluationResult.success) {\n // Append evaluation results to the command output\n let enhancedOutput = result.stdout;\n \n if (evaluationResult.outputPath) {\n enhancedOutput += `\\n\\nQuery evaluation completed successfully.`;\n enhancedOutput += `\\nEvaluation output saved to: ${evaluationResult.outputPath}`;\n }\n \n if (evaluationResult.content) {\n enhancedOutput += `\\n\\n=== Query Results Evaluation ===\\n`;\n enhancedOutput += evaluationResult.content;\n }\n \n return {\n ...result,\n stdout: enhancedOutput\n };\n } else {\n // Evaluation failed, but don't fail the whole operation\n logger.error('Query evaluation failed:', evaluationResult.error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query evaluation failed - ${evaluationResult.error}`\n };\n }\n }\n \n return result;\n } catch (error) {\n logger.error('Error in query results processing:', error);\n return {\n ...result,\n stdout: result.stdout + `\\n\\nWarning: Query processing error - ${error}`\n };\n }\n}", "/**\n * Query results evaluation functions for processing .bqrs files\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { writeFileSync, readFileSync } from 'fs';\nimport { dirname, isAbsolute } from 'path';\nimport { mkdirSync } from 'fs';\n\nexport interface QueryEvaluationResult {\n success: boolean;\n outputPath?: string;\n content?: string;\n error?: string;\n}\n\nexport interface QueryMetadata {\n kind?: string;\n name?: string;\n description?: string;\n id?: string;\n tags?: string[];\n}\n\n/**\n * Built-in evaluation functions\n */\nexport const BUILT_IN_EVALUATORS = {\n 'json-decode': 'JSON format decoder for query results',\n 'csv-decode': 'CSV format decoder for query results', \n 'mermaid-graph': 'Mermaid diagram generator for @kind graph queries (like PrintAST)',\n} as const;\n\nexport type BuiltInEvaluator = keyof typeof BUILT_IN_EVALUATORS;\n\n/**\n * Extract metadata from a CodeQL query file\n */\nexport async function extractQueryMetadata(queryPath: string): Promise {\n try {\n const queryContent = readFileSync(queryPath, 'utf-8');\n const metadata: QueryMetadata = {};\n \n // Extract metadata from comments using regex patterns\n const kindMatch = queryContent.match(/@kind\\s+([^\\s]+)/);\n if (kindMatch) metadata.kind = kindMatch[1];\n \n const nameMatch = queryContent.match(/@name\\s+(.+)/);\n if (nameMatch) metadata.name = nameMatch[1].trim();\n \n const descMatch = queryContent.match(/@description\\s+(.+)/);\n if (descMatch) metadata.description = descMatch[1].trim();\n \n const idMatch = queryContent.match(/@id\\s+(.+)/);\n if (idMatch) metadata.id = idMatch[1].trim();\n \n const tagsMatch = queryContent.match(/@tags\\s+(.+)/);\n if (tagsMatch) {\n metadata.tags = tagsMatch[1].split(/\\s+/).filter(t => t.length > 0);\n }\n \n return metadata;\n } catch (error) {\n logger.error('Failed to extract query metadata:', error);\n return {};\n }\n}\n\n/**\n * JSON decoder - converts .bqrs to JSON format\n */\nexport async function evaluateWithJsonDecoder(\n bqrsPath: string, \n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.json');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write JSON results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `JSON evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * CSV decoder - converts .bqrs to CSV format\n */\nexport async function evaluateWithCsvDecoder(\n bqrsPath: string,\n outputPath?: string\n): Promise {\n try {\n const result = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'csv' },\n [bqrsPath]\n );\n \n if (!result.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${result.stderr || result.error}`\n };\n }\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.csv');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write CSV results\n writeFileSync(defaultOutputPath, result.stdout);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: result.stdout\n };\n } catch (error) {\n return {\n success: false,\n error: `CSV evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Mermaid graph generator - converts @kind graph query results to mermaid diagrams\n */\nexport async function evaluateWithMermaidGraph(\n bqrsPath: string,\n queryPath: string,\n outputPath?: string\n): Promise {\n try {\n // First extract query metadata to confirm this is a graph query\n const metadata = await extractQueryMetadata(queryPath);\n \n if (metadata.kind !== 'graph') {\n logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`);\n return {\n success: false,\n error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`\n };\n }\n \n // Decode the BQRS file to JSON first\n const jsonResult = await executeCodeQLCommand(\n 'bqrs decode',\n { format: 'json' },\n [bqrsPath]\n );\n \n if (!jsonResult.success) {\n return {\n success: false,\n error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}`\n };\n }\n \n // Parse the JSON results\n let queryResults;\n try {\n queryResults = JSON.parse(jsonResult.stdout);\n } catch (parseError) {\n return {\n success: false,\n error: `Failed to parse query results JSON: ${parseError}`\n };\n }\n \n // Generate mermaid diagram from graph results\n const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata);\n \n const defaultOutputPath = outputPath || bqrsPath.replace('.bqrs', '.md');\n \n // Ensure output directory exists\n mkdirSync(dirname(defaultOutputPath), { recursive: true });\n \n // Write markdown file with mermaid diagram\n writeFileSync(defaultOutputPath, mermaidContent);\n \n return {\n success: true,\n outputPath: defaultOutputPath,\n content: mermaidContent\n };\n } catch (error) {\n return {\n success: false,\n error: `Mermaid graph evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Generate mermaid diagram from CodeQL graph query results\n */\nfunction generateMermaidFromGraphResults(queryResults: unknown, metadata: QueryMetadata): string {\n const queryName = sanitizeMarkdown(metadata.name || 'CodeQL Query Results');\n const queryDesc = sanitizeMarkdown(metadata.description || 'Graph visualization of CodeQL query results');\n \n let mermaidContent = `# ${queryName}\\n\\n${queryDesc}\\n\\n`;\n \n // Handle different result structures that CodeQL graph queries can produce\n if (!queryResults || typeof queryResults !== 'object') {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Results]\\n```\\n';\n return mermaidContent;\n }\n \n // Check if results have the expected structure for graph queries\n const tuples = queryResults.tuples || queryResults;\n \n if (!Array.isArray(tuples) || tuples.length === 0) {\n mermaidContent += '```mermaid\\ngraph TD\\n A[No Graph Data]\\n```\\n';\n return mermaidContent;\n }\n \n mermaidContent += '```mermaid\\ngraph TD\\n';\n \n // Track nodes and edges to avoid duplicates\n const nodes = new Set();\n const edges = new Set();\n \n // Process each tuple in the results\n tuples.forEach((tuple: unknown, index: number) => {\n if (Array.isArray(tuple) && tuple.length >= 2) {\n // Extract source and target from tuple\n const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`);\n const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`);\n const label = tuple[2]?.toString() || '';\n \n // Add nodes\n nodes.add(source);\n nodes.add(target);\n \n // Add edge\n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n } else if (typeof tuple === 'object' && tuple !== null) {\n // Handle object-based results\n const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`);\n const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`);\n const label = tuple.label?.toString() || tuple.relation?.toString() || '';\n \n nodes.add(source);\n nodes.add(target);\n \n const edgeId = `${source}_${target}`;\n if (!edges.has(edgeId)) {\n if (label) {\n mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target}\\n`;\n } else {\n mermaidContent += ` ${source} --> ${target}\\n`;\n }\n edges.add(edgeId);\n }\n }\n });\n \n // If no edges were created, create a simple diagram showing the first few nodes\n if (edges.size === 0 && nodes.size > 0) {\n const nodeArray = Array.from(nodes).slice(0, 10); // Limit to avoid clutter\n nodeArray.forEach((node, index) => {\n if (index === 0) {\n mermaidContent += ` ${node}[${sanitizeLabel(node)}]\\n`;\n } else {\n mermaidContent += ` ${nodeArray[0]} --> ${node}\\n`;\n }\n });\n }\n \n mermaidContent += '```\\n\\n';\n \n // Add statistics\n mermaidContent += `## Query Statistics\\n\\n`;\n mermaidContent += `- Total nodes: ${nodes.size}\\n`;\n mermaidContent += `- Total edges: ${edges.size}\\n`;\n mermaidContent += `- Total tuples processed: ${tuples.length}\\n`;\n \n return mermaidContent;\n}\n\n/**\n * Sanitize node IDs for mermaid compatibility\n */\nfunction sanitizeNodeId(id: string): string {\n return id\n .replace(/[^a-zA-Z0-9_]/g, '_')\n .replace(/^(\\d)/, 'n$1') // Prefix with 'n' if starts with number\n .substring(0, 50); // Limit length\n}\n\n/**\n * Sanitize labels for mermaid compatibility\n */\nfunction sanitizeLabel(label: string): string {\n return label\n .replace(/[|\"`<>\\n\\r\\t]/g, '') // Remove problematic characters including backticks, newlines, angle brackets\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 30); // Limit length for readability\n}\n\n/**\n * Sanitize markdown content to prevent injection\n */\nfunction sanitizeMarkdown(content: string): string {\n return content\n .replace(/[<>\"`]/g, '') // Remove potentially dangerous characters\n .replace(/\\n/g, ' ') // Convert newlines to spaces\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n .substring(0, 100); // Limit length\n}\n\n/**\n * Main evaluation function that determines which evaluator to use\n */\nexport async function evaluateQueryResults(\n bqrsPath: string,\n queryPath: string,\n evaluationFunction?: string,\n outputPath?: string\n): Promise {\n try {\n // If no evaluation function specified, default to json-decode\n const evalFunc = evaluationFunction || 'json-decode';\n \n logger.info(`Evaluating query results with function: ${evalFunc}`);\n \n // Handle built-in evaluation functions\n switch (evalFunc) {\n case 'json-decode':\n return await evaluateWithJsonDecoder(bqrsPath, outputPath);\n \n case 'csv-decode':\n return await evaluateWithCsvDecoder(bqrsPath, outputPath);\n \n case 'mermaid-graph':\n return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath);\n \n default:\n // Check if it's a path to a custom evaluation script\n if (isAbsolute(evalFunc)) {\n return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath);\n } else {\n return {\n success: false,\n error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(', ')}`\n };\n }\n }\n } catch (error) {\n return {\n success: false,\n error: `Query evaluation failed: ${error}`\n };\n }\n}\n\n/**\n * Execute custom evaluation script\n */\nasync function evaluateWithCustomScript(\n _bqrsPath: string,\n _queryPath: string,\n _scriptPath: string,\n _outputPath?: string\n): Promise {\n // TODO: Implement custom script execution\n // This would need to execute the script with bqrsPath and queryPath as arguments\n // and capture the output\n return {\n success: false,\n error: 'Custom evaluation scripts are not yet implemented'\n };\n}", "/**\n * Log directory management utilities for CodeQL query and test runs\n */\n\nimport { mkdirSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { randomBytes } from 'crypto';\nimport { getProjectTmpDir } from '../utils/temp-dir';\n\n/**\n * Ensure that a given path is within a base directory.\n * Throws an error if the path is outside the base directory.\n */\nfunction ensurePathWithinBase(baseDir: string, targetPath: string): string {\n const absBase = resolve(baseDir);\n const absTarget = resolve(targetPath);\n if (!absTarget.startsWith(absBase + '/') && absTarget !== absBase) {\n throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`);\n }\n return absTarget;\n}\n\n/**\n * Get or create a unique log directory for query/test runs\n * \n * @param logDir - Optional custom log directory from parameters\n * @returns Absolute path to the log directory\n */\nexport function getOrCreateLogDirectory(logDir?: string): string {\n // Use CODEQL_QUERY_LOG_DIR env var or default base\n const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir('query-logs');\n\n // If logDir is explicitly provided, validate it is within baseLogDir\n if (logDir) {\n const absLogDir = ensurePathWithinBase(baseLogDir, logDir);\n if (!existsSync(absLogDir)) {\n mkdirSync(absLogDir, { recursive: true });\n }\n return absLogDir;\n }\n \n // Otherwise, use baseLogDir and create a unique subdirectory\n \n // Create base directory if it doesn't exist\n if (!existsSync(baseLogDir)) {\n mkdirSync(baseLogDir, { recursive: true });\n }\n \n // Generate unique subdirectory with timestamp and random ID\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const uniqueId = randomBytes(4).toString('hex');\n const uniqueLogDir = join(baseLogDir, `query-run-${timestamp}-${uniqueId}`);\n \n mkdirSync(uniqueLogDir, { recursive: true });\n \n return uniqueLogDir;\n}\n", "/**\n * Secure project-local temporary directory utilities.\n *\n * All temporary files are created under `/.tmp/` which is\n * `.gitignore`d. This avoids writing to the OS temp directory\n * (`os.tmpdir()` / `/tmp`), which is world-readable and triggers\n * CWE-377 / CWE-378 (js/insecure-temporary-file).\n */\n\nimport { mkdirSync, mkdtempSync } from 'fs';\nimport { join } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n * Stored under `/.tmp` and excluded from version control.\n */\nconst PROJECT_TMP_BASE = join(getPackageRootDir(), '.tmp');\n\n/**\n * Return the project-local `.tmp` base directory, creating it if needed.\n */\nexport function getProjectTmpBase(): string {\n mkdirSync(PROJECT_TMP_BASE, { recursive: true });\n return PROJECT_TMP_BASE;\n}\n\n/**\n * Create a unique temporary directory under the project `.tmp` root.\n *\n * Works identically to `fs.mkdtempSync(os.tmpdir(), prefix)` but is\n * scoped to the repository.\n *\n * @param prefix - Directory name prefix (e.g. `'codeql-external-'`).\n * @returns Absolute path to the newly created directory.\n */\nexport function createProjectTempDir(prefix: string): string {\n const base = getProjectTmpBase();\n return mkdtempSync(join(base, prefix));\n}\n\n/**\n * Return a deterministic subdirectory under `.tmp/`, creating it\n * if it does not already exist.\n *\n * Useful for well-known scratch areas such as `query-logs` or `quickeval`.\n *\n * @param name - Subdirectory name (e.g. `'query-logs'`).\n * @returns Absolute path to the subdirectory.\n */\nexport function getProjectTmpDir(name: string): string {\n const dir = join(getProjectTmpBase(), name);\n mkdirSync(dir, { recursive: true });\n return dir;\n}\n", "/**\n * CodeQL BQRS info tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInfoTool: CLIToolDefinition = {\n name: 'codeql_bqrs_info',\n description: 'Get metadata and information about BQRS result files',\n command: 'codeql',\n subcommand: 'bqrs info',\n inputSchema: {\n files: z.array(z.string()).describe('BQRS file(s) to examine'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs info results.bqrs',\n 'codeql bqrs info --verbose results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};", "/**\n * CodeQL BQRS interpret tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, createBQRSResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlBqrsInterpretTool: CLIToolDefinition = {\n name: 'codeql_bqrs_interpret',\n description: 'Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)',\n command: 'codeql',\n subcommand: 'bqrs interpret',\n inputSchema: {\n file: z.string().describe('The BQRS file to interpret'),\n format: z.enum(['csv', 'sarif-latest', 'sarifv2.1.0', 'graphtext', 'dgml', 'dot'])\n .describe('Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)'),\n output: createCodeQLSchemas.output(),\n t: z.array(z.string())\n .describe('Query metadata key=value pairs. At least \"kind\" and \"id\" must be specified (e.g., [\"kind=graph\", \"id=js/print-ast\"])'),\n 'max-paths': z.number().optional()\n .describe('Maximum number of paths to produce for each alert with paths (default: 4)'),\n 'sarif-add-file-contents': z.boolean().optional()\n .describe('[SARIF only] Include full file contents for all files referenced in results'),\n 'sarif-add-snippets': z.boolean().optional()\n .describe('[SARIF only] Include code snippets for each location with context'),\n 'sarif-group-rules-by-pack': z.boolean().optional()\n .describe('[SARIF only] Place rule objects under their QL pack in tool.extensions property'),\n 'sarif-multicause-markdown': z.boolean().optional()\n .describe('[SARIF only] Include multi-cause alerts as Markdown-formatted lists'),\n 'sarif-category': z.string().optional()\n .describe('[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)'),\n 'csv-location-format': z.enum(['uri', 'line-column', 'offset-length']).optional()\n .describe('[CSV only] Format for locations in CSV output (default: line-column)'),\n 'dot-location-url-format': z.string().optional()\n .describe('[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})'),\n threads: z.number().optional()\n .describe('Number of threads for computing paths (0 = one per core, -N = leave N cores unused)'),\n 'column-kind': z.enum(['utf8', 'utf16', 'utf32', 'bytes']).optional()\n .describe('[SARIF only] Column kind for interpreting location columns'),\n 'unicode-new-lines': z.boolean().optional()\n .describe('[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs',\n 'codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs',\n 'codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs',\n 'codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs',\n 'codeql bqrs interpret --format=sarif-latest --sarif-add-snippets --sarif-category=security --output=results.sarif -t kind=path-problem -t id=go/path-injection results.bqrs'\n ],\n resultProcessor: createBQRSResultProcessor()\n};\n", "/**\n * CodeQL database analyze tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseAnalyzeTool: CLIToolDefinition = {\n name: 'codeql_database_analyze',\n description: 'Run queries or query suites against CodeQL databases',\n command: 'codeql',\n subcommand: 'database analyze',\n inputSchema: {\n database: z.string().describe('Path to the CodeQL database'),\n queries: z.string().describe('Queries or query suite to run'),\n output: z.string().optional().describe('Output file path'),\n format: z.enum(['csv', 'json', 'sarif-latest', 'sarifv2.1.0']).optional()\n .describe('Output format for results'),\n 'download-location': z.string().optional()\n .describe('Location to download missing dependencies'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n timeout: z.number().optional().describe('Timeout in seconds'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif',\n 'codeql database analyze mydb codeql/java-queries --format=csv'\n ]\n};", "/**\n * CodeQL database create tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createDatabaseResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlDatabaseCreateTool: CLIToolDefinition = {\n name: 'codeql_database_create',\n description: 'Create a CodeQL database from source code',\n command: 'codeql',\n subcommand: 'database create',\n inputSchema: {\n database: z.string().describe('Database path/name to create'),\n language: z.string().optional().describe('Programming language(s) to extract'),\n 'source-root': z.string().optional().describe('Root directory of source code'),\n command: z.string().optional().describe('Build command for compiled languages'),\n 'build-mode': z.enum(['none', 'autobuild', 'manual']).optional()\n .describe('Build mode: none (interpreted langs), autobuild, or manual'),\n threads: z.number().optional().describe('Number of threads to use'),\n ram: z.number().optional().describe('Amount of RAM to use (MB)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n overwrite: z.boolean().optional().describe('Overwrite existing database if it exists'),\n 'no-cleanup': z.boolean().optional().describe('Skip database cleanup after finalization'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql database create --language=java --source-root=/path/to/project mydb',\n 'codeql database create --language=cpp --command=\"make all\" mydb',\n 'codeql database create --language=python,javascript mydb'\n ],\n resultProcessor: createDatabaseResultProcessor()\n};", "/**\n * CodeQL find class position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface ClassPosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a class name identifier in a QL file.\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findClassPosition(filepath: string, className: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Match class definition with the specific class name\n const classNameRegex = new RegExp(`\\\\bclass\\\\s+(${className.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})\\\\b`);\n const match = classNameRegex.exec(line);\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The class name is in capture group 1\n const classNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = classNameStart + 1; // 1-based column numbering\n const end_col = start_col + className.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Class name '${className}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find class position tool with the MCP server\n */\nexport function registerFindClassPositionTool(server: McpServer): void {\n server.tool(\n 'find_class_position',\n 'Finds startline, startcol, endline endcol of a class for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the class to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findClassPosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding class position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find predicate position tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { readFile } from 'fs/promises';\nimport { logger } from '../../utils/logger';\n\nexport interface PredicatePosition {\n start_line: number;\n start_col: number;\n end_line: number;\n end_col: number;\n}\n\n/**\n * Find the 1-based position of a predicate name in a QL file.\n * Supports: \n * - predicate name(...) - predicates with no return type\n * - Type name(...) - predicates with return type (e.g., string foo())\n * - name(...) (inside class) - member predicates\n * Returns: { start_line, start_col, end_line, end_col }\n */\nexport async function findPredicatePosition(filepath: string, predicateName: string): Promise {\n try {\n const content = await readFile(filepath, 'utf-8');\n const lines = content.split('\\n');\n const escapedName = predicateName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n \n // Match predicate definition with the specific predicate name\n // Pattern 1: predicate name(...)\n const predicateKeywordRegex = new RegExp(`\\\\bpredicate\\\\s+(${escapedName})\\\\s*\\\\(`);\n let match = predicateKeywordRegex.exec(line);\n \n // Pattern 2: Type name(...) - predicates with return type\n // Matches: string foo(), int bar(), MyClass baz(), etc.\n // Must start at beginning of line (with optional whitespace) or after certain keywords\n if (!match) {\n const returnTypeRegex = new RegExp(`(?:^|\\\\s)(?:abstract\\\\s+)?(?:cached\\\\s+)?(?:private\\\\s+)?(?:deprecated\\\\s+)?(?:\\\\w+)\\\\s+(${escapedName})\\\\s*\\\\(`);\n match = returnTypeRegex.exec(line);\n }\n \n if (match) {\n const start_line = i + 1; // 1-based line numbering\n // The predicate name is in capture group 1\n const predicateNameStart = match.index + match[0].indexOf(match[1]);\n const start_col = predicateNameStart + 1; // 1-based column numbering\n const end_col = start_col + predicateName.length - 1; // end_col is inclusive\n \n return {\n start_line,\n start_col,\n end_line: start_line,\n end_col\n };\n }\n }\n\n throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`);\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found in file')) {\n throw error;\n }\n throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the find predicate position tool with the MCP server\n */\nexport function registerFindPredicatePositionTool(server: McpServer): void {\n server.tool(\n 'find_predicate_position',\n 'Finds startline, startcol, endline endcol of a predicate for quickeval',\n {\n file: z.string().describe('Path to the .ql file to search'),\n name: z.string().describe('Name of the predicate to find'),\n },\n async ({ file, name }) => {\n try {\n const position = await findPredicatePosition(file, name);\n return {\n content: [{ type: 'text', text: JSON.stringify(position, null, 2) }],\n };\n } catch (error) {\n logger.error('Error finding predicate position:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL find query files tool\n * Discovers and tracks all files related to a CodeQL query\n */\n\nimport { z } from 'zod';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { findCodeQLQueryFiles } from '../../lib/query-file-finder';\nimport { logger } from '../../utils/logger';\n\n/**\n * Register the find_codeql_query_files tool\n */\nexport function registerFindCodeQLQueryFilesTool(server: McpServer): void {\n server.tool(\n 'find_codeql_query_files',\n 'Find and track all files and directories related to a CodeQL query, including resolved metadata',\n {\n queryPath: z.string().describe('Path to the CodeQL query file (.ql)'),\n language: z.string().optional().describe('Programming language (optional, will be inferred if not provided)'),\n resolveMetadata: z.boolean().optional().describe('Whether to resolve query metadata (default: true)')\n },\n async ({ queryPath, language, resolveMetadata }) => {\n try {\n const result = await findCodeQLQueryFiles(\n queryPath,\n language,\n resolveMetadata !== false // Default to true if not specified\n );\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]\n };\n } catch (error) {\n logger.error('Error finding CodeQL query files:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`\n }\n ],\n isError: true\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query file finder utilities\n * Handles discovery and tracking of query-related files and directories\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { QueryFileInfo, QueryFilesResult } from '../types/codeql';\nimport { resolveQueryMetadata } from './metadata-resolver';\n\n// Supported CodeQL languages and their file extensions (alphabetically ordered)\nconst LANGUAGE_EXTENSIONS: Record = {\n actions: 'yml',\n cpp: 'cpp',\n csharp: 'cs',\n go: 'go',\n java: 'java',\n javascript: 'js',\n python: 'py',\n ruby: 'rb',\n swift: 'swift',\n typescript: 'ts'\n};\n\nconst KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS);\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n return LANGUAGE_EXTENSIONS[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Infer the language from the query file's directory structure\n */\nfunction inferLanguageFromPath(queryPath: string): string {\n const parts = queryPath.split(path.sep);\n\n for (const part of parts) {\n if (KNOWN_LANGUAGES.includes(part.toLowerCase())) {\n return part.toLowerCase();\n }\n }\n\n // Default fallback\n return 'unknown';\n}\n\n/**\n * Find the nearest qlpack.yml or codeql-pack.yml file by walking up the directory tree\n */\nfunction findNearestQlpack(startPath: string): string | null {\n let currentPath = startPath;\n const root = path.parse(currentPath).root;\n\n while (currentPath !== root) {\n // Check for codeql-pack.yml first (newer format), then qlpack.yml\n for (const packFile of ['codeql-pack.yml', 'qlpack.yml']) {\n const packPath = path.join(currentPath, packFile);\n if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) {\n return packPath;\n }\n }\n currentPath = path.dirname(currentPath);\n }\n\n return null;\n}\n\n/**\n * Read and parse qlpack.yml file\n */\nfunction readQlpackMetadata(qlpackPath: string): Record | null {\n try {\n const content = fs.readFileSync(qlpackPath, 'utf-8');\n const parsed = yaml.load(content) as Record;\n return parsed;\n } catch (_error) {\n // If we can't parse it, return null rather than failing\n return null;\n }\n}\n\n/**\n * Check if a file exists and return QueryFileInfo\n */\nfunction checkFile(filePath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n return {\n exists,\n path: filePath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: filePath // Return the path even on error\n };\n }\n}\n\n/**\n * Check if a directory exists and return QueryFileInfo\n */\nfunction checkDirectory(dirPath: string): QueryFileInfo {\n try {\n const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n return {\n exists,\n path: dirPath // Always return path, whether it exists or not\n };\n } catch {\n return {\n exists: false,\n path: dirPath // Return the path even on error\n };\n }\n}\n\n/**\n * Find all test code files in the test directory\n */\nfunction findTestCodeFiles(testDir: string, queryName: string, language: string): string[] {\n if (!fs.existsSync(testDir)) {\n return [];\n }\n\n try {\n const files = fs.readdirSync(testDir);\n const languageExt = getLanguageExtension(language);\n const testFiles: string[] = [];\n\n // Look for files matching the query name or other test code files\n const allValidExtensions = [...new Set([...Object.values(LANGUAGE_EXTENSIONS), 'yaml'])]; // Include yaml as alias for yml\n\n for (const file of files) {\n const filePath = path.join(testDir, file);\n const stat = fs.statSync(filePath);\n\n if (stat.isFile()) {\n // Include the primary test file matching query name\n if (file === `${queryName}.${languageExt}`) {\n testFiles.push(filePath);\n }\n // Include other code files (but not .qlref, .expected, .actual files)\n else if (!file.endsWith('.qlref') && !file.endsWith('.expected') && !file.endsWith('.actual')) {\n const ext = path.extname(file).slice(1);\n if (ext === languageExt || allValidExtensions.includes(ext)) {\n testFiles.push(filePath);\n }\n }\n }\n }\n\n return testFiles;\n } catch {\n return [];\n }\n}\n\n/**\n * Find CodeQL query files and directories based on a query file path\n * Optionally resolves metadata if the query file exists\n */\nexport async function findCodeQLQueryFiles(\n queryFilePath: string,\n language?: string,\n resolveMetadata: boolean = true\n): Promise {\n // Resolve absolute path\n const absoluteQueryPath = path.resolve(queryFilePath);\n\n // Extract query name and directory\n const queryName = path.basename(absoluteQueryPath, '.ql');\n const queryDir = path.dirname(absoluteQueryPath);\n\n // Infer language if not provided\n const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath);\n\n // Check query file itself\n const queryPath = checkFile(absoluteQueryPath);\n const queryDirectory = checkDirectory(queryDir);\n\n // Check for documentation files\n const mdPath = path.join(queryDir, `${queryName}.md`);\n const qhelpPath = path.join(queryDir, `${queryName}.qhelp`);\n const mdInfo = checkFile(mdPath);\n const qhelpInfo = checkFile(qhelpPath);\n\n const documentationPath: QueryFileInfo = mdInfo.exists ? mdInfo : (qhelpInfo.exists ? qhelpInfo : {\n exists: false,\n path: mdPath // Suggest .md as the default\n });\n\n // Check for specification file\n const qspecPath = path.join(queryDir, `${queryName}.qspec`);\n const specificationPath = checkFile(qspecPath);\n\n // Determine test directory\n // Pattern: if query is in .../src/QueryName/, test should be in .../test/QueryName/\n let testDir: string;\n if (queryDir.includes(`${path.sep}src${path.sep}`)) {\n // Find the last occurrence of /src/ and replace it with /test/\n const parts = queryDir.split(path.sep);\n const srcIndex = parts.lastIndexOf('src');\n if (srcIndex !== -1) {\n parts[srcIndex] = 'test';\n testDir = parts.join(path.sep);\n } else {\n // Fallback in case split didn't find it\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n } else {\n // Fallback: if not in src directory, construct test dir based on parent\n testDir = path.join(path.dirname(queryDir), 'test', queryName);\n }\n const testDirectory = checkDirectory(testDir);\n\n // Check for .qlref file\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const qlrefInfo = checkFile(qlrefPath);\n\n // Find test code files\n const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage);\n\n // Check for expected results\n const expectedPath = path.join(testDir, `${queryName}.expected`);\n const expectedResultsPath = checkFile(expectedPath);\n\n // Check for actual results\n const actualPath = path.join(testDir, `${queryName}.actual`);\n const actualResultsPath = checkFile(actualPath);\n\n // Check for test database\n const testprojPath = path.join(testDir, `${queryName}.testproj`);\n const testDatabasePath = checkDirectory(testprojPath);\n\n // Determine missing files\n const missingFiles: string[] = [];\n if (!queryPath.exists) missingFiles.push(queryPath.path);\n if (!documentationPath.exists) missingFiles.push(documentationPath.path);\n if (!specificationPath.exists) missingFiles.push(specificationPath.path);\n if (!testDirectory.exists) missingFiles.push(testDirectory.path);\n if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path);\n if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`));\n if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path);\n\n const allFilesExist = missingFiles.length === 0;\n\n // Resolve metadata if requested and query file exists\n let metadata: { [key: string]: string | string[] } | undefined;\n if (resolveMetadata && queryPath.exists) {\n const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath);\n if (resolvedMetadata) {\n metadata = resolvedMetadata;\n }\n }\n\n // Resolve pack metadata and directories by finding the nearest qlpack.yml files\n let packMetadata: Record | undefined;\n const queryPackPath = findNearestQlpack(queryDir);\n const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir;\n if (queryPackPath) {\n const parsed = readQlpackMetadata(queryPackPath);\n if (parsed) {\n packMetadata = parsed;\n }\n }\n\n // Find pack directory for test files\n const testPackPath = findNearestQlpack(testDir);\n const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir;\n\n return {\n queryName,\n language: detectedLanguage,\n\n allFilesExist,\n\n files: {\n query: {\n dir: queryDirectory.path,\n doc: path.basename(documentationPath.path),\n packDir: queryPackDir,\n query: path.basename(queryPath.path),\n spec: path.basename(specificationPath.path)\n },\n test: {\n actual: path.basename(actualResultsPath.path),\n dir: testDirectory.path,\n expected: path.basename(expectedResultsPath.path),\n packDir: testPackDir,\n qlref: path.basename(qlrefInfo.path),\n testCode: testCodePaths,\n testDatabaseDir: testDatabasePath.path\n }\n },\n\n metadata,\n\n missingFiles,\n\n packMetadata,\n\n status: {\n actualResultsExist: actualResultsPath.exists,\n documentationExists: documentationPath.exists,\n expectedResultsExist: expectedResultsPath.exists,\n hasTestCode: testCodePaths.length > 0,\n qlrefExists: qlrefInfo.exists,\n queryExists: queryPath.exists,\n specificationExists: specificationPath.exists,\n testDatabaseDirExists: testDatabasePath.exists,\n testDirectoryExists: testDirectory.exists\n }\n };\n}\n", "\n/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */\nfunction isNothing(subject) {\n return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n if (Array.isArray(sequence)) return sequence;\n else if (isNothing(sequence)) return [];\n\n return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n var index, length, key, sourceKeys;\n\n if (source) {\n sourceKeys = Object.keys(source);\n\n for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n key = sourceKeys[index];\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\nfunction repeat(string, count) {\n var result = '', cycle;\n\n for (cycle = 0; cycle < count; cycle += 1) {\n result += string;\n }\n\n return result;\n}\n\n\nfunction isNegativeZero(number) {\n return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nvar isNothing_1 = isNothing;\nvar isObject_1 = isObject;\nvar toArray_1 = toArray;\nvar repeat_1 = repeat;\nvar isNegativeZero_1 = isNegativeZero;\nvar extend_1 = extend;\n\nvar common = {\n\tisNothing: isNothing_1,\n\tisObject: isObject_1,\n\ttoArray: toArray_1,\n\trepeat: repeat_1,\n\tisNegativeZero: isNegativeZero_1,\n\textend: extend_1\n};\n\n// YAML error class. http://stackoverflow.com/questions/8458984\n\n\nfunction formatError(exception, compact) {\n var where = '', message = exception.reason || '(unknown reason)';\n\n if (!exception.mark) return message;\n\n if (exception.mark.name) {\n where += 'in \"' + exception.mark.name + '\" ';\n }\n\n where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';\n\n if (!compact && exception.mark.snippet) {\n where += '\\n\\n' + exception.mark.snippet;\n }\n\n return message + ' ' + where;\n}\n\n\nfunction YAMLException$1(reason, mark) {\n // Super constructor\n Error.call(this);\n\n this.name = 'YAMLException';\n this.reason = reason;\n this.mark = mark;\n this.message = formatError(this, false);\n\n // Include stack trace in error object\n if (Error.captureStackTrace) {\n // Chrome and NodeJS\n Error.captureStackTrace(this, this.constructor);\n } else {\n // FF, IE 10+ and Safari 6+. Fallback for others\n this.stack = (new Error()).stack || '';\n }\n}\n\n\n// Inherit from Error\nYAMLException$1.prototype = Object.create(Error.prototype);\nYAMLException$1.prototype.constructor = YAMLException$1;\n\n\nYAMLException$1.prototype.toString = function toString(compact) {\n return this.name + ': ' + formatError(this, compact);\n};\n\n\nvar exception = YAMLException$1;\n\n// get snippet for a single line, respecting maxLength\nfunction getLine(buffer, lineStart, lineEnd, position, maxLineLength) {\n var head = '';\n var tail = '';\n var maxHalfLength = Math.floor(maxLineLength / 2) - 1;\n\n if (position - lineStart > maxHalfLength) {\n head = ' ... ';\n lineStart = position - maxHalfLength + head.length;\n }\n\n if (lineEnd - position > maxHalfLength) {\n tail = ' ...';\n lineEnd = position + maxHalfLength - tail.length;\n }\n\n return {\n str: head + buffer.slice(lineStart, lineEnd).replace(/\\t/g, '\u2192') + tail,\n pos: position - lineStart + head.length // relative position\n };\n}\n\n\nfunction padStart(string, max) {\n return common.repeat(' ', max - string.length) + string;\n}\n\n\nfunction makeSnippet(mark, options) {\n options = Object.create(options || null);\n\n if (!mark.buffer) return null;\n\n if (!options.maxLength) options.maxLength = 79;\n if (typeof options.indent !== 'number') options.indent = 1;\n if (typeof options.linesBefore !== 'number') options.linesBefore = 3;\n if (typeof options.linesAfter !== 'number') options.linesAfter = 2;\n\n var re = /\\r?\\n|\\r|\\0/g;\n var lineStarts = [ 0 ];\n var lineEnds = [];\n var match;\n var foundLineNo = -1;\n\n while ((match = re.exec(mark.buffer))) {\n lineEnds.push(match.index);\n lineStarts.push(match.index + match[0].length);\n\n if (mark.position <= match.index && foundLineNo < 0) {\n foundLineNo = lineStarts.length - 2;\n }\n }\n\n if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;\n\n var result = '', i, line;\n var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;\n var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);\n\n for (i = 1; i <= options.linesBefore; i++) {\n if (foundLineNo - i < 0) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo - i],\n lineEnds[foundLineNo - i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),\n maxLineLength\n );\n result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n' + result;\n }\n\n line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);\n result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\\n';\n\n for (i = 1; i <= options.linesAfter; i++) {\n if (foundLineNo + i >= lineEnds.length) break;\n line = getLine(\n mark.buffer,\n lineStarts[foundLineNo + i],\n lineEnds[foundLineNo + i],\n mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),\n maxLineLength\n );\n result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +\n ' | ' + line.str + '\\n';\n }\n\n return result.replace(/\\n$/, '');\n}\n\n\nvar snippet = makeSnippet;\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n 'kind',\n 'multi',\n 'resolve',\n 'construct',\n 'instanceOf',\n 'predicate',\n 'represent',\n 'representName',\n 'defaultStyle',\n 'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n 'scalar',\n 'sequence',\n 'mapping'\n];\n\nfunction compileStyleAliases(map) {\n var result = {};\n\n if (map !== null) {\n Object.keys(map).forEach(function (style) {\n map[style].forEach(function (alias) {\n result[String(alias)] = style;\n });\n });\n }\n\n return result;\n}\n\nfunction Type$1(tag, options) {\n options = options || {};\n\n Object.keys(options).forEach(function (name) {\n if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n throw new exception('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n }\n });\n\n // TODO: Add tag format check.\n this.options = options; // keep original options in case user wants to extend this type later\n this.tag = tag;\n this.kind = options['kind'] || null;\n this.resolve = options['resolve'] || function () { return true; };\n this.construct = options['construct'] || function (data) { return data; };\n this.instanceOf = options['instanceOf'] || null;\n this.predicate = options['predicate'] || null;\n this.represent = options['represent'] || null;\n this.representName = options['representName'] || null;\n this.defaultStyle = options['defaultStyle'] || null;\n this.multi = options['multi'] || false;\n this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n throw new exception('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n }\n}\n\nvar type = Type$1;\n\n/*eslint-disable max-len*/\n\n\n\n\n\nfunction compileList(schema, name) {\n var result = [];\n\n schema[name].forEach(function (currentType) {\n var newIndex = result.length;\n\n result.forEach(function (previousType, previousIndex) {\n if (previousType.tag === currentType.tag &&\n previousType.kind === currentType.kind &&\n previousType.multi === currentType.multi) {\n\n newIndex = previousIndex;\n }\n });\n\n result[newIndex] = currentType;\n });\n\n return result;\n}\n\n\nfunction compileMap(/* lists... */) {\n var result = {\n scalar: {},\n sequence: {},\n mapping: {},\n fallback: {},\n multi: {\n scalar: [],\n sequence: [],\n mapping: [],\n fallback: []\n }\n }, index, length;\n\n function collectType(type) {\n if (type.multi) {\n result.multi[type.kind].push(type);\n result.multi['fallback'].push(type);\n } else {\n result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n }\n }\n\n for (index = 0, length = arguments.length; index < length; index += 1) {\n arguments[index].forEach(collectType);\n }\n return result;\n}\n\n\nfunction Schema$1(definition) {\n return this.extend(definition);\n}\n\n\nSchema$1.prototype.extend = function extend(definition) {\n var implicit = [];\n var explicit = [];\n\n if (definition instanceof type) {\n // Schema.extend(type)\n explicit.push(definition);\n\n } else if (Array.isArray(definition)) {\n // Schema.extend([ type1, type2, ... ])\n explicit = explicit.concat(definition);\n\n } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {\n // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })\n if (definition.implicit) implicit = implicit.concat(definition.implicit);\n if (definition.explicit) explicit = explicit.concat(definition.explicit);\n\n } else {\n throw new exception('Schema.extend argument should be a Type, [ Type ], ' +\n 'or a schema definition ({ implicit: [...], explicit: [...] })');\n }\n\n implicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n\n if (type$1.loadKind && type$1.loadKind !== 'scalar') {\n throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n }\n\n if (type$1.multi) {\n throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');\n }\n });\n\n explicit.forEach(function (type$1) {\n if (!(type$1 instanceof type)) {\n throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n }\n });\n\n var result = Object.create(Schema$1.prototype);\n\n result.implicit = (this.implicit || []).concat(implicit);\n result.explicit = (this.explicit || []).concat(explicit);\n\n result.compiledImplicit = compileList(result, 'implicit');\n result.compiledExplicit = compileList(result, 'explicit');\n result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit);\n\n return result;\n};\n\n\nvar schema = Schema$1;\n\nvar str = new type('tag:yaml.org,2002:str', {\n kind: 'scalar',\n construct: function (data) { return data !== null ? data : ''; }\n});\n\nvar seq = new type('tag:yaml.org,2002:seq', {\n kind: 'sequence',\n construct: function (data) { return data !== null ? data : []; }\n});\n\nvar map = new type('tag:yaml.org,2002:map', {\n kind: 'mapping',\n construct: function (data) { return data !== null ? data : {}; }\n});\n\nvar failsafe = new schema({\n explicit: [\n str,\n seq,\n map\n ]\n});\n\nfunction resolveYamlNull(data) {\n if (data === null) return true;\n\n var max = data.length;\n\n return (max === 1 && data === '~') ||\n (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n return null;\n}\n\nfunction isNull(object) {\n return object === null;\n}\n\nvar _null = new type('tag:yaml.org,2002:null', {\n kind: 'scalar',\n resolve: resolveYamlNull,\n construct: constructYamlNull,\n predicate: isNull,\n represent: {\n canonical: function () { return '~'; },\n lowercase: function () { return 'null'; },\n uppercase: function () { return 'NULL'; },\n camelcase: function () { return 'Null'; },\n empty: function () { return ''; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction resolveYamlBoolean(data) {\n if (data === null) return false;\n\n var max = data.length;\n\n return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n return data === 'true' ||\n data === 'True' ||\n data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nvar bool = new type('tag:yaml.org,2002:bool', {\n kind: 'scalar',\n resolve: resolveYamlBoolean,\n construct: constructYamlBoolean,\n predicate: isBoolean,\n represent: {\n lowercase: function (object) { return object ? 'true' : 'false'; },\n uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n camelcase: function (object) { return object ? 'True' : 'False'; }\n },\n defaultStyle: 'lowercase'\n});\n\nfunction isHexCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n if (data === null) return false;\n\n var max = data.length,\n index = 0,\n hasDigits = false,\n ch;\n\n if (!max) return false;\n\n ch = data[index];\n\n // sign\n if (ch === '-' || ch === '+') {\n ch = data[++index];\n }\n\n if (ch === '0') {\n // 0\n if (index + 1 === max) return true;\n ch = data[++index];\n\n // base 2, base 8, base 16\n\n if (ch === 'b') {\n // base 2\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (ch !== '0' && ch !== '1') return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'x') {\n // base 16\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isHexCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n\n\n if (ch === 'o') {\n // base 8\n index++;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isOctCode(data.charCodeAt(index))) return false;\n hasDigits = true;\n }\n return hasDigits && ch !== '_';\n }\n }\n\n // base 10 (except 0)\n\n // value should not start with `_`;\n if (ch === '_') return false;\n\n for (; index < max; index++) {\n ch = data[index];\n if (ch === '_') continue;\n if (!isDecCode(data.charCodeAt(index))) {\n return false;\n }\n hasDigits = true;\n }\n\n // Should have digits and should not end with `_`\n if (!hasDigits || ch === '_') return false;\n\n return true;\n}\n\nfunction constructYamlInteger(data) {\n var value = data, sign = 1, ch;\n\n if (value.indexOf('_') !== -1) {\n value = value.replace(/_/g, '');\n }\n\n ch = value[0];\n\n if (ch === '-' || ch === '+') {\n if (ch === '-') sign = -1;\n value = value.slice(1);\n ch = value[0];\n }\n\n if (value === '0') return 0;\n\n if (ch === '0') {\n if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);\n if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);\n }\n\n return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n return (Object.prototype.toString.call(object)) === '[object Number]' &&\n (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nvar int = new type('tag:yaml.org,2002:int', {\n kind: 'scalar',\n resolve: resolveYamlInteger,\n construct: constructYamlInteger,\n predicate: isInteger,\n represent: {\n binary: function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n octal: function (obj) { return obj >= 0 ? '0o' + obj.toString(8) : '-0o' + obj.toString(8).slice(1); },\n decimal: function (obj) { return obj.toString(10); },\n /* eslint-disable max-len */\n hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() : '-0x' + obj.toString(16).toUpperCase().slice(1); }\n },\n defaultStyle: 'decimal',\n styleAliases: {\n binary: [ 2, 'bin' ],\n octal: [ 8, 'oct' ],\n decimal: [ 10, 'dec' ],\n hexadecimal: [ 16, 'hex' ]\n }\n});\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n // 2.5e4, 2.5 and integers\n '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n // .2e4, .2\n // special case, seems not from spec\n '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n // .inf\n '|[-+]?\\\\.(?:inf|Inf|INF)' +\n // .nan\n '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n if (data === null) return false;\n\n if (!YAML_FLOAT_PATTERN.test(data) ||\n // Quick hack to not allow integers end with `_`\n // Probably should update regexp & check speed\n data[data.length - 1] === '_') {\n return false;\n }\n\n return true;\n}\n\nfunction constructYamlFloat(data) {\n var value, sign;\n\n value = data.replace(/_/g, '').toLowerCase();\n sign = value[0] === '-' ? -1 : 1;\n\n if ('+-'.indexOf(value[0]) >= 0) {\n value = value.slice(1);\n }\n\n if (value === '.inf') {\n return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n } else if (value === '.nan') {\n return NaN;\n }\n return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n var res;\n\n if (isNaN(object)) {\n switch (style) {\n case 'lowercase': return '.nan';\n case 'uppercase': return '.NAN';\n case 'camelcase': return '.NaN';\n }\n } else if (Number.POSITIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '.inf';\n case 'uppercase': return '.INF';\n case 'camelcase': return '.Inf';\n }\n } else if (Number.NEGATIVE_INFINITY === object) {\n switch (style) {\n case 'lowercase': return '-.inf';\n case 'uppercase': return '-.INF';\n case 'camelcase': return '-.Inf';\n }\n } else if (common.isNegativeZero(object)) {\n return '-0.0';\n }\n\n res = object.toString(10);\n\n // JS stringifier can build scientific format without dots: 5e-100,\n // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n return (Object.prototype.toString.call(object) === '[object Number]') &&\n (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nvar float = new type('tag:yaml.org,2002:float', {\n kind: 'scalar',\n resolve: resolveYamlFloat,\n construct: constructYamlFloat,\n predicate: isFloat,\n represent: representYamlFloat,\n defaultStyle: 'lowercase'\n});\n\nvar json = failsafe.extend({\n implicit: [\n _null,\n bool,\n int,\n float\n ]\n});\n\nvar core = json;\n\nvar YAML_DATE_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9])' + // [2] month\n '-([0-9][0-9])$'); // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n '^([0-9][0-9][0-9][0-9])' + // [1] year\n '-([0-9][0-9]?)' + // [2] month\n '-([0-9][0-9]?)' + // [3] day\n '(?:[Tt]|[ \\\\t]+)' + // ...\n '([0-9][0-9]?)' + // [4] hour\n ':([0-9][0-9])' + // [5] minute\n ':([0-9][0-9])' + // [6] second\n '(?:\\\\.([0-9]*))?' + // [7] fraction\n '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n '(?::([0-9][0-9]))?))?$'); // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n if (data === null) return false;\n if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n return false;\n}\n\nfunction constructYamlTimestamp(data) {\n var match, year, month, day, hour, minute, second, fraction = 0,\n delta = null, tz_hour, tz_minute, date;\n\n match = YAML_DATE_REGEXP.exec(data);\n if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n if (match === null) throw new Error('Date resolve error');\n\n // match: [1] year [2] month [3] day\n\n year = +(match[1]);\n month = +(match[2]) - 1; // JS month starts with 0\n day = +(match[3]);\n\n if (!match[4]) { // no hour\n return new Date(Date.UTC(year, month, day));\n }\n\n // match: [4] hour [5] minute [6] second [7] fraction\n\n hour = +(match[4]);\n minute = +(match[5]);\n second = +(match[6]);\n\n if (match[7]) {\n fraction = match[7].slice(0, 3);\n while (fraction.length < 3) { // milli-seconds\n fraction += '0';\n }\n fraction = +fraction;\n }\n\n // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n if (match[9]) {\n tz_hour = +(match[10]);\n tz_minute = +(match[11] || 0);\n delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n if (match[9] === '-') delta = -delta;\n }\n\n date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n if (delta) date.setTime(date.getTime() - delta);\n\n return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n return object.toISOString();\n}\n\nvar timestamp = new type('tag:yaml.org,2002:timestamp', {\n kind: 'scalar',\n resolve: resolveYamlTimestamp,\n construct: constructYamlTimestamp,\n instanceOf: Date,\n represent: representYamlTimestamp\n});\n\nfunction resolveYamlMerge(data) {\n return data === '<<' || data === null;\n}\n\nvar merge = new type('tag:yaml.org,2002:merge', {\n kind: 'scalar',\n resolve: resolveYamlMerge\n});\n\n/*eslint-disable no-bitwise*/\n\n\n\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n if (data === null) return false;\n\n var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n // Convert one by one.\n for (idx = 0; idx < max; idx++) {\n code = map.indexOf(data.charAt(idx));\n\n // Skip CR/LF\n if (code > 64) continue;\n\n // Fail on illegal characters\n if (code < 0) return false;\n\n bitlen += 6;\n }\n\n // If there are any bits left, source was corrupted\n return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n var idx, tailbits,\n input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length,\n map = BASE64_MAP,\n bits = 0,\n result = [];\n\n // Collect by 6*4 bits (3 bytes)\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n }\n\n bits = (bits << 6) | map.indexOf(input.charAt(idx));\n }\n\n // Dump tail\n\n tailbits = (max % 4) * 6;\n\n if (tailbits === 0) {\n result.push((bits >> 16) & 0xFF);\n result.push((bits >> 8) & 0xFF);\n result.push(bits & 0xFF);\n } else if (tailbits === 18) {\n result.push((bits >> 10) & 0xFF);\n result.push((bits >> 2) & 0xFF);\n } else if (tailbits === 12) {\n result.push((bits >> 4) & 0xFF);\n }\n\n return new Uint8Array(result);\n}\n\nfunction representYamlBinary(object /*, style*/) {\n var result = '', bits = 0, idx, tail,\n max = object.length,\n map = BASE64_MAP;\n\n // Convert every three bytes to 4 ASCII characters.\n\n for (idx = 0; idx < max; idx++) {\n if ((idx % 3 === 0) && idx) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n }\n\n bits = (bits << 8) + object[idx];\n }\n\n // Dump tail\n\n tail = max % 3;\n\n if (tail === 0) {\n result += map[(bits >> 18) & 0x3F];\n result += map[(bits >> 12) & 0x3F];\n result += map[(bits >> 6) & 0x3F];\n result += map[bits & 0x3F];\n } else if (tail === 2) {\n result += map[(bits >> 10) & 0x3F];\n result += map[(bits >> 4) & 0x3F];\n result += map[(bits << 2) & 0x3F];\n result += map[64];\n } else if (tail === 1) {\n result += map[(bits >> 2) & 0x3F];\n result += map[(bits << 4) & 0x3F];\n result += map[64];\n result += map[64];\n }\n\n return result;\n}\n\nfunction isBinary(obj) {\n return Object.prototype.toString.call(obj) === '[object Uint8Array]';\n}\n\nvar binary = new type('tag:yaml.org,2002:binary', {\n kind: 'scalar',\n resolve: resolveYamlBinary,\n construct: constructYamlBinary,\n predicate: isBinary,\n represent: representYamlBinary\n});\n\nvar _hasOwnProperty$3 = Object.prototype.hasOwnProperty;\nvar _toString$2 = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n if (data === null) return true;\n\n var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n object = data;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n pairHasKey = false;\n\n if (_toString$2.call(pair) !== '[object Object]') return false;\n\n for (pairKey in pair) {\n if (_hasOwnProperty$3.call(pair, pairKey)) {\n if (!pairHasKey) pairHasKey = true;\n else return false;\n }\n }\n\n if (!pairHasKey) return false;\n\n if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n else return false;\n }\n\n return true;\n}\n\nfunction constructYamlOmap(data) {\n return data !== null ? data : [];\n}\n\nvar omap = new type('tag:yaml.org,2002:omap', {\n kind: 'sequence',\n resolve: resolveYamlOmap,\n construct: constructYamlOmap\n});\n\nvar _toString$1 = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n if (data === null) return true;\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n if (_toString$1.call(pair) !== '[object Object]') return false;\n\n keys = Object.keys(pair);\n\n if (keys.length !== 1) return false;\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return true;\n}\n\nfunction constructYamlPairs(data) {\n if (data === null) return [];\n\n var index, length, pair, keys, result,\n object = data;\n\n result = new Array(object.length);\n\n for (index = 0, length = object.length; index < length; index += 1) {\n pair = object[index];\n\n keys = Object.keys(pair);\n\n result[index] = [ keys[0], pair[keys[0]] ];\n }\n\n return result;\n}\n\nvar pairs = new type('tag:yaml.org,2002:pairs', {\n kind: 'sequence',\n resolve: resolveYamlPairs,\n construct: constructYamlPairs\n});\n\nvar _hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n if (data === null) return true;\n\n var key, object = data;\n\n for (key in object) {\n if (_hasOwnProperty$2.call(object, key)) {\n if (object[key] !== null) return false;\n }\n }\n\n return true;\n}\n\nfunction constructYamlSet(data) {\n return data !== null ? data : {};\n}\n\nvar set = new type('tag:yaml.org,2002:set', {\n kind: 'mapping',\n resolve: resolveYamlSet,\n construct: constructYamlSet\n});\n\nvar _default = core.extend({\n implicit: [\n timestamp,\n merge\n ],\n explicit: [\n binary,\n omap,\n pairs,\n set\n ]\n});\n\n/*eslint-disable max-len,no-use-before-define*/\n\n\n\n\n\n\n\nvar _hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN = 1;\nvar CONTEXT_FLOW_OUT = 2;\nvar CONTEXT_BLOCK_IN = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP = 3;\n\n\nvar PATTERN_NON_PRINTABLE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n return (c === 0x09/* Tab */) ||\n (c === 0x20/* Space */) ||\n (c === 0x0A/* LF */) ||\n (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n return c === 0x2C/* , */ ||\n c === 0x5B/* [ */ ||\n c === 0x5D/* ] */ ||\n c === 0x7B/* { */ ||\n c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n var lc;\n\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n /*eslint-disable no-bitwise*/\n lc = c | 0x20;\n\n if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n return lc - 0x61 + 10;\n }\n\n return -1;\n}\n\nfunction escapedHexLen(c) {\n if (c === 0x78/* x */) { return 2; }\n if (c === 0x75/* u */) { return 4; }\n if (c === 0x55/* U */) { return 8; }\n return 0;\n}\n\nfunction fromDecimalCode(c) {\n if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n return c - 0x30;\n }\n\n return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n /* eslint-disable indent */\n return (c === 0x30/* 0 */) ? '\\x00' :\n (c === 0x61/* a */) ? '\\x07' :\n (c === 0x62/* b */) ? '\\x08' :\n (c === 0x74/* t */) ? '\\x09' :\n (c === 0x09/* Tab */) ? '\\x09' :\n (c === 0x6E/* n */) ? '\\x0A' :\n (c === 0x76/* v */) ? '\\x0B' :\n (c === 0x66/* f */) ? '\\x0C' :\n (c === 0x72/* r */) ? '\\x0D' :\n (c === 0x65/* e */) ? '\\x1B' :\n (c === 0x20/* Space */) ? ' ' :\n (c === 0x22/* \" */) ? '\\x22' :\n (c === 0x2F/* / */) ? '/' :\n (c === 0x5C/* \\ */) ? '\\x5C' :\n (c === 0x4E/* N */) ? '\\x85' :\n (c === 0x5F/* _ */) ? '\\xA0' :\n (c === 0x4C/* L */) ? '\\u2028' :\n (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n if (c <= 0xFFFF) {\n return String.fromCharCode(c);\n }\n // Encode UTF-16 surrogate pair\n // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n return String.fromCharCode(\n ((c - 0x010000) >> 10) + 0xD800,\n ((c - 0x010000) & 0x03FF) + 0xDC00\n );\n}\n\n// set a property of a literal object, while protecting against prototype pollution,\n// see https://github.com/nodeca/js-yaml/issues/164 for more details\nfunction setProperty(object, key, value) {\n // used for this specific key only because Object.defineProperty is slow\n if (key === '__proto__') {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: value\n });\n } else {\n object[key] = value;\n }\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State$1(input, options) {\n this.input = input;\n\n this.filename = options['filename'] || null;\n this.schema = options['schema'] || _default;\n this.onWarning = options['onWarning'] || null;\n // (Hidden) Remove? makes the loader to expect YAML 1.1 documents\n // if such documents have no explicit %YAML directive\n this.legacy = options['legacy'] || false;\n\n this.json = options['json'] || false;\n this.listener = options['listener'] || null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.typeMap = this.schema.compiledTypeMap;\n\n this.length = input.length;\n this.position = 0;\n this.line = 0;\n this.lineStart = 0;\n this.lineIndent = 0;\n\n // position of first leading tab in the current line,\n // used to make sure there are no tabs in the indentation\n this.firstTabInLine = -1;\n\n this.documents = [];\n\n /*\n this.version;\n this.checkLineBreaks;\n this.tagMap;\n this.anchorMap;\n this.tag;\n this.anchor;\n this.kind;\n this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n var mark = {\n name: state.filename,\n buffer: state.input.slice(0, -1), // omit trailing \\0\n position: state.position,\n line: state.line,\n column: state.position - state.lineStart\n };\n\n mark.snippet = snippet(mark);\n\n return new exception(message, mark);\n}\n\nfunction throwError(state, message) {\n throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n if (state.onWarning) {\n state.onWarning.call(null, generateError(state, message));\n }\n}\n\n\nvar directiveHandlers = {\n\n YAML: function handleYamlDirective(state, name, args) {\n\n var match, major, minor;\n\n if (state.version !== null) {\n throwError(state, 'duplication of %YAML directive');\n }\n\n if (args.length !== 1) {\n throwError(state, 'YAML directive accepts exactly one argument');\n }\n\n match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n if (match === null) {\n throwError(state, 'ill-formed argument of the YAML directive');\n }\n\n major = parseInt(match[1], 10);\n minor = parseInt(match[2], 10);\n\n if (major !== 1) {\n throwError(state, 'unacceptable YAML version of the document');\n }\n\n state.version = args[0];\n state.checkLineBreaks = (minor < 2);\n\n if (minor !== 1 && minor !== 2) {\n throwWarning(state, 'unsupported YAML version of the document');\n }\n },\n\n TAG: function handleTagDirective(state, name, args) {\n\n var handle, prefix;\n\n if (args.length !== 2) {\n throwError(state, 'TAG directive accepts exactly two arguments');\n }\n\n handle = args[0];\n prefix = args[1];\n\n if (!PATTERN_TAG_HANDLE.test(handle)) {\n throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n }\n\n if (_hasOwnProperty$1.call(state.tagMap, handle)) {\n throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n }\n\n if (!PATTERN_TAG_URI.test(prefix)) {\n throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n }\n\n try {\n prefix = decodeURIComponent(prefix);\n } catch (err) {\n throwError(state, 'tag prefix is malformed: ' + prefix);\n }\n\n state.tagMap[handle] = prefix;\n }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n var _position, _length, _character, _result;\n\n if (start < end) {\n _result = state.input.slice(start, end);\n\n if (checkJson) {\n for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n _character = _result.charCodeAt(_position);\n if (!(_character === 0x09 ||\n (0x20 <= _character && _character <= 0x10FFFF))) {\n throwError(state, 'expected valid JSON character');\n }\n }\n } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n throwError(state, 'the stream contains non-printable characters');\n }\n\n state.result += _result;\n }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n var sourceKeys, key, index, quantity;\n\n if (!common.isObject(source)) {\n throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n }\n\n sourceKeys = Object.keys(source);\n\n for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n key = sourceKeys[index];\n\n if (!_hasOwnProperty$1.call(destination, key)) {\n setProperty(destination, key, source[key]);\n overridableKeys[key] = true;\n }\n }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,\n startLine, startLineStart, startPos) {\n\n var index, quantity;\n\n // The output is a plain object here, so keys can only be strings.\n // We need to convert keyNode to a string, but doing so can hang the process\n // (deeply nested arrays that explode exponentially using aliases).\n if (Array.isArray(keyNode)) {\n keyNode = Array.prototype.slice.call(keyNode);\n\n for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n if (Array.isArray(keyNode[index])) {\n throwError(state, 'nested arrays are not supported inside keys');\n }\n\n if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n keyNode[index] = '[object Object]';\n }\n }\n }\n\n // Avoid code execution in load() via toString property\n // (still use its own toString for arrays, timestamps,\n // and whatever user schema extensions happen to have @@toStringTag)\n if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n keyNode = '[object Object]';\n }\n\n\n keyNode = String(keyNode);\n\n if (_result === null) {\n _result = {};\n }\n\n if (keyTag === 'tag:yaml.org,2002:merge') {\n if (Array.isArray(valueNode)) {\n for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n mergeMappings(state, _result, valueNode[index], overridableKeys);\n }\n } else {\n mergeMappings(state, _result, valueNode, overridableKeys);\n }\n } else {\n if (!state.json &&\n !_hasOwnProperty$1.call(overridableKeys, keyNode) &&\n _hasOwnProperty$1.call(_result, keyNode)) {\n state.line = startLine || state.line;\n state.lineStart = startLineStart || state.lineStart;\n state.position = startPos || state.position;\n throwError(state, 'duplicated mapping key');\n }\n\n setProperty(_result, keyNode, valueNode);\n delete overridableKeys[keyNode];\n }\n\n return _result;\n}\n\nfunction readLineBreak(state) {\n var ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x0A/* LF */) {\n state.position++;\n } else if (ch === 0x0D/* CR */) {\n state.position++;\n if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n state.position++;\n }\n } else {\n throwError(state, 'a line break is expected');\n }\n\n state.line += 1;\n state.lineStart = state.position;\n state.firstTabInLine = -1;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n var lineBreaks = 0,\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {\n state.firstTabInLine = state.position;\n }\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (allowComments && ch === 0x23/* # */) {\n do {\n ch = state.input.charCodeAt(++state.position);\n } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n }\n\n if (is_EOL(ch)) {\n readLineBreak(state);\n\n ch = state.input.charCodeAt(state.position);\n lineBreaks++;\n state.lineIndent = 0;\n\n while (ch === 0x20/* Space */) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n } else {\n break;\n }\n }\n\n if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n throwWarning(state, 'deficient indentation');\n }\n\n return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n var _position = state.position,\n ch;\n\n ch = state.input.charCodeAt(_position);\n\n // Condition state.position === state.lineStart is tested\n // in parent on each call, for efficiency. No needs to test here again.\n if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n ch === state.input.charCodeAt(_position + 1) &&\n ch === state.input.charCodeAt(_position + 2)) {\n\n _position += 3;\n\n ch = state.input.charCodeAt(_position);\n\n if (ch === 0 || is_WS_OR_EOL(ch)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction writeFoldedLines(state, count) {\n if (count === 1) {\n state.result += ' ';\n } else if (count > 1) {\n state.result += common.repeat('\\n', count - 1);\n }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n var preceding,\n following,\n captureStart,\n captureEnd,\n hasPendingContent,\n _line,\n _lineStart,\n _lineIndent,\n _kind = state.kind,\n _result = state.result,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (is_WS_OR_EOL(ch) ||\n is_FLOW_INDICATOR(ch) ||\n ch === 0x23/* # */ ||\n ch === 0x26/* & */ ||\n ch === 0x2A/* * */ ||\n ch === 0x21/* ! */ ||\n ch === 0x7C/* | */ ||\n ch === 0x3E/* > */ ||\n ch === 0x27/* ' */ ||\n ch === 0x22/* \" */ ||\n ch === 0x25/* % */ ||\n ch === 0x40/* @ */ ||\n ch === 0x60/* ` */) {\n return false;\n }\n\n if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n return false;\n }\n }\n\n state.kind = 'scalar';\n state.result = '';\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n\n while (ch !== 0) {\n if (ch === 0x3A/* : */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following) ||\n withinFlowCollection && is_FLOW_INDICATOR(following)) {\n break;\n }\n\n } else if (ch === 0x23/* # */) {\n preceding = state.input.charCodeAt(state.position - 1);\n\n if (is_WS_OR_EOL(preceding)) {\n break;\n }\n\n } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n break;\n\n } else if (is_EOL(ch)) {\n _line = state.line;\n _lineStart = state.lineStart;\n _lineIndent = state.lineIndent;\n skipSeparationSpace(state, false, -1);\n\n if (state.lineIndent >= nodeIndent) {\n hasPendingContent = true;\n ch = state.input.charCodeAt(state.position);\n continue;\n } else {\n state.position = captureEnd;\n state.line = _line;\n state.lineStart = _lineStart;\n state.lineIndent = _lineIndent;\n break;\n }\n }\n\n if (hasPendingContent) {\n captureSegment(state, captureStart, captureEnd, false);\n writeFoldedLines(state, state.line - _line);\n captureStart = captureEnd = state.position;\n hasPendingContent = false;\n }\n\n if (!is_WHITE_SPACE(ch)) {\n captureEnd = state.position + 1;\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, captureEnd, false);\n\n if (state.result) {\n return true;\n }\n\n state.kind = _kind;\n state.result = _result;\n return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n var ch,\n captureStart, captureEnd;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x27/* ' */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x27/* ' */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x27/* ' */) {\n captureStart = state.position;\n state.position++;\n captureEnd = state.position;\n } else {\n return true;\n }\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n var captureStart,\n captureEnd,\n hexLength,\n hexResult,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x22/* \" */) {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n state.position++;\n captureStart = captureEnd = state.position;\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n if (ch === 0x22/* \" */) {\n captureSegment(state, captureStart, state.position, true);\n state.position++;\n return true;\n\n } else if (ch === 0x5C/* \\ */) {\n captureSegment(state, captureStart, state.position, true);\n ch = state.input.charCodeAt(++state.position);\n\n if (is_EOL(ch)) {\n skipSeparationSpace(state, false, nodeIndent);\n\n // TODO: rework to inline fn with no type cast?\n } else if (ch < 256 && simpleEscapeCheck[ch]) {\n state.result += simpleEscapeMap[ch];\n state.position++;\n\n } else if ((tmp = escapedHexLen(ch)) > 0) {\n hexLength = tmp;\n hexResult = 0;\n\n for (; hexLength > 0; hexLength--) {\n ch = state.input.charCodeAt(++state.position);\n\n if ((tmp = fromHexCode(ch)) >= 0) {\n hexResult = (hexResult << 4) + tmp;\n\n } else {\n throwError(state, 'expected hexadecimal character');\n }\n }\n\n state.result += charFromCodepoint(hexResult);\n\n state.position++;\n\n } else {\n throwError(state, 'unknown escape sequence');\n }\n\n captureStart = captureEnd = state.position;\n\n } else if (is_EOL(ch)) {\n captureSegment(state, captureStart, captureEnd, true);\n writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n captureStart = captureEnd = state.position;\n\n } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n } else {\n state.position++;\n captureEnd = state.position;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n var readNext = true,\n _line,\n _lineStart,\n _pos,\n _tag = state.tag,\n _result,\n _anchor = state.anchor,\n following,\n terminator,\n isPair,\n isExplicitPair,\n isMapping,\n overridableKeys = Object.create(null),\n keyNode,\n keyTag,\n valueNode,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x5B/* [ */) {\n terminator = 0x5D;/* ] */\n isMapping = false;\n _result = [];\n } else if (ch === 0x7B/* { */) {\n terminator = 0x7D;/* } */\n isMapping = true;\n _result = {};\n } else {\n return false;\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n while (ch !== 0) {\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === terminator) {\n state.position++;\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = isMapping ? 'mapping' : 'sequence';\n state.result = _result;\n return true;\n } else if (!readNext) {\n throwError(state, 'missed comma between flow collection entries');\n } else if (ch === 0x2C/* , */) {\n // \"flow collection entries can never be completely empty\", as per YAML 1.2, section 7.4\n throwError(state, \"expected the node content, but found ','\");\n }\n\n keyTag = keyNode = valueNode = null;\n isPair = isExplicitPair = false;\n\n if (ch === 0x3F/* ? */) {\n following = state.input.charCodeAt(state.position + 1);\n\n if (is_WS_OR_EOL(following)) {\n isPair = isExplicitPair = true;\n state.position++;\n skipSeparationSpace(state, true, nodeIndent);\n }\n }\n\n _line = state.line; // Save the current line.\n _lineStart = state.lineStart;\n _pos = state.position;\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n keyTag = state.tag;\n keyNode = state.result;\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n isPair = true;\n ch = state.input.charCodeAt(++state.position);\n skipSeparationSpace(state, true, nodeIndent);\n composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n valueNode = state.result;\n }\n\n if (isMapping) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);\n } else if (isPair) {\n _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));\n } else {\n _result.push(keyNode);\n }\n\n skipSeparationSpace(state, true, nodeIndent);\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x2C/* , */) {\n readNext = true;\n ch = state.input.charCodeAt(++state.position);\n } else {\n readNext = false;\n }\n }\n\n throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n var captureStart,\n folding,\n chomping = CHOMPING_CLIP,\n didReadContent = false,\n detectedIndent = false,\n textIndent = nodeIndent,\n emptyLines = 0,\n atMoreIndented = false,\n tmp,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch === 0x7C/* | */) {\n folding = false;\n } else if (ch === 0x3E/* > */) {\n folding = true;\n } else {\n return false;\n }\n\n state.kind = 'scalar';\n state.result = '';\n\n while (ch !== 0) {\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n if (CHOMPING_CLIP === chomping) {\n chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n } else {\n throwError(state, 'repeat of a chomping mode identifier');\n }\n\n } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n if (tmp === 0) {\n throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n } else if (!detectedIndent) {\n textIndent = nodeIndent + tmp - 1;\n detectedIndent = true;\n } else {\n throwError(state, 'repeat of an indentation width identifier');\n }\n\n } else {\n break;\n }\n }\n\n if (is_WHITE_SPACE(ch)) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (is_WHITE_SPACE(ch));\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (!is_EOL(ch) && (ch !== 0));\n }\n }\n\n while (ch !== 0) {\n readLineBreak(state);\n state.lineIndent = 0;\n\n ch = state.input.charCodeAt(state.position);\n\n while ((!detectedIndent || state.lineIndent < textIndent) &&\n (ch === 0x20/* Space */)) {\n state.lineIndent++;\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (!detectedIndent && state.lineIndent > textIndent) {\n textIndent = state.lineIndent;\n }\n\n if (is_EOL(ch)) {\n emptyLines++;\n continue;\n }\n\n // End of the scalar.\n if (state.lineIndent < textIndent) {\n\n // Perform the chomping.\n if (chomping === CHOMPING_KEEP) {\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n } else if (chomping === CHOMPING_CLIP) {\n if (didReadContent) { // i.e. only if the scalar is not empty.\n state.result += '\\n';\n }\n }\n\n // Break this `while` cycle and go to the funciton's epilogue.\n break;\n }\n\n // Folded style: use fancy rules to handle line breaks.\n if (folding) {\n\n // Lines starting with white space characters (more-indented lines) are not folded.\n if (is_WHITE_SPACE(ch)) {\n atMoreIndented = true;\n // except for the first content line (cf. Example 8.1)\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n // End of more-indented block.\n } else if (atMoreIndented) {\n atMoreIndented = false;\n state.result += common.repeat('\\n', emptyLines + 1);\n\n // Just one line break - perceive as the same line.\n } else if (emptyLines === 0) {\n if (didReadContent) { // i.e. only if we have already read some scalar content.\n state.result += ' ';\n }\n\n // Several line breaks - perceive as different lines.\n } else {\n state.result += common.repeat('\\n', emptyLines);\n }\n\n // Literal style: just add exact number of line breaks between content lines.\n } else {\n // Keep all line breaks except the header line break.\n state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n }\n\n didReadContent = true;\n detectedIndent = true;\n emptyLines = 0;\n captureStart = state.position;\n\n while (!is_EOL(ch) && (ch !== 0)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n captureSegment(state, captureStart, state.position, false);\n }\n\n return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n var _line,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = [],\n following,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n if (ch !== 0x2D/* - */) {\n break;\n }\n\n following = state.input.charCodeAt(state.position + 1);\n\n if (!is_WS_OR_EOL(following)) {\n break;\n }\n\n detected = true;\n state.position++;\n\n if (skipSeparationSpace(state, true, -1)) {\n if (state.lineIndent <= nodeIndent) {\n _result.push(null);\n ch = state.input.charCodeAt(state.position);\n continue;\n }\n }\n\n _line = state.line;\n composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n _result.push(state.result);\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a sequence entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'sequence';\n state.result = _result;\n return true;\n }\n return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n var following,\n allowCompact,\n _line,\n _keyLine,\n _keyLineStart,\n _keyPos,\n _tag = state.tag,\n _anchor = state.anchor,\n _result = {},\n overridableKeys = Object.create(null),\n keyTag = null,\n keyNode = null,\n valueNode = null,\n atExplicitKey = false,\n detected = false,\n ch;\n\n // there is a leading tab before this token, so it can't be a block sequence/mapping;\n // it can still be flow sequence/mapping or a scalar\n if (state.firstTabInLine !== -1) return false;\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = _result;\n }\n\n ch = state.input.charCodeAt(state.position);\n\n while (ch !== 0) {\n if (!atExplicitKey && state.firstTabInLine !== -1) {\n state.position = state.firstTabInLine;\n throwError(state, 'tab characters must not be used in indentation');\n }\n\n following = state.input.charCodeAt(state.position + 1);\n _line = state.line; // Save the current line.\n\n //\n // Explicit notation case. There are two separate blocks:\n // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n //\n if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n if (ch === 0x3F/* ? */) {\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = true;\n allowCompact = true;\n\n } else if (atExplicitKey) {\n // i.e. 0x3A/* : */ === character after the explicit key.\n atExplicitKey = false;\n allowCompact = true;\n\n } else {\n throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n }\n\n state.position += 1;\n ch = following;\n\n //\n // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n //\n } else {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n\n if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n // Neither implicit nor explicit notation.\n // Reading is done. Go to the epilogue.\n break;\n }\n\n if (state.line === _line) {\n ch = state.input.charCodeAt(state.position);\n\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x3A/* : */) {\n ch = state.input.charCodeAt(++state.position);\n\n if (!is_WS_OR_EOL(ch)) {\n throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n }\n\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n detected = true;\n atExplicitKey = false;\n allowCompact = false;\n keyTag = state.tag;\n keyNode = state.result;\n\n } else if (detected) {\n throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n\n } else if (detected) {\n throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n } else {\n state.tag = _tag;\n state.anchor = _anchor;\n return true; // Keep the result of `composeNode`.\n }\n }\n\n //\n // Common reading code for both explicit and implicit notations.\n //\n if (state.line === _line || state.lineIndent > nodeIndent) {\n if (atExplicitKey) {\n _keyLine = state.line;\n _keyLineStart = state.lineStart;\n _keyPos = state.position;\n }\n\n if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n if (atExplicitKey) {\n keyNode = state.result;\n } else {\n valueNode = state.result;\n }\n }\n\n if (!atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);\n keyTag = keyNode = valueNode = null;\n }\n\n skipSeparationSpace(state, true, -1);\n ch = state.input.charCodeAt(state.position);\n }\n\n if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n throwError(state, 'bad indentation of a mapping entry');\n } else if (state.lineIndent < nodeIndent) {\n break;\n }\n }\n\n //\n // Epilogue.\n //\n\n // Special case: last mapping's node contains only the key in explicit notation.\n if (atExplicitKey) {\n storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);\n }\n\n // Expose the resulting mapping.\n if (detected) {\n state.tag = _tag;\n state.anchor = _anchor;\n state.kind = 'mapping';\n state.result = _result;\n }\n\n return detected;\n}\n\nfunction readTagProperty(state) {\n var _position,\n isVerbatim = false,\n isNamed = false,\n tagHandle,\n tagName,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x21/* ! */) return false;\n\n if (state.tag !== null) {\n throwError(state, 'duplication of a tag property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n\n if (ch === 0x3C/* < */) {\n isVerbatim = true;\n ch = state.input.charCodeAt(++state.position);\n\n } else if (ch === 0x21/* ! */) {\n isNamed = true;\n tagHandle = '!!';\n ch = state.input.charCodeAt(++state.position);\n\n } else {\n tagHandle = '!';\n }\n\n _position = state.position;\n\n if (isVerbatim) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && ch !== 0x3E/* > */);\n\n if (state.position < state.length) {\n tagName = state.input.slice(_position, state.position);\n ch = state.input.charCodeAt(++state.position);\n } else {\n throwError(state, 'unexpected end of the stream within a verbatim tag');\n }\n } else {\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n if (ch === 0x21/* ! */) {\n if (!isNamed) {\n tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n throwError(state, 'named tag handle cannot contain such characters');\n }\n\n isNamed = true;\n _position = state.position + 1;\n } else {\n throwError(state, 'tag suffix cannot contain exclamation marks');\n }\n }\n\n ch = state.input.charCodeAt(++state.position);\n }\n\n tagName = state.input.slice(_position, state.position);\n\n if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n throwError(state, 'tag suffix cannot contain flow indicator characters');\n }\n }\n\n if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n throwError(state, 'tag name cannot contain such characters: ' + tagName);\n }\n\n try {\n tagName = decodeURIComponent(tagName);\n } catch (err) {\n throwError(state, 'tag name is malformed: ' + tagName);\n }\n\n if (isVerbatim) {\n state.tag = tagName;\n\n } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {\n state.tag = state.tagMap[tagHandle] + tagName;\n\n } else if (tagHandle === '!') {\n state.tag = '!' + tagName;\n\n } else if (tagHandle === '!!') {\n state.tag = 'tag:yaml.org,2002:' + tagName;\n\n } else {\n throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n }\n\n return true;\n}\n\nfunction readAnchorProperty(state) {\n var _position,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x26/* & */) return false;\n\n if (state.anchor !== null) {\n throwError(state, 'duplication of an anchor property');\n }\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an anchor node must contain at least one character');\n }\n\n state.anchor = state.input.slice(_position, state.position);\n return true;\n}\n\nfunction readAlias(state) {\n var _position, alias,\n ch;\n\n ch = state.input.charCodeAt(state.position);\n\n if (ch !== 0x2A/* * */) return false;\n\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (state.position === _position) {\n throwError(state, 'name of an alias node must contain at least one character');\n }\n\n alias = state.input.slice(_position, state.position);\n\n if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {\n throwError(state, 'unidentified alias \"' + alias + '\"');\n }\n\n state.result = state.anchorMap[alias];\n skipSeparationSpace(state, true, -1);\n return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n var allowBlockStyles,\n allowBlockScalars,\n allowBlockCollections,\n indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n }\n }\n\n if (indentStatus === 1) {\n while (readTagProperty(state) || readAnchorProperty(state)) {\n if (skipSeparationSpace(state, true, -1)) {\n atNewLine = true;\n allowBlockCollections = allowBlockStyles;\n\n if (state.lineIndent > parentIndent) {\n indentStatus = 1;\n } else if (state.lineIndent === parentIndent) {\n indentStatus = 0;\n } else if (state.lineIndent < parentIndent) {\n indentStatus = -1;\n }\n } else {\n allowBlockCollections = false;\n }\n }\n }\n\n if (allowBlockCollections) {\n allowBlockCollections = atNewLine || allowCompact;\n }\n\n if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n flowIndent = parentIndent;\n } else {\n flowIndent = parentIndent + 1;\n }\n\n blockIndent = state.position - state.lineStart;\n\n if (indentStatus === 1) {\n if (allowBlockCollections &&\n (readBlockSequence(state, blockIndent) ||\n readBlockMapping(state, blockIndent, flowIndent)) ||\n readFlowCollection(state, flowIndent)) {\n hasContent = true;\n } else {\n if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n readSingleQuotedScalar(state, flowIndent) ||\n readDoubleQuotedScalar(state, flowIndent)) {\n hasContent = true;\n\n } else if (readAlias(state)) {\n hasContent = true;\n\n if (state.tag !== null || state.anchor !== null) {\n throwError(state, 'alias node should not have any properties');\n }\n\n } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n hasContent = true;\n\n if (state.tag === null) {\n state.tag = '?';\n }\n }\n\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n } else if (indentStatus === 0) {\n // Special case: block sequences are allowed to have same indentation level as the parent.\n // http://www.yaml.org/spec/1.2/spec.html#id2799784\n hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n }\n }\n\n if (state.tag === null) {\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n\n } else if (state.tag === '?') {\n // Implicit resolving is not allowed for non-scalar types, and '?'\n // non-specific tag is only automatically assigned to plain scalars.\n //\n // We only need to check kind conformity in case user explicitly assigns '?'\n // tag, for example like this: \"! [0]\"\n //\n if (state.result !== null && state.kind !== 'scalar') {\n throwError(state, 'unacceptable node kind for ! tag; it should be \"scalar\", not \"' + state.kind + '\"');\n }\n\n for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n type = state.implicitTypes[typeIndex];\n\n if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n state.result = type.construct(state.result);\n state.tag = type.tag;\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n break;\n }\n }\n } else if (state.tag !== '!') {\n if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n type = state.typeMap[state.kind || 'fallback'][state.tag];\n } else {\n // looking for multi type\n type = null;\n typeList = state.typeMap.multi[state.kind || 'fallback'];\n\n for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {\n if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {\n type = typeList[typeIndex];\n break;\n }\n }\n }\n\n if (!type) {\n throwError(state, 'unknown tag !<' + state.tag + '>');\n }\n\n if (state.result !== null && type.kind !== state.kind) {\n throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n }\n\n if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched\n throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n } else {\n state.result = type.construct(state.result, state.tag);\n if (state.anchor !== null) {\n state.anchorMap[state.anchor] = state.result;\n }\n }\n }\n\n if (state.listener !== null) {\n state.listener('close', state);\n }\n return state.tag !== null || state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n var documentStart = state.position,\n _position,\n directiveName,\n directiveArgs,\n hasDirectives = false,\n ch;\n\n state.version = null;\n state.checkLineBreaks = state.legacy;\n state.tagMap = Object.create(null);\n state.anchorMap = Object.create(null);\n\n while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n skipSeparationSpace(state, true, -1);\n\n ch = state.input.charCodeAt(state.position);\n\n if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n break;\n }\n\n hasDirectives = true;\n ch = state.input.charCodeAt(++state.position);\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveName = state.input.slice(_position, state.position);\n directiveArgs = [];\n\n if (directiveName.length < 1) {\n throwError(state, 'directive name must not be less than one character in length');\n }\n\n while (ch !== 0) {\n while (is_WHITE_SPACE(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n if (ch === 0x23/* # */) {\n do { ch = state.input.charCodeAt(++state.position); }\n while (ch !== 0 && !is_EOL(ch));\n break;\n }\n\n if (is_EOL(ch)) break;\n\n _position = state.position;\n\n while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n ch = state.input.charCodeAt(++state.position);\n }\n\n directiveArgs.push(state.input.slice(_position, state.position));\n }\n\n if (ch !== 0) readLineBreak(state);\n\n if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {\n directiveHandlers[directiveName](state, directiveName, directiveArgs);\n } else {\n throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n }\n }\n\n skipSeparationSpace(state, true, -1);\n\n if (state.lineIndent === 0 &&\n state.input.charCodeAt(state.position) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n\n } else if (hasDirectives) {\n throwError(state, 'directives end mark is expected');\n }\n\n composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n skipSeparationSpace(state, true, -1);\n\n if (state.checkLineBreaks &&\n PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n }\n\n state.documents.push(state.result);\n\n if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n state.position += 3;\n skipSeparationSpace(state, true, -1);\n }\n return;\n }\n\n if (state.position < (state.length - 1)) {\n throwError(state, 'end of the stream or a document separator is expected');\n } else {\n return;\n }\n}\n\n\nfunction loadDocuments(input, options) {\n input = String(input);\n options = options || {};\n\n if (input.length !== 0) {\n\n // Add tailing `\\n` if not exists\n if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n input += '\\n';\n }\n\n // Strip BOM\n if (input.charCodeAt(0) === 0xFEFF) {\n input = input.slice(1);\n }\n }\n\n var state = new State$1(input, options);\n\n var nullpos = input.indexOf('\\0');\n\n if (nullpos !== -1) {\n state.position = nullpos;\n throwError(state, 'null byte is not allowed in input');\n }\n\n // Use 0 as string terminator. That significantly simplifies bounds check.\n state.input += '\\0';\n\n while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n state.lineIndent += 1;\n state.position += 1;\n }\n\n while (state.position < (state.length - 1)) {\n readDocument(state);\n }\n\n return state.documents;\n}\n\n\nfunction loadAll$1(input, iterator, options) {\n if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {\n options = iterator;\n iterator = null;\n }\n\n var documents = loadDocuments(input, options);\n\n if (typeof iterator !== 'function') {\n return documents;\n }\n\n for (var index = 0, length = documents.length; index < length; index += 1) {\n iterator(documents[index]);\n }\n}\n\n\nfunction load$1(input, options) {\n var documents = loadDocuments(input, options);\n\n if (documents.length === 0) {\n /*eslint-disable no-undefined*/\n return undefined;\n } else if (documents.length === 1) {\n return documents[0];\n }\n throw new exception('expected a single document in the stream, but found more');\n}\n\n\nvar loadAll_1 = loadAll$1;\nvar load_1 = load$1;\n\nvar loader = {\n\tloadAll: loadAll_1,\n\tload: load_1\n};\n\n/*eslint-disable no-use-before-define*/\n\n\n\n\n\nvar _toString = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_BOM = 0xFEFF;\nvar CHAR_TAB = 0x09; /* Tab */\nvar CHAR_LINE_FEED = 0x0A; /* LF */\nvar CHAR_CARRIAGE_RETURN = 0x0D; /* CR */\nvar CHAR_SPACE = 0x20; /* Space */\nvar CHAR_EXCLAMATION = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE = 0x22; /* \" */\nvar CHAR_SHARP = 0x23; /* # */\nvar CHAR_PERCENT = 0x25; /* % */\nvar CHAR_AMPERSAND = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE = 0x27; /* ' */\nvar CHAR_ASTERISK = 0x2A; /* * */\nvar CHAR_COMMA = 0x2C; /* , */\nvar CHAR_MINUS = 0x2D; /* - */\nvar CHAR_COLON = 0x3A; /* : */\nvar CHAR_EQUALS = 0x3D; /* = */\nvar CHAR_GREATER_THAN = 0x3E; /* > */\nvar CHAR_QUESTION = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00] = '\\\\0';\nESCAPE_SEQUENCES[0x07] = '\\\\a';\nESCAPE_SEQUENCES[0x08] = '\\\\b';\nESCAPE_SEQUENCES[0x09] = '\\\\t';\nESCAPE_SEQUENCES[0x0A] = '\\\\n';\nESCAPE_SEQUENCES[0x0B] = '\\\\v';\nESCAPE_SEQUENCES[0x0C] = '\\\\f';\nESCAPE_SEQUENCES[0x0D] = '\\\\r';\nESCAPE_SEQUENCES[0x1B] = '\\\\e';\nESCAPE_SEQUENCES[0x22] = '\\\\\"';\nESCAPE_SEQUENCES[0x5C] = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85] = '\\\\N';\nESCAPE_SEQUENCES[0xA0] = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n 'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n 'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nvar DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\\.[0-9_]*)?$/;\n\nfunction compileStyleMap(schema, map) {\n var result, keys, index, length, tag, style, type;\n\n if (map === null) return {};\n\n result = {};\n keys = Object.keys(map);\n\n for (index = 0, length = keys.length; index < length; index += 1) {\n tag = keys[index];\n style = String(map[tag]);\n\n if (tag.slice(0, 2) === '!!') {\n tag = 'tag:yaml.org,2002:' + tag.slice(2);\n }\n type = schema.compiledTypeMap['fallback'][tag];\n\n if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n style = type.styleAliases[style];\n }\n\n result[tag] = style;\n }\n\n return result;\n}\n\nfunction encodeHex(character) {\n var string, handle, length;\n\n string = character.toString(16).toUpperCase();\n\n if (character <= 0xFF) {\n handle = 'x';\n length = 2;\n } else if (character <= 0xFFFF) {\n handle = 'u';\n length = 4;\n } else if (character <= 0xFFFFFFFF) {\n handle = 'U';\n length = 8;\n } else {\n throw new exception('code point within a string may not be greater than 0xFFFFFFFF');\n }\n\n return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\n\nvar QUOTING_TYPE_SINGLE = 1,\n QUOTING_TYPE_DOUBLE = 2;\n\nfunction State(options) {\n this.schema = options['schema'] || _default;\n this.indent = Math.max(1, (options['indent'] || 2));\n this.noArrayIndent = options['noArrayIndent'] || false;\n this.skipInvalid = options['skipInvalid'] || false;\n this.flowLevel = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n this.styleMap = compileStyleMap(this.schema, options['styles'] || null);\n this.sortKeys = options['sortKeys'] || false;\n this.lineWidth = options['lineWidth'] || 80;\n this.noRefs = options['noRefs'] || false;\n this.noCompatMode = options['noCompatMode'] || false;\n this.condenseFlow = options['condenseFlow'] || false;\n this.quotingType = options['quotingType'] === '\"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;\n this.forceQuotes = options['forceQuotes'] || false;\n this.replacer = typeof options['replacer'] === 'function' ? options['replacer'] : null;\n\n this.implicitTypes = this.schema.compiledImplicit;\n this.explicitTypes = this.schema.compiledExplicit;\n\n this.tag = null;\n this.result = '';\n\n this.duplicates = [];\n this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n var ind = common.repeat(' ', spaces),\n position = 0,\n next = -1,\n result = '',\n line,\n length = string.length;\n\n while (position < length) {\n next = string.indexOf('\\n', position);\n if (next === -1) {\n line = string.slice(position);\n position = length;\n } else {\n line = string.slice(position, next + 1);\n position = next + 1;\n }\n\n if (line.length && line !== '\\n') result += ind;\n\n result += line;\n }\n\n return result;\n}\n\nfunction generateNextLine(state, level) {\n return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n var index, length, type;\n\n for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n type = state.implicitTypes[index];\n\n if (type.resolve(str)) {\n return true;\n }\n }\n\n return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn\u2019t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n return (0x00020 <= c && c <= 0x00007E)\n || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)\n || (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// [34] ns-char ::= nb-char - s-white\n// [27] nb-char ::= c-printable - b-char - c-byte-order-mark\n// [26] b-char ::= b-line-feed | b-carriage-return\n// Including s-white (for some reason, examples doesn't match specs in this aspect)\n// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark\nfunction isNsCharOrWhitespace(c) {\n return isPrintable(c)\n && c !== CHAR_BOM\n // - b-char\n && c !== CHAR_CARRIAGE_RETURN\n && c !== CHAR_LINE_FEED;\n}\n\n// [127] ns-plain-safe(c) ::= c = flow-out \u21D2 ns-plain-safe-out\n// c = flow-in \u21D2 ns-plain-safe-in\n// c = block-key \u21D2 ns-plain-safe-out\n// c = flow-key \u21D2 ns-plain-safe-in\n// [128] ns-plain-safe-out ::= ns-char\n// [129] ns-plain-safe-in ::= ns-char - c-flow-indicator\n// [130] ns-plain-char(c) ::= ( ns-plain-safe(c) - \u201C:\u201D - \u201C#\u201D )\n// | ( /* An ns-char preceding */ \u201C#\u201D )\n// | ( \u201C:\u201D /* Followed by an ns-plain-safe(c) */ )\nfunction isPlainSafe(c, prev, inblock) {\n var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);\n var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);\n return (\n // ns-plain-safe\n inblock ? // c = flow-in\n cIsNsCharOrWhitespace\n : cIsNsCharOrWhitespace\n // - c-flow-indicator\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n )\n // ns-plain-char\n && c !== CHAR_SHARP // false on '#'\n && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '\n || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'\n || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n // Uses a subset of ns-char - c-indicator\n // where ns-char = nb-char - s-white.\n // No support of ( ( \u201C?\u201D | \u201C:\u201D | \u201C-\u201D ) /* Followed by an ns-plain-safe(c)) */ ) part\n return isPrintable(c) && c !== CHAR_BOM\n && !isWhitespace(c) // - s-white\n // - (c-indicator ::=\n // \u201C-\u201D | \u201C?\u201D | \u201C:\u201D | \u201C,\u201D | \u201C[\u201D | \u201C]\u201D | \u201C{\u201D | \u201C}\u201D\n && c !== CHAR_MINUS\n && c !== CHAR_QUESTION\n && c !== CHAR_COLON\n && c !== CHAR_COMMA\n && c !== CHAR_LEFT_SQUARE_BRACKET\n && c !== CHAR_RIGHT_SQUARE_BRACKET\n && c !== CHAR_LEFT_CURLY_BRACKET\n && c !== CHAR_RIGHT_CURLY_BRACKET\n // | \u201C#\u201D | \u201C&\u201D | \u201C*\u201D | \u201C!\u201D | \u201C|\u201D | \u201C=\u201D | \u201C>\u201D | \u201C'\u201D | \u201C\"\u201D\n && c !== CHAR_SHARP\n && c !== CHAR_AMPERSAND\n && c !== CHAR_ASTERISK\n && c !== CHAR_EXCLAMATION\n && c !== CHAR_VERTICAL_LINE\n && c !== CHAR_EQUALS\n && c !== CHAR_GREATER_THAN\n && c !== CHAR_SINGLE_QUOTE\n && c !== CHAR_DOUBLE_QUOTE\n // | \u201C%\u201D | \u201C@\u201D | \u201C`\u201D)\n && c !== CHAR_PERCENT\n && c !== CHAR_COMMERCIAL_AT\n && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Simplified test for values allowed as the last character in plain style.\nfunction isPlainSafeLast(c) {\n // just not whitespace or colon, it will be checked to be plain character later\n return !isWhitespace(c) && c !== CHAR_COLON;\n}\n\n// Same as 'string'.codePointAt(pos), but works in older browsers.\nfunction codePointAt(string, pos) {\n var first = string.charCodeAt(pos), second;\n if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {\n second = string.charCodeAt(pos + 1);\n if (second >= 0xDC00 && second <= 0xDFFF) {\n // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n }\n }\n return first;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n var leadingSpaceRe = /^\\n* /;\n return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN = 1,\n STYLE_SINGLE = 2,\n STYLE_LITERAL = 3,\n STYLE_FOLDED = 4,\n STYLE_DOUBLE = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n// STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n// STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n// STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,\n testAmbiguousType, quotingType, forceQuotes, inblock) {\n\n var i;\n var char = 0;\n var prevChar = null;\n var hasLineBreak = false;\n var hasFoldableLine = false; // only checked if shouldTrackWidth\n var shouldTrackWidth = lineWidth !== -1;\n var previousLineBreak = -1; // count the first line correctly\n var plain = isPlainSafeFirst(codePointAt(string, 0))\n && isPlainSafeLast(codePointAt(string, string.length - 1));\n\n if (singleLineOnly || forceQuotes) {\n // Case: no block styles.\n // Check for disallowed characters to rule out plain and single.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n } else {\n // Case: block styles permitted.\n for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n if (char === CHAR_LINE_FEED) {\n hasLineBreak = true;\n // Check if any line can be folded.\n if (shouldTrackWidth) {\n hasFoldableLine = hasFoldableLine ||\n // Foldable line = too long, and not more-indented.\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' ');\n previousLineBreak = i;\n }\n } else if (!isPrintable(char)) {\n return STYLE_DOUBLE;\n }\n plain = plain && isPlainSafe(char, prevChar, inblock);\n prevChar = char;\n }\n // in case the end is missing a \\n\n hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n (i - previousLineBreak - 1 > lineWidth &&\n string[previousLineBreak + 1] !== ' '));\n }\n // Although every style can represent \\n without escaping, prefer block styles\n // for multiline, since they're more readable and they don't add empty lines.\n // Also prefer folding a super-long line.\n if (!hasLineBreak && !hasFoldableLine) {\n // Strings interpretable as another type have to be quoted;\n // e.g. the string 'true' vs. the boolean true.\n if (plain && !forceQuotes && !testAmbiguousType(string)) {\n return STYLE_PLAIN;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n }\n // Edge case: block indentation indicator can only have one digit.\n if (indentPerLevel > 9 && needIndentIndicator(string)) {\n return STYLE_DOUBLE;\n }\n // At this point we know block styles are valid.\n // Prefer literal style unless we want to fold.\n if (!forceQuotes) {\n return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n }\n return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n// since the dumper adds its own newline. This always works:\n// \u2022 No ending newline => unaffected; already using strip \"-\" chomping.\n// \u2022 Ending newline => removed then restored.\n// Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey, inblock) {\n state.dump = (function () {\n if (string.length === 0) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? '\"\"' : \"''\";\n }\n if (!state.noCompatMode) {\n if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {\n return state.quotingType === QUOTING_TYPE_DOUBLE ? ('\"' + string + '\"') : (\"'\" + string + \"'\");\n }\n }\n\n var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n // As indentation gets deeper, let the width decrease monotonically\n // to the lower bound min(state.lineWidth, 40).\n // Note that this implies\n // state.lineWidth \u2264 40 + state.indent: width is fixed at the lower bound.\n // state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n // This behaves better than a constant minimum width which disallows narrower options,\n // or an indent threshold which causes the width to suddenly increase.\n var lineWidth = state.lineWidth === -1\n ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n // Without knowing if keys are implicit/explicit, assume implicit for safety.\n var singleLineOnly = iskey\n // No block styles in flow mode.\n || (state.flowLevel > -1 && level >= state.flowLevel);\n function testAmbiguity(string) {\n return testImplicitResolving(state, string);\n }\n\n switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,\n testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {\n\n case STYLE_PLAIN:\n return string;\n case STYLE_SINGLE:\n return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n case STYLE_LITERAL:\n return '|' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(string, indent));\n case STYLE_FOLDED:\n return '>' + blockHeader(string, state.indent)\n + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n case STYLE_DOUBLE:\n return '\"' + escapeString(string) + '\"';\n default:\n throw new exception('impossible error: invalid scalar style');\n }\n }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n var clip = string[string.length - 1] === '\\n';\n var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n var chomp = keep ? '+' : (clip ? '' : '-');\n\n return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n // In folded style, $k$ consecutive newlines output as $k+1$ newlines\u2014\n // unless they're before or after a more-indented line, or at the very\n // beginning or end, in which case $k$ maps to $k$.\n // Therefore, parse each chunk as newline(s) followed by a content line.\n var lineRe = /(\\n+)([^\\n]*)/g;\n\n // first line (possibly an empty line)\n var result = (function () {\n var nextLF = string.indexOf('\\n');\n nextLF = nextLF !== -1 ? nextLF : string.length;\n lineRe.lastIndex = nextLF;\n return foldLine(string.slice(0, nextLF), width);\n }());\n // If we haven't reached the first content line yet, don't add an extra \\n.\n var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n var moreIndented;\n\n // rest of the lines\n var match;\n while ((match = lineRe.exec(string))) {\n var prefix = match[1], line = match[2];\n moreIndented = (line[0] === ' ');\n result += prefix\n + (!prevMoreIndented && !moreIndented && line !== ''\n ? '\\n' : '')\n + foldLine(line, width);\n prevMoreIndented = moreIndented;\n }\n\n return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n if (line === '' || line[0] === ' ') return line;\n\n // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n var match;\n // start is an inclusive index. end, curr, and next are exclusive.\n var start = 0, end, curr = 0, next = 0;\n var result = '';\n\n // Invariants: 0 <= start <= length-1.\n // 0 <= curr <= next <= max(0, length-2). curr - start <= width.\n // Inside the loop:\n // A match implies length >= 2, so curr and next are <= length-2.\n while ((match = breakRe.exec(line))) {\n next = match.index;\n // maintain invariant: curr - start <= width\n if (next - start > width) {\n end = (curr > start) ? curr : next; // derive end <= length-2\n result += '\\n' + line.slice(start, end);\n // skip the space that was output as \\n\n start = end + 1; // derive start <= length-1\n }\n curr = next;\n }\n\n // By the invariants, start <= length-1, so there is something left over.\n // It is either the whole string or a part starting from non-whitespace.\n result += '\\n';\n // Insert a break if the remainder is too long and there is a break available.\n if (line.length - start > width && curr > start) {\n result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n } else {\n result += line.slice(start);\n }\n\n return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n var result = '';\n var char = 0;\n var escapeSeq;\n\n for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {\n char = codePointAt(string, i);\n escapeSeq = ESCAPE_SEQUENCES[char];\n\n if (!escapeSeq && isPrintable(char)) {\n result += string[i];\n if (char >= 0x10000) result += string[i + 1];\n } else {\n result += escapeSeq || encodeHex(char);\n }\n }\n\n return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level, value, false, false) ||\n (typeof value === 'undefined' &&\n writeNode(state, level, null, false, false))) {\n\n if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n index,\n length,\n value;\n\n for (index = 0, length = object.length; index < length; index += 1) {\n value = object[index];\n\n if (state.replacer) {\n value = state.replacer.call(object, String(index), value);\n }\n\n // Write only valid elements, put null instead of invalid elements.\n if (writeNode(state, level + 1, value, true, true, false, true) ||\n (typeof value === 'undefined' &&\n writeNode(state, level + 1, null, true, true, false, true))) {\n\n if (!compact || _result !== '') {\n _result += generateNextLine(state, level);\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n _result += '-';\n } else {\n _result += '- ';\n }\n\n _result += state.dump;\n }\n }\n\n state.tag = _tag;\n state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n pairBuffer;\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n\n pairBuffer = '';\n if (_result !== '') pairBuffer += ', ';\n\n if (state.condenseFlow) pairBuffer += '\"';\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level, objectKey, false, false)) {\n continue; // Skip this pair because of invalid key;\n }\n\n if (state.dump.length > 1024) pairBuffer += '? ';\n\n pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n if (!writeNode(state, level, objectValue, false, false)) {\n continue; // Skip this pair because of invalid value.\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n var _result = '',\n _tag = state.tag,\n objectKeyList = Object.keys(object),\n index,\n length,\n objectKey,\n objectValue,\n explicitPair,\n pairBuffer;\n\n // Allow sorting keys so that the output file is deterministic\n if (state.sortKeys === true) {\n // Default sorting\n objectKeyList.sort();\n } else if (typeof state.sortKeys === 'function') {\n // Custom sort function\n objectKeyList.sort(state.sortKeys);\n } else if (state.sortKeys) {\n // Something is wrong\n throw new exception('sortKeys must be a boolean or a function');\n }\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n pairBuffer = '';\n\n if (!compact || _result !== '') {\n pairBuffer += generateNextLine(state, level);\n }\n\n objectKey = objectKeyList[index];\n objectValue = object[objectKey];\n\n if (state.replacer) {\n objectValue = state.replacer.call(object, objectKey, objectValue);\n }\n\n if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n continue; // Skip this pair because of invalid key.\n }\n\n explicitPair = (state.tag !== null && state.tag !== '?') ||\n (state.dump && state.dump.length > 1024);\n\n if (explicitPair) {\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += '?';\n } else {\n pairBuffer += '? ';\n }\n }\n\n pairBuffer += state.dump;\n\n if (explicitPair) {\n pairBuffer += generateNextLine(state, level);\n }\n\n if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n continue; // Skip this pair because of invalid value.\n }\n\n if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n pairBuffer += ':';\n } else {\n pairBuffer += ': ';\n }\n\n pairBuffer += state.dump;\n\n // Both key and value are valid.\n _result += pairBuffer;\n }\n\n state.tag = _tag;\n state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n var _result, typeList, index, length, type, style;\n\n typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n for (index = 0, length = typeList.length; index < length; index += 1) {\n type = typeList[index];\n\n if ((type.instanceOf || type.predicate) &&\n (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n (!type.predicate || type.predicate(object))) {\n\n if (explicit) {\n if (type.multi && type.representName) {\n state.tag = type.representName(object);\n } else {\n state.tag = type.tag;\n }\n } else {\n state.tag = '?';\n }\n\n if (type.represent) {\n style = state.styleMap[type.tag] || type.defaultStyle;\n\n if (_toString.call(type.represent) === '[object Function]') {\n _result = type.represent(object, style);\n } else if (_hasOwnProperty.call(type.represent, style)) {\n _result = type.represent[style](object, style);\n } else {\n throw new exception('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n }\n\n state.dump = _result;\n }\n\n return true;\n }\n }\n\n return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey, isblockseq) {\n state.tag = null;\n state.dump = object;\n\n if (!detectType(state, object, false)) {\n detectType(state, object, true);\n }\n\n var type = _toString.call(state.dump);\n var inblock = block;\n var tagStr;\n\n if (block) {\n block = (state.flowLevel < 0 || state.flowLevel > level);\n }\n\n var objectOrArray = type === '[object Object]' || type === '[object Array]',\n duplicateIndex,\n duplicate;\n\n if (objectOrArray) {\n duplicateIndex = state.duplicates.indexOf(object);\n duplicate = duplicateIndex !== -1;\n }\n\n if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n compact = false;\n }\n\n if (duplicate && state.usedDuplicates[duplicateIndex]) {\n state.dump = '*ref_' + duplicateIndex;\n } else {\n if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n state.usedDuplicates[duplicateIndex] = true;\n }\n if (type === '[object Object]') {\n if (block && (Object.keys(state.dump).length !== 0)) {\n writeBlockMapping(state, level, state.dump, compact);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowMapping(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object Array]') {\n if (block && (state.dump.length !== 0)) {\n if (state.noArrayIndent && !isblockseq && level > 0) {\n writeBlockSequence(state, level - 1, state.dump, compact);\n } else {\n writeBlockSequence(state, level, state.dump, compact);\n }\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + state.dump;\n }\n } else {\n writeFlowSequence(state, level, state.dump);\n if (duplicate) {\n state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n }\n }\n } else if (type === '[object String]') {\n if (state.tag !== '?') {\n writeScalar(state, state.dump, level, iskey, inblock);\n }\n } else if (type === '[object Undefined]') {\n return false;\n } else {\n if (state.skipInvalid) return false;\n throw new exception('unacceptable kind of an object to dump ' + type);\n }\n\n if (state.tag !== null && state.tag !== '?') {\n // Need to encode all characters except those allowed by the spec:\n //\n // [35] ns-dec-digit ::= [#x30-#x39] /* 0-9 */\n // [36] ns-hex-digit ::= ns-dec-digit\n // | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */\n // [37] ns-ascii-letter ::= [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */\n // [38] ns-word-char ::= ns-dec-digit | ns-ascii-letter | \u201C-\u201D\n // [39] ns-uri-char ::= \u201C%\u201D ns-hex-digit ns-hex-digit | ns-word-char | \u201C#\u201D\n // | \u201C;\u201D | \u201C/\u201D | \u201C?\u201D | \u201C:\u201D | \u201C@\u201D | \u201C&\u201D | \u201C=\u201D | \u201C+\u201D | \u201C$\u201D | \u201C,\u201D\n // | \u201C_\u201D | \u201C.\u201D | \u201C!\u201D | \u201C~\u201D | \u201C*\u201D | \u201C'\u201D | \u201C(\u201D | \u201C)\u201D | \u201C[\u201D | \u201C]\u201D\n //\n // Also need to encode '!' because it has special meaning (end of tag prefix).\n //\n tagStr = encodeURI(\n state.tag[0] === '!' ? state.tag.slice(1) : state.tag\n ).replace(/!/g, '%21');\n\n if (state.tag[0] === '!') {\n tagStr = '!' + tagStr;\n } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {\n tagStr = '!!' + tagStr.slice(18);\n } else {\n tagStr = '!<' + tagStr + '>';\n }\n\n state.dump = tagStr + ' ' + state.dump;\n }\n }\n\n return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n var objects = [],\n duplicatesIndexes = [],\n index,\n length;\n\n inspectNode(object, objects, duplicatesIndexes);\n\n for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n state.duplicates.push(objects[duplicatesIndexes[index]]);\n }\n state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n var objectKeyList,\n index,\n length;\n\n if (object !== null && typeof object === 'object') {\n index = objects.indexOf(object);\n if (index !== -1) {\n if (duplicatesIndexes.indexOf(index) === -1) {\n duplicatesIndexes.push(index);\n }\n } else {\n objects.push(object);\n\n if (Array.isArray(object)) {\n for (index = 0, length = object.length; index < length; index += 1) {\n inspectNode(object[index], objects, duplicatesIndexes);\n }\n } else {\n objectKeyList = Object.keys(object);\n\n for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n }\n }\n }\n }\n}\n\nfunction dump$1(input, options) {\n options = options || {};\n\n var state = new State(options);\n\n if (!state.noRefs) getDuplicateReferences(input, state);\n\n var value = input;\n\n if (state.replacer) {\n value = state.replacer.call({ '': value }, '', value);\n }\n\n if (writeNode(state, 0, value, true, true)) return state.dump + '\\n';\n\n return '';\n}\n\nvar dump_1 = dump$1;\n\nvar dumper = {\n\tdump: dump_1\n};\n\nfunction renamed(from, to) {\n return function () {\n throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +\n 'Use yaml.' + to + ' instead, which is now safe by default.');\n };\n}\n\n\nvar Type = type;\nvar Schema = schema;\nvar FAILSAFE_SCHEMA = failsafe;\nvar JSON_SCHEMA = json;\nvar CORE_SCHEMA = core;\nvar DEFAULT_SCHEMA = _default;\nvar load = loader.load;\nvar loadAll = loader.loadAll;\nvar dump = dumper.dump;\nvar YAMLException = exception;\n\n// Re-export all types in case user wants to create custom schema\nvar types = {\n binary: binary,\n float: float,\n map: map,\n null: _null,\n pairs: pairs,\n set: set,\n timestamp: timestamp,\n bool: bool,\n int: int,\n merge: merge,\n omap: omap,\n seq: seq,\n str: str\n};\n\n// Removed functions from JS-YAML 3.0.x\nvar safeLoad = renamed('safeLoad', 'load');\nvar safeLoadAll = renamed('safeLoadAll', 'loadAll');\nvar safeDump = renamed('safeDump', 'dump');\n\nvar jsYaml = {\n\tType: Type,\n\tSchema: Schema,\n\tFAILSAFE_SCHEMA: FAILSAFE_SCHEMA,\n\tJSON_SCHEMA: JSON_SCHEMA,\n\tCORE_SCHEMA: CORE_SCHEMA,\n\tDEFAULT_SCHEMA: DEFAULT_SCHEMA,\n\tload: load,\n\tloadAll: loadAll,\n\tdump: dump,\n\tYAMLException: YAMLException,\n\ttypes: types,\n\tsafeLoad: safeLoad,\n\tsafeLoadAll: safeLoadAll,\n\tsafeDump: safeDump\n};\n\nexport { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, jsYaml as default, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };\n", "/**\n * CodeQL metadata resolver utilities\n * Handles resolution of query metadata using the CodeQL CLI\n */\n\nimport { executeCodeQLCommand } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * Query metadata structure returned by codeql resolve metadata\n */\nexport interface QueryMetadata {\n [key: string]: string | string[];\n}\n\n/**\n * Resolve metadata for a CodeQL query file\n * @param queryPath - Absolute or relative path to the .ql query file\n * @returns Parsed metadata object or null if resolution fails\n */\nexport async function resolveQueryMetadata(queryPath: string): Promise {\n try {\n logger.info(`Resolving metadata for query: ${queryPath}`);\n\n const result = await executeCodeQLCommand(\n 'resolve metadata',\n { format: 'json' },\n [queryPath]\n );\n\n if (!result.success) {\n logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error);\n return null;\n }\n\n // Parse the JSON output\n try {\n const metadata = JSON.parse(result.stdout);\n return metadata;\n } catch (parseError) {\n logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError);\n return null;\n }\n } catch (error) {\n logger.error(`Error resolving metadata for ${queryPath}:`, error);\n return null;\n }\n}\n", "/**\n * CodeQL generate log-summary tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateLogSummaryTool: CLIToolDefinition = {\n name: 'codeql_generate_log-summary',\n description: 'Create a summary of a structured JSON evaluator event log file',\n command: 'codeql',\n subcommand: 'generate log-summary',\n inputSchema: {\n inputLog: z.string().describe('Path to the evaluator log file to summarize'),\n outputFile: z.string().optional().describe('Path to write the summary (optional, defaults to stdout)'),\n format: z.enum(['text', 'predicates', 'overall']).optional()\n .describe('Output format: text (human-readable), predicates (JSON), or overall (stats)'),\n 'minify-output': z.boolean().optional().describe('Minify JSON output'),\n utc: z.boolean().optional().describe('Force UTC timestamps'),\n 'deduplicate-stage-summaries': z.boolean().optional().describe('Deduplicate stage summaries'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt',\n 'codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt',\n 'codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL generate query-help tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlGenerateQueryHelpTool: CLIToolDefinition = {\n name: 'codeql_generate_query-help',\n description: 'Generate query help documentation from QLDoc comments',\n command: 'codeql',\n subcommand: 'generate query-help',\n inputSchema: {\n query: z.string().describe('Path to the query file to generate help for'),\n outputFile: z.string().optional().describe('Path to write the help documentation'),\n format: z.enum(['markdown', 'text', 'html']).optional()\n .describe('Output format for the help documentation'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql generate query-help -- MyQuery.ql',\n 'codeql generate query-help --format=markdown -- MyQuery.ql help.md',\n 'codeql generate query-help --format=html -- MyQuery.ql help.html'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL Language Server Eval tool for MCP server\n * Provides real-time QL code validation through LSP communication\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { CodeQLLanguageServer, Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\n// Global language server instance for reuse across evaluations\nlet globalLanguageServer: CodeQLLanguageServer | null = null;\n\nexport interface LanguageServerEvalParams {\n qlCode: string;\n workspaceUri?: string;\n serverOptions?: LanguageServerOptions;\n}\n\nexport interface LanguageServerEvalResult {\n isValid: boolean;\n diagnostics: Diagnostic[];\n summary: {\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n };\n formattedOutput: string;\n}\n\n/**\n * Format diagnostics for human-readable output\n */\nfunction formatDiagnostics(diagnostics: Diagnostic[]): string {\n if (diagnostics.length === 0) {\n return '\u2705 No issues found in QL code';\n }\n\n const lines: string[] = [];\n lines.push(`Found ${diagnostics.length} issue(s):\\n`);\n\n diagnostics.forEach((diagnostic, index) => {\n const severityIcon = getSeverityIcon(diagnostic.severity);\n const severityName = getSeverityName(diagnostic.severity);\n const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`;\n \n lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`);\n lines.push(` ${diagnostic.message}`);\n if (diagnostic.source) {\n lines.push(` Source: ${diagnostic.source}`);\n }\n if (diagnostic.code) {\n lines.push(` Code: ${diagnostic.code}`);\n }\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n\nfunction getSeverityIcon(severity: number): string {\n switch (severity) {\n case 1: return '\u274C'; // Error\n case 2: return '\u26A0\uFE0F'; // Warning\n case 3: return '\u2139\uFE0F'; // Information\n case 4: return '\uD83D\uDCA1'; // Hint\n default: return '\u2753';\n }\n}\n\nfunction getSeverityName(severity: number): string {\n switch (severity) {\n case 1: return 'Error';\n case 2: return 'Warning';\n case 3: return 'Information';\n case 4: return 'Hint';\n default: return 'Unknown';\n }\n}\n\n/**\n * Initialize or get existing language server instance\n */\nasync function getLanguageServer(options: LanguageServerOptions = {}): Promise {\n if (globalLanguageServer && globalLanguageServer.isRunning()) {\n return globalLanguageServer;\n }\n\n // Set default options \u2014 use packageRootDir instead of process.cwd()\n // so the QL search path works regardless of where the server is launched.\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n const defaultOptions: LanguageServerOptions = {\n searchPath: resolve(pkgRoot, 'ql'),\n loglevel: 'WARN',\n ...options\n };\n\n globalLanguageServer = new CodeQLLanguageServer(defaultOptions);\n \n try {\n await globalLanguageServer.start();\n \n // Use provided workspace URI or default to ql directory under package root\n const workspaceUri = pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await globalLanguageServer.initialize(workspaceUri);\n \n logger.info('CodeQL Language Server started and initialized successfully');\n return globalLanguageServer;\n } catch (error) {\n logger.error('Failed to start language server:', error);\n globalLanguageServer = null;\n throw error;\n }\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server\n */\nexport async function evaluateQLCode({\n qlCode,\n workspaceUri: _workspaceUri,\n serverOptions = {}\n}: LanguageServerEvalParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n \n const languageServer = await getLanguageServer(serverOptions);\n \n // Generate unique URI for this evaluation\n const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href;\n \n const diagnostics = await languageServer.evaluateQL(qlCode, evalUri);\n \n // Count diagnostics by severity\n const summary = {\n errorCount: diagnostics.filter(d => d.severity === 1).length,\n warningCount: diagnostics.filter(d => d.severity === 2).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n hintCount: diagnostics.filter(d => d.severity === 4).length\n };\n \n const isValid = summary.errorCount === 0;\n const formattedOutput = formatDiagnostics(diagnostics);\n \n logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`);\n \n return {\n isValid,\n diagnostics,\n summary,\n formattedOutput\n };\n \n } catch (error) {\n logger.error('Error evaluating QL code:', error);\n throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Shutdown the global language server\n */\nexport async function shutdownLanguageServer(): Promise {\n if (globalLanguageServer) {\n logger.info('Shutting down CodeQL Language Server...');\n await globalLanguageServer.shutdown();\n globalLanguageServer = null;\n }\n}\n\n/**\n * Register the language server eval tool with the MCP server\n */\nexport function registerLanguageServerEvalTool(server: McpServer): void {\n server.tool(\n 'codeql_language_server_eval',\n 'Authoritative syntax and semantic validation of CodeQL (QL) code via the CodeQL Language Server. Compiles the query and provides real-time diagnostics with precise error locations. Use this for accurate validation; for quick heuristic checks without compilation, use validate_codeql_query instead.',\n {\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level')\n },\n async ({ ql_code, workspace_uri, search_path, log_level }) => {\n try {\n const serverOptions: LanguageServerOptions = {};\n \n if (search_path) {\n serverOptions.searchPath = search_path;\n }\n if (log_level) {\n serverOptions.loglevel = log_level;\n }\n \n const result = await evaluateQLCode({\n qlCode: ql_code,\n workspaceUri: workspace_uri,\n serverOptions\n });\n \n // Return structured result\n const responseContent = {\n isValid: result.isValid,\n summary: result.summary,\n formattedOutput: result.formattedOutput,\n diagnostics: result.diagnostics.map(d => ({\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n severity: getSeverityName(d.severity),\n message: d.message,\n code: d.code,\n source: d.source\n }))\n };\n \n return {\n content: [\n { \n type: 'text', \n text: JSON.stringify(responseContent, null, 2) \n }\n ],\n };\n \n } catch (error) {\n logger.error('Error in language server eval tool:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n \n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownLanguageServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownLanguageServer();\n });\n}", "/**\n * CodeQL Language Server manager for LSP communication\n * Manages the lifecycle and communication with the CodeQL language server process\n */\n\nimport { spawn, ChildProcess } from 'child_process';\nimport { EventEmitter } from 'events';\nimport { setTimeout, clearTimeout } from 'timers';\nimport { pathToFileURL } from 'url';\nimport { delimiter, join } from 'path';\nimport { logger } from '../utils/logger';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\n\nexport interface LSPMessage {\n jsonrpc: '2.0';\n id?: number | string;\n method: string;\n params?: unknown;\n result?: unknown;\n error?: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport interface Diagnostic {\n range: {\n start: { line: number; character: number };\n end: { line: number; character: number };\n };\n severity: number; // 1=Error, 2=Warning, 3=Information, 4=Hint\n source?: string;\n message: string;\n code?: string | number;\n}\n\nexport interface PublishDiagnosticsParams {\n uri: string;\n diagnostics: Diagnostic[];\n}\n\nexport interface LanguageServerOptions {\n searchPath?: string;\n logdir?: string;\n loglevel?: 'OFF' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'ALL';\n synchronous?: boolean;\n verbosity?: 'errors' | 'warnings' | 'progress' | 'progress+' | 'progress++' | 'progress+++';\n}\n\nexport class CodeQLLanguageServer extends EventEmitter {\n private server: ChildProcess | null = null;\n private messageId = 1;\n private pendingResponses = new Map void; reject: (_error: Error) => void }>();\n private isInitialized = false;\n private messageBuffer = '';\n\n constructor(private _options: LanguageServerOptions = {}) {\n super();\n }\n\n async start(): Promise {\n if (this.server) {\n throw new Error('Language server is already running');\n }\n\n logger.info('Starting CodeQL Language Server...');\n\n const args = [\n 'execute', 'language-server',\n '--check-errors=ON_CHANGE'\n ];\n\n // Add optional arguments\n if (this._options.searchPath) {\n args.push(`--search-path=${this._options.searchPath}`);\n }\n if (this._options.logdir) {\n args.push(`--logdir=${this._options.logdir}`);\n }\n if (this._options.loglevel) {\n args.push(`--loglevel=${this._options.loglevel}`);\n }\n if (this._options.synchronous) {\n args.push('--synchronous');\n }\n if (this._options.verbosity) {\n args.push(`--verbosity=${this._options.verbosity}`);\n }\n\n // Build environment with CODEQL_PATH directory prepended to PATH\n // (mirrors the approach in cli-executor.ts getSafeEnvironment).\n const spawnEnv = { ...process.env };\n const codeqlDir = getResolvedCodeQLDir();\n if (codeqlDir && spawnEnv.PATH) {\n spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`;\n } else if (codeqlDir) {\n spawnEnv.PATH = codeqlDir;\n }\n\n this.server = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv\n });\n\n this.server.stderr?.on('data', (data) => {\n logger.debug('CodeQL LS stderr:', data.toString());\n });\n\n this.server.stdout?.on('data', (data) => {\n this.handleStdout(data);\n });\n\n this.server.on('error', (error) => {\n logger.error('CodeQL Language Server error:', error);\n this.emit('error', error);\n });\n\n this.server.on('exit', (code) => {\n logger.info('CodeQL Language Server exited with code:', code);\n this.server = null;\n this.isInitialized = false;\n this.emit('exit', code);\n });\n\n // Wait for server to be ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n private handleStdout(data: Buffer): void {\n this.messageBuffer += data.toString();\n \n let headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n while (headerEnd !== -1) {\n const header = this.messageBuffer.substring(0, headerEnd);\n const contentLengthMatch = header.match(/Content-Length: (\\d+)/);\n \n if (contentLengthMatch) {\n const contentLength = parseInt(contentLengthMatch[1]);\n const messageStart = headerEnd + 4;\n const messageEnd = messageStart + contentLength;\n \n if (this.messageBuffer.length >= messageEnd) {\n const messageContent = this.messageBuffer.substring(messageStart, messageEnd);\n this.messageBuffer = this.messageBuffer.substring(messageEnd);\n \n try {\n const message: LSPMessage = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse LSP message:', error, messageContent);\n }\n \n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid LSP header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: LSPMessage): void {\n logger.debug('Received LSP message:', message);\n\n // Handle responses to our requests\n if (message.id !== undefined && this.pendingResponses.has(Number(message.id))) {\n const pending = this.pendingResponses.get(Number(message.id))!;\n this.pendingResponses.delete(Number(message.id));\n \n if (message.error) {\n pending.reject(new Error(`LSP Error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications from server\n if (message.method === 'textDocument/publishDiagnostics') {\n this.emit('diagnostics', message.params as PublishDiagnosticsParams);\n }\n }\n\n private sendMessage(message: LSPMessage): void {\n if (!this.server?.stdin) {\n throw new Error('Language server is not running');\n }\n\n const messageStr = JSON.stringify(message);\n const contentLength = Buffer.byteLength(messageStr, 'utf8');\n const header = `Content-Length: ${contentLength}\\r\\n\\r\\n`;\n const fullMessage = header + messageStr;\n\n logger.debug('Sending LSP message:', fullMessage);\n this.server.stdin.write(fullMessage);\n }\n\n private sendRequest(method: string, params?: unknown): Promise {\n const id = this.messageId++;\n const message: LSPMessage = {\n jsonrpc: '2.0',\n id,\n method,\n params\n };\n\n return new Promise((resolve, reject) => {\n this.pendingResponses.set(id, { resolve, reject });\n this.sendMessage(message);\n \n // Add timeout\n setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 10000); // 10 second timeout\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n const message: LSPMessage = {\n jsonrpc: '2.0',\n method,\n params\n };\n this.sendMessage(message);\n }\n\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n return;\n }\n\n logger.info('Initializing CodeQL Language Server...');\n\n const initParams = {\n processId: process.pid,\n clientInfo: {\n name: 'codeql-development-mcp-server',\n version: '2.23.9'\n },\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n didClose: true\n },\n publishDiagnostics: {}\n }\n }\n };\n\n if (workspaceUri) {\n (initParams as unknown as { workspaceFolders: unknown[] }).workspaceFolders = [{\n uri: workspaceUri,\n name: 'codeql-workspace'\n }];\n }\n\n await this.sendRequest('initialize', initParams);\n this.sendNotification('initialized', {});\n \n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n async evaluateQL(qlCode: string, uri?: string): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n\n // Default to a project-local virtual URI rather than /tmp\n const documentUri = uri || pathToFileURL(join(getProjectTmpDir('lsp-eval'), 'eval.ql')).href;\n\n return new Promise((resolve, reject) => {\n let diagnosticsReceived = false;\n const timeout = setTimeout(() => {\n if (!diagnosticsReceived) {\n this.removeAllListeners('diagnostics');\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 5000);\n\n // Listen for diagnostics\n const diagnosticsHandler = (params: PublishDiagnosticsParams) => {\n if (params.uri === documentUri) {\n diagnosticsReceived = true;\n clearTimeout(timeout);\n this.removeListener('diagnostics', diagnosticsHandler);\n\n // Close the document\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri: documentUri }\n });\n\n resolve(params.diagnostics);\n }\n };\n\n this.on('diagnostics', diagnosticsHandler);\n\n // Open the document with the QL code\n this.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri: documentUri,\n languageId: 'ql',\n version: 1,\n text: qlCode\n }\n });\n });\n }\n\n async shutdown(): Promise {\n if (!this.server) {\n return;\n }\n\n logger.info('Shutting down CodeQL Language Server...');\n\n try {\n await this.sendRequest('shutdown', {});\n this.sendNotification('exit', {});\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n }, 1000);\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL pack install tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackInstallTool: CLIToolDefinition = {\n name: 'codeql_pack_install',\n description: 'Install CodeQL pack dependencies',\n command: 'codeql',\n subcommand: 'pack install',\n inputSchema: {\n packDir: z.string().optional().describe('Directory containing qlpack.yml (default: current)'),\n force: z.boolean().optional().describe('Force reinstall of dependencies'),\n 'no-strict-mode': z.boolean().optional()\n .describe('Allow non-strict dependency resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack install',\n 'codeql pack install --force /path/to/pack',\n 'codeql pack install --no-strict-mode'\n ]\n};", "/**\n * CodeQL pack ls tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlPackLsTool: CLIToolDefinition = {\n name: 'codeql_pack_ls',\n description: 'List CodeQL packs under some local directory path',\n command: 'codeql',\n subcommand: 'pack ls',\n inputSchema: {\n dir: z.string().optional().describe('The root directory of the package or workspace, defaults to the current working directory'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format: text (default) or json'),\n groups: z.string().optional()\n .describe('List of CodeQL pack groups to include or exclude'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql pack ls -- .',\n 'codeql pack ls --format=json -- /path/to/pack-directory',\n 'codeql pack ls --format=json --groups=queries,tests -- .'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL query profiling tool\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { executeCodeQLCommand } from '../../lib/cli-executor';\nimport { logger } from '../../utils/logger';\nimport { writeFileSync, readFileSync, existsSync } from 'fs';\nimport { join, dirname, basename } from 'path';\nimport { mkdirSync } from 'fs';\n\ninterface EvaluatorLogEvent {\n time: string;\n type: string;\n eventId: number;\n nanoTime: number;\n [key: string]: unknown;\n}\n\ninterface PipelineNode {\n eventId: number;\n name: string;\n position?: string;\n type?: string;\n startTime: number;\n endTime: number;\n duration: number;\n resultSize?: number;\n tupleCount?: number;\n dependencies: string[];\n dependencyEventIds: number[];\n}\n\ninterface ProfileData {\n queryName: string;\n totalDuration: number;\n totalEvents: number;\n pipelines: PipelineNode[];\n}\n\n/**\n * Parse evaluator log and create profile data\n */\nfunction parseEvaluatorLog(logPath: string): ProfileData {\n const logContent = readFileSync(logPath, 'utf-8');\n \n // Split by empty lines to get each JSON object (handles both JSONL and pretty-printed JSON)\n const jsonObjects = logContent.split('\\n\\n').filter((s) => s.trim());\n const events: EvaluatorLogEvent[] = jsonObjects\n .map((obj) => {\n try {\n return JSON.parse(obj);\n } catch (_error) {\n logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`);\n return null;\n }\n })\n .filter((event): event is EvaluatorLogEvent => event !== null);\n\n // Map to track pipeline nodes by their start event ID\n const pipelineMap = new Map>();\n // Map to track dependency event IDs by predicate name\n const predicateNameToEventId = new Map();\n \n let queryName = '';\n let queryStartTime = 0;\n let queryEndTime = 0;\n\n for (const event of events) {\n switch (event.type) {\n case 'QUERY_STARTED':\n queryName = (event.queryName as string) || '';\n queryStartTime = event.nanoTime;\n break;\n\n case 'QUERY_COMPLETED':\n queryEndTime = event.nanoTime;\n break;\n\n case 'PREDICATE_STARTED': {\n const predicateName = event.predicateName as string;\n const position = event.position as string | undefined;\n const predicateType = event.predicateType as string | undefined;\n const dependencies = event.dependencies as Record | undefined;\n \n // Track this predicate's event ID by name for dependency resolution\n predicateNameToEventId.set(predicateName, event.eventId);\n \n // Get dependency event IDs\n const dependencyEventIds: number[] = [];\n const dependencyNames: string[] = [];\n if (dependencies) {\n for (const depName of Object.keys(dependencies)) {\n dependencyNames.push(depName);\n const depEventId = predicateNameToEventId.get(depName);\n if (depEventId !== undefined) {\n dependencyEventIds.push(depEventId);\n }\n }\n }\n\n pipelineMap.set(event.eventId, {\n eventId: event.eventId,\n name: predicateName,\n position,\n type: predicateType,\n startTime: event.nanoTime,\n dependencies: dependencyNames,\n dependencyEventIds,\n });\n break;\n }\n\n case 'PREDICATE_COMPLETED': {\n const startEventId = event.startEvent as number;\n const pipelineInfo = pipelineMap.get(startEventId);\n if (pipelineInfo) {\n const startEvent = events.find((e) => e.eventId === startEventId);\n if (startEvent) {\n const duration = (event.nanoTime - startEvent.nanoTime) / 1_000_000; // Convert to ms\n pipelineInfo.endTime = event.nanoTime;\n pipelineInfo.duration = duration;\n pipelineInfo.resultSize = event.resultSize as number | undefined;\n pipelineInfo.tupleCount = event.tupleCount as number | undefined;\n }\n }\n break;\n }\n }\n }\n\n // Convert to array and maintain original evaluation order (by eventId)\n const pipelines: PipelineNode[] = Array.from(pipelineMap.values())\n .filter((p): p is PipelineNode => p.duration !== undefined)\n .sort((a, b) => a.eventId - b.eventId);\n\n const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1_000_000 : 0;\n\n return {\n queryName,\n totalDuration,\n totalEvents: events.length,\n pipelines,\n };\n}\n\n/**\n * Format profile data as JSON\n */\nfunction formatAsJson(profile: ProfileData): string {\n return JSON.stringify(profile, null, 2);\n}\n\n/**\n * Format profile data as Mermaid diagram\n * Creates a graph showing the query evaluation pipelines in order of execution\n * with dependencies as edges, annotated with duration and result sizes\n */\nfunction formatAsMermaid(profile: ProfileData): string {\n const lines: string[] = [];\n\n lines.push('```mermaid');\n lines.push('graph TD');\n lines.push('');\n \n // Add query root node\n lines.push(` QUERY[\"${basename(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms\"]`);\n lines.push('');\n \n // Create nodes for each pipeline in evaluation order (already sorted by eventId)\n profile.pipelines.forEach((pipeline) => {\n const nodeId = `P${pipeline.eventId}`;\n const duration = pipeline.duration.toFixed(2);\n const resultSize = pipeline.resultSize !== undefined ? pipeline.resultSize : '?';\n // Sanitize predicate name for Mermaid\n const name = pipeline.name.replace(/[<>]/g, '').substring(0, 40);\n lines.push(` ${nodeId}[\"${name}
${duration}ms | ${resultSize} results\"]`);\n });\n \n lines.push('');\n \n // Add edges from QUERY to root pipelines (those with no dependencies)\n const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0);\n \n rootPipelines.forEach((pipeline) => {\n lines.push(` QUERY --> P${pipeline.eventId}`);\n });\n \n lines.push('');\n \n // Add edges between pipelines based on dependencies (using eventIds to preserve links)\n profile.pipelines.forEach((pipeline) => {\n pipeline.dependencyEventIds.forEach((depEventId) => {\n const duration = pipeline.duration.toFixed(2);\n lines.push(` P${depEventId} -->|\"${duration}ms\"| P${pipeline.eventId}`);\n });\n });\n \n lines.push('');\n lines.push(' classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px');\n lines.push(' classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px');\n lines.push(' class QUERY query');\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Register the profile_codeql_query tool\n */\nexport function registerProfileCodeQLQueryTool(server: McpServer): void {\n server.tool(\n 'profile_codeql_query',\n 'Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file',\n {\n query: z.string().describe('Path to the .ql query file'),\n database: z.string().describe('Path to the CodeQL database directory'),\n evaluatorLog: z\n .string()\n .optional()\n .describe(\n 'Path to an existing structured JSON log (e.g., evaluator-log.jsonl) file. If not provided, the tool will run the query to generate one.'\n ),\n outputDir: z\n .string()\n .optional()\n .describe('Directory to write profiling data files (defaults to same directory as evaluator log)'),\n },\n async (params) => {\n try {\n const { query, database, evaluatorLog, outputDir } = params;\n let logPath = evaluatorLog;\n let bqrsPath: string | undefined;\n let sarifPath: string | undefined;\n\n // If evaluator log not provided, run the query to generate one\n if (!logPath) {\n logger.info('No evaluator log provided, running query to generate one');\n\n // Determine output directory\n const defaultOutputDir = outputDir || join(dirname(query as string), 'profile-output');\n mkdirSync(defaultOutputDir, { recursive: true });\n\n logPath = join(defaultOutputDir, 'evaluator-log.jsonl');\n bqrsPath = join(defaultOutputDir, 'query-results.bqrs');\n sarifPath = join(defaultOutputDir, 'query-results.sarif');\n\n // Run query with evaluator logging and tuple counting\n const queryResult = await executeCodeQLCommand(\n 'query run',\n {\n database: database as string,\n output: bqrsPath,\n 'evaluator-log': logPath,\n 'tuple-counting': true,\n 'evaluator-log-level': 5,\n },\n [query as string]\n );\n\n if (!queryResult.success) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to run query: ${queryResult.stderr || queryResult.error}`,\n },\n ],\n isError: true,\n };\n }\n\n // Generate SARIF interpretation\n if (existsSync(bqrsPath)) {\n try {\n const sarifResult = await executeCodeQLCommand(\n 'bqrs interpret',\n { format: 'sarif-latest', output: sarifPath },\n [bqrsPath]\n );\n\n if (sarifResult.success) {\n logger.info(`Generated SARIF interpretation at ${sarifPath}`);\n }\n } catch (error) {\n logger.warn(`Failed to generate SARIF interpretation: ${error}`);\n }\n }\n }\n\n // Verify evaluator log exists\n if (!existsSync(logPath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Evaluator log not found at: ${logPath}`,\n },\n ],\n isError: true,\n };\n }\n\n // Parse the evaluator log\n logger.info(`Parsing evaluator log from: ${logPath}`);\n const profile = parseEvaluatorLog(logPath);\n\n // Determine output directory for profile\n const profileOutputDir = outputDir || dirname(logPath);\n mkdirSync(profileOutputDir, { recursive: true });\n\n // Write profile JSON file\n const jsonPath = join(profileOutputDir, 'query-evaluation-profile.json');\n const jsonContent = formatAsJson(profile);\n writeFileSync(jsonPath, jsonContent);\n logger.info(`Profile JSON written to: ${jsonPath}`);\n\n // Write profile Mermaid diagram file\n const mdPath = join(profileOutputDir, 'query-evaluation-profile.md');\n const mdContent = formatAsMermaid(profile);\n writeFileSync(mdPath, mdContent);\n logger.info(`Profile Mermaid diagram written to: ${mdPath}`);\n\n // Build response message\n const outputFiles: string[] = [\n `Profile JSON: ${jsonPath}`,\n `Profile Mermaid: ${mdPath}`,\n `Evaluator Log: ${logPath}`,\n ];\n\n if (bqrsPath) {\n outputFiles.push(`Query Results (BQRS): ${bqrsPath}`);\n }\n\n if (sarifPath && existsSync(sarifPath)) {\n outputFiles.push(`Query Results (SARIF): ${sarifPath}`);\n }\n\n const responseText = [\n 'Query profiling completed successfully!',\n '',\n 'Output Files:',\n ...outputFiles.map((f) => ` - ${f}`),\n '',\n 'Profile Summary:',\n ` - Query: ${basename(profile.queryName)}`,\n ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`,\n ` - Total Pipelines: ${profile.pipelines.length}`,\n ` - Total Events: ${profile.totalEvents}`,\n '',\n 'First 5 Pipeline Nodes (in evaluation order):',\n ...profile.pipelines.slice(0, 5).map((p, idx) => {\n return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || '?'} results)`;\n }),\n ].join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n };\n } catch (error) {\n logger.error('Error profiling CodeQL query:', error);\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n", "/**\n * CodeQL query compile tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryCompileTool: CLIToolDefinition = {\n name: 'codeql_query_compile',\n description: 'Compile and validate CodeQL queries',\n command: 'codeql',\n subcommand: 'query compile',\n inputSchema: {\n query: z.string().describe('Path to the CodeQL query file (.ql)'),\n database: z.string().optional().describe('Path to the CodeQL database'),\n library: z.string().optional().describe('Path to query library'),\n output: z.string().optional().describe('Output file path'),\n warnings: z.enum(['hide', 'show', 'error']).optional()\n .describe('How to handle compilation warnings'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql query compile --database=/path/to/db MyQuery.ql',\n 'codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql'\n ]\n};", "/**\n * CodeQL query format tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Custom result processor for codeql query format tool\n * Exit code 1 with --check-only means \"file would change\" - this is success for format checking\n */\nfunction formatResultProcessor(result: CLIExecutionResult, params: Record): string {\n const isCheckOnly = params['check-only'];\n const hasFormatChanges = result.exitCode === 1;\n \n if (isCheckOnly && hasFormatChanges) {\n // Mark as success for the CLI tool registry since detecting format changes is the intended behavior\n result.success = true;\n return result.stdout || result.stderr || 'File would change by autoformatting.';\n }\n \n return defaultCLIResultProcessor(result, params);\n}\n\nexport const codeqlQueryFormatTool: CLIToolDefinition = {\n name: 'codeql_query_format',\n description: 'Automatically format CodeQL source code files',\n command: 'codeql',\n subcommand: 'query format',\n inputSchema: {\n files: z.array(z.string()).describe('One or more .ql or .qll source files to format'),\n output: z.string().optional().describe('Write formatted code to this file instead of stdout'),\n 'in-place': z.boolean().optional().describe('Overwrite each input file with formatted version'),\n 'check-only': z.boolean().optional().describe('Check formatting without writing output'),\n backup: z.string().optional().describe('Backup extension when overwriting existing files'),\n 'no-syntax-errors': z.boolean().optional().describe('Ignore syntax errors and pretend file is formatted'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query format -i -- ExampleQuery.ql',\n 'codeql query format --in-place -- queries/*.ql',\n 'codeql query format --check-only -- queries/*.ql'\n ],\n resultProcessor: formatResultProcessor\n};", "/**\n * CodeQL query run tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\n\nexport const codeqlQueryRunTool: CLIToolDefinition = {\n name: 'codeql_query_run',\n description: 'Execute a CodeQL query against a database. Use either \"query\" parameter for direct file path OR \"queryName\" + \"queryLanguage\" for pre-defined tool queries.',\n command: 'codeql',\n subcommand: 'query run',\n inputSchema: {\n query: z.string().optional().describe('Path to the CodeQL query file (.ql) - cannot be used with queryName'),\n queryName: z.string().optional().describe('Name of pre-defined query to run (e.g., \"PrintAST\", \"CallGraphFrom\", \"CallGraphTo\") - requires queryLanguage'),\n queryLanguage: z.string().optional().describe('Programming language for tools queries (e.g., \"javascript\", \"java\", \"python\") - required when using queryName'),\n queryPack: z.string().optional().describe('Query pack path (defaults to server/ql//tools/src/ for tool queries)'),\n sourceFiles: z.string().optional().describe('Comma-separated list of source file paths for PrintAST queries (e.g., \"src/main.js,src/utils.js\" or just \"main.js\")'),\n sourceFunction: z.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., \"main,processData\")'),\n targetFunction: z.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., \"helper,validateInput\")'),\n database: createCodeQLSchemas.database(),\n output: createCodeQLSchemas.output(),\n external: z.array(z.string()).optional()\n .describe('External predicate data: predicate=file.csv'),\n timeout: createCodeQLSchemas.timeout(),\n logDir: z.string().optional()\n .describe('Custom directory for query execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n 'evaluator-log': z.string().optional().describe('Path to save evaluator log (deprecated: use logDir instead)'),\n 'evaluator-log-minify': z.boolean().optional()\n .describe('Minimize evaluator log for smaller size'),\n 'evaluator-log-level': z.number().min(1).max(5).optional()\n .describe('Evaluator log verbosity level (1-5, default 5)'),\n 'tuple-counting': z.boolean().optional()\n .describe('Display tuple counts for each evaluation step in evaluator logs'),\n format: z.enum(['sarif-latest', 'sarifv2.1.0', 'csv', 'graphtext', 'dgml', 'dot']).optional()\n .describe('Output format for query results via codeql bqrs interpret. Defaults to sarif-latest for @kind problem/path-problem queries, graphtext for @kind graph queries. Graph formats (graphtext, dgml, dot) only work with @kind graph queries.'),\n interpretedOutput: z.string().optional()\n .describe('Output file for interpreted results (e.g., results.sarif, results.txt). If not provided, defaults based on format: .sarif for SARIF, .txt for graphtext/csv, .dgml for dgml, .dot for dot'),\n evaluationFunction: z.string().optional()\n .describe('[DEPRECATED - use format parameter instead] Built-in function for query results evaluation (e.g., \"mermaid-graph\", \"json-decode\", \"csv-decode\") or path to custom evaluation script'),\n evaluationOutput: z.string().optional()\n .describe('[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql query run --database=mydb --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=src/index.js --output=results.bqrs --format=graphtext --interpreted-output=results.txt',\n 'codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif',\n 'codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql',\n 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files=\"main.js,utils.js\" --format=graphtext',\n 'codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql'\n ]\n};", "/**\n * CodeQL quick evaluate tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { join, resolve } from 'path';\nimport { findClassPosition } from './find-class-position';\nimport { findPredicatePosition } from './find-predicate-position';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\n\nexport interface QuickEvaluateParams {\n file: string;\n db: string;\n symbol: string;\n output_path?: string;\n}\n\n/**\n * Quick evaluate either a class or a predicate in a CodeQL query.\n * This allows debugging a select portion of QL code without running the whole query.\n */\nexport async function quickEvaluate({\n file,\n db: _db,\n symbol,\n output_path\n}: QuickEvaluateParams): Promise {\n try {\n // Try to find as a class first, then as a predicate\n try {\n await findClassPosition(file, symbol);\n } catch {\n try {\n await findPredicatePosition(file, symbol);\n } catch {\n throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`);\n }\n }\n \n const resolvedOutput = resolve(output_path || join(getProjectTmpDir('quickeval'), 'quickeval.bqrs'));\n \n // For now, return the resolved output path\n // In a full implementation, this would use the CodeQL CLI or query server\n // to perform the actual quick evaluation with the position parameters\n return resolvedOutput;\n } catch (error) {\n throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the quick evaluate tool with the MCP server\n */\nexport function registerQuickEvaluateTool(server: McpServer): void {\n server.tool(\n 'quick_evaluate',\n 'Quick evaluate either a class or a predicate in a CodeQL query for debugging',\n {\n file: z.string().describe('Path to the .ql file containing the symbol'),\n db: z.string().describe('Path to the CodeQL database'),\n symbol: z.string().describe('Name of the class or predicate to evaluate'),\n output_path: z.string().optional().describe('Output path for results (defaults to project-local .tmp/quickeval/)'),\n },\n async ({ file, db, symbol, output_path }) => {\n try {\n const result = await quickEvaluate({ file, db, symbol, output_path });\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error in quick evaluate:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL register database tool\n * \n * Inspired by JordyZomer/codeql-mcp repository:\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/server.py\n * - https://github.com/JordyZomer/codeql-mcp/blob/main/codeqlclient.py\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { access, constants } from 'fs/promises';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger';\n\nexport interface DatabaseRegistration {\n uri: string;\n content: {\n sourceArchiveZip: string;\n dbDir: string;\n };\n}\n\n/**\n * Register a CodeQL database given a local path to the database directory.\n * Validates that the database exists and has required structure.\n * Supports both full databases (with src.zip) and test databases (with src/ folder).\n */\nexport async function registerDatabase(dbPath: string): Promise {\n try {\n const resolvedPath = resolve(dbPath);\n \n // Check if database directory exists\n await access(resolvedPath, constants.F_OK);\n \n // Check for codeql-database.yml (required for all CodeQL databases)\n const dbYmlPath = resolve(resolvedPath, 'codeql-database.yml');\n await access(dbYmlPath, constants.F_OK);\n \n // Check if src.zip exists (for full databases) OR src/ directory exists (for test databases)\n const srcZipPath = resolve(resolvedPath, 'src.zip');\n const srcDirPath = resolve(resolvedPath, 'src');\n \n let hasSrcZip = false;\n let hasSrcDir = false;\n \n try {\n await access(srcZipPath, constants.F_OK);\n hasSrcZip = true;\n } catch {\n // src.zip not found, check for src/ directory\n }\n \n if (!hasSrcZip) {\n try {\n await access(srcDirPath, constants.F_OK);\n hasSrcDir = true;\n } catch {\n // src directory not found either\n }\n }\n \n if (!hasSrcZip && !hasSrcDir) {\n throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`);\n }\n \n // For now, we just validate and return success message\n // In a full implementation, this would register with a query server\n const sourceType = hasSrcZip ? 'src.zip' : 'src/';\n return `Database registered: ${dbPath} (source: ${sourceType})`;\n } catch (error) {\n if (error instanceof Error) {\n const errorCode = (error as { code?: string }).code;\n if (errorCode === 'ENOENT') {\n if (error.message.includes('codeql-database.yml')) {\n throw new Error(`Missing required codeql-database.yml in: ${dbPath}`);\n }\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n if (errorCode === 'EACCES') {\n throw new Error(`Database path does not exist: ${dbPath}`);\n }\n }\n throw new Error(`Failed to register database: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Register the register database tool with the MCP server\n */\nexport function registerRegisterDatabaseTool(server: McpServer): void {\n server.tool(\n 'register_database',\n 'Register a CodeQL database given a local path to the database directory',\n {\n db_path: z.string().describe('Path to the CodeQL database directory'),\n },\n async ({ db_path }) => {\n try {\n const result = await registerDatabase(db_path);\n return {\n content: [{ type: 'text', text: result }],\n };\n } catch (error) {\n logger.error('Error registering database:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}", "/**\n * CodeQL resolve database tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveDatabaseTool: CLIToolDefinition = {\n name: 'codeql_resolve_database',\n description: 'Resolve database path and validate database structure',\n command: 'codeql',\n subcommand: 'resolve database',\n inputSchema: {\n database: z.string().describe('Database path to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for database information'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve database -- /path/to/database',\n 'codeql resolve database --format=json -- my-database',\n 'codeql resolve database --format=betterjson -- database-dir'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve languages tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLanguagesTool: CLIToolDefinition = {\n name: 'codeql_resolve_languages',\n description: 'List installed CodeQL extractor packs',\n command: 'codeql',\n subcommand: 'resolve languages',\n inputSchema: {\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for language information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve languages --format=text',\n 'codeql resolve languages --format=json',\n 'codeql resolve languages --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve library-path tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveLibraryPathTool: CLIToolDefinition = {\n name: 'codeql_resolve_library-path',\n description: 'Resolve library path for CodeQL queries and libraries',\n command: 'codeql',\n subcommand: 'resolve library-path',\n inputSchema: {\n language: z.string().optional().describe('Programming language to resolve library path for'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for library path information'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve library-path --language=java',\n 'codeql resolve library-path --format=json --language=python',\n 'codeql resolve library-path --format=betterjson'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve metadata tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveMetadataTool: CLIToolDefinition = {\n name: 'codeql_resolve_metadata',\n description: 'Resolve and return the key-value metadata pairs from a CodeQL query source file.',\n command: 'codeql',\n subcommand: 'resolve metadata',\n inputSchema: {\n query: z.string().describe('Query file to resolve metadata for'),\n format: z.enum(['json']).optional()\n .describe('Output format for metadata information (always JSON, optional for future compatibility)'),\n verbose: z.boolean().optional().describe('Enable verbose output'),\n additionalArgs: z.array(z.string()).optional().describe('Additional command-line arguments')\n },\n examples: [\n 'codeql resolve metadata -- relative-path/2/MyQuery.ql',\n 'codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve qlref tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveQlrefTool: CLIToolDefinition = {\n name: 'codeql_resolve_qlref',\n description: 'Resolve qlref files to their corresponding query files',\n command: 'codeql',\n subcommand: 'resolve qlref',\n inputSchema: {\n qlref: z.string().describe('Path to the .qlref file to resolve'),\n format: z.enum(['text', 'json', 'betterjson']).optional()\n .describe('Output format for qlref resolution'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve qlref -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=json -- test/MyQuery.qlref',\n 'codeql resolve qlref --format=betterjson -- test/MyQuery.qlref'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL resolve queries tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, CLIExecutionResult } from '../../lib/cli-tool-registry';\n\n/**\n * Result processor that only returns stdout for JSON formats\n * This prevents warnings/info from stderr from corrupting JSON output\n */\nconst jsonOnlyResultProcessor = (\n result: CLIExecutionResult,\n params: Record\n): string => {\n if (!result.success) {\n return `Command failed (exit code ${result.exitCode || 'unknown'}):\\n${result.error || result.stderr}`;\n }\n\n // For JSON formats (including bylanguage), only return stdout to avoid mixing warnings with JSON\n if (params.format === 'json' || params.format === 'betterjson' || params.format === 'bylanguage') {\n return result.stdout || '[]';\n }\n\n // For text format, include warnings\n let output = '';\n\n if (result.stdout) {\n output += result.stdout;\n }\n\n if (result.stderr) {\n if (output) {\n output += '\\n\\nWarnings/Info:\\n';\n }\n output += result.stderr;\n }\n\n if (!output) {\n output = 'Command executed successfully (no output)';\n }\n\n return output;\n};\n\nexport const codeqlResolveQueriesTool: CLIToolDefinition = {\n name: 'codeql_resolve_queries',\n description: 'List available CodeQL queries found on the local filesystem',\n command: 'codeql',\n subcommand: 'resolve queries',\n inputSchema: {\n directory: z.string().optional().describe('Directory to search for queries'),\n language: z.string().optional().describe('Filter queries by programming language'),\n format: z.enum(['text', 'json', 'betterjson', 'bylanguage']).optional()\n .describe('Output format for query list'),\n 'additional-packs': z.union([z.string(), z.array(z.string())]).optional()\n .describe('Additional pack directories to search for CodeQL packs'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve queries',\n 'codeql resolve queries --language=java --format=json',\n 'codeql resolve queries --format=betterjson -- /path/to/queries',\n 'codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries'\n ],\n resultProcessor: jsonOnlyResultProcessor\n};", "/**\n * CodeQL resolve tests tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlResolveTestsTool: CLIToolDefinition = {\n name: 'codeql_resolve_tests',\n description: 'Resolve the local filesystem paths of unit tests and/or queries under some base directory',\n command: 'codeql',\n subcommand: 'resolve tests',\n inputSchema: {\n tests: z.array(z.string()).optional().describe('One or more tests (.ql, .qlref files, or test directories)'),\n format: z.enum(['text', 'json']).optional()\n .describe('Output format for test list'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql resolve tests',\n 'codeql resolve tests --format=json -- test-directory',\n 'codeql resolve tests --format=json -- test1.ql test2.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test accept tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestAcceptTool: CLIToolDefinition = {\n name: 'codeql_test_accept',\n description: 'Accept new test results as the expected baseline',\n command: 'codeql',\n subcommand: 'test accept',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref',\n 'codeql test accept -- languages/java/test/MyQuery/',\n 'codeql test accept -- languages/java/src/MyQuery/MyQuery.ql'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test extract tool\n */\n\nimport { z } from 'zod';\nimport { CLIToolDefinition, createCodeQLSchemas, defaultCLIResultProcessor } from '../../lib/cli-tool-registry';\n\nexport const codeqlTestExtractTool: CLIToolDefinition = {\n name: 'codeql_test_extract',\n description: 'Extract test databases for CodeQL query tests',\n command: 'codeql',\n subcommand: 'test extract',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more test directories or files'),\n language: z.string().optional().describe('Programming language for extraction'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test extract -- languages/java/test/MyQuery/',\n 'codeql test extract --language=java --threads=4 -- test-directory',\n 'codeql test extract --threads=2 --ram=2048 -- multiple/test/directories'\n ],\n resultProcessor: defaultCLIResultProcessor\n};", "/**\n * CodeQL test run tool\n */\n\nimport { CLIToolDefinition, createCodeQLSchemas } from '../../lib/cli-tool-registry';\nimport { z } from 'zod';\n\nexport const codeqlTestRunTool: CLIToolDefinition = {\n name: 'codeql_test_run',\n description: 'Run CodeQL query tests',\n command: 'codeql',\n subcommand: 'test run',\n inputSchema: {\n tests: z.array(z.string()).describe('One or more tests (.ql, .qlref files, or test directories)'),\n 'show-extractor-output': z.boolean().optional()\n .describe('Show output from extractors during test execution'),\n 'keep-databases': z.boolean().optional()\n .describe('Keep test databases after running tests'),\n 'learn': z.boolean().optional()\n .describe('Accept current output as expected for failing tests'),\n logDir: z.string().optional()\n .describe('Custom directory for test execution logs (overrides CODEQL_QUERY_LOG_DIR environment variable). If not provided, uses CODEQL_QUERY_LOG_DIR or defaults to .tmp/query-logs/'),\n threads: createCodeQLSchemas.threads(),\n ram: createCodeQLSchemas.ram(),\n verbose: createCodeQLSchemas.verbose(),\n additionalArgs: createCodeQLSchemas.additionalArgs()\n },\n examples: [\n 'codeql test run /path/to/tests',\n 'codeql test run --learn /path/to/failing/tests',\n 'codeql test run --threads=4 --keep-databases /path/to/tests',\n 'codeql test run --log-dir=/custom/log/path /path/to/tests'\n ]\n};", "/**\n * CodeQL tools registration for MCP server\n * Includes both high-level helpers and CLI command wrappers\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { validateCodeQLSyntax } from '../lib/validation';\nimport { createCodeQLQuery } from '../lib/query-scaffolding';\nimport { registerCLITool } from '../lib/cli-tool-registry';\nimport {\n codeqlBqrsDecodeTool,\n codeqlBqrsInfoTool,\n codeqlBqrsInterpretTool,\n codeqlDatabaseAnalyzeTool,\n codeqlDatabaseCreateTool,\n codeqlGenerateLogSummaryTool,\n codeqlGenerateQueryHelpTool,\n codeqlPackInstallTool,\n codeqlPackLsTool,\n codeqlQueryCompileTool,\n codeqlQueryFormatTool,\n codeqlQueryRunTool,\n codeqlResolveDatabaseTool,\n codeqlResolveLanguagesTool,\n codeqlResolveLibraryPathTool,\n codeqlResolveMetadataTool,\n codeqlResolveQlrefTool,\n codeqlResolveQueriesTool,\n codeqlResolveTestsTool,\n codeqlTestAcceptTool,\n codeqlTestExtractTool,\n codeqlTestRunTool,\n registerFindClassPositionTool,\n registerFindCodeQLQueryFilesTool,\n registerFindPredicatePositionTool,\n registerLanguageServerEvalTool,\n registerProfileCodeQLQueryTool,\n registerQuickEvaluateTool,\n registerRegisterDatabaseTool\n} from './codeql';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all CodeQL tools with the MCP server\n */\nexport function registerCodeQLTools(server: McpServer): void {\n // Register high-level helper tools\n \n // Tool: Validate CodeQL Query (heuristic-based)\n server.tool(\n 'validate_codeql_query',\n 'Quick heuristic validation for CodeQL query structure - checks for common patterns like from/where/select clauses and metadata presence. Does NOT compile the query. For authoritative validation with actual compilation, use codeql_language_server_eval instead.',\n {\n query: z.string().describe('The CodeQL query to validate'),\n language: z.string().optional().describe('Target programming language'),\n },\n async ({ query, language }) => {\n try {\n const validation = validateCodeQLSyntax(query, language);\n return {\n content: [{ type: 'text', text: JSON.stringify(validation, null, 2) }],\n };\n } catch (error) {\n logger.error('Error validating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool: Create CodeQL Query\n server.tool(\n 'create_codeql_query',\n 'Create directory structure and files for a new CodeQL query with tests',\n {\n basePath: z.string().describe('Base path where src/ and test/ directories will be created'),\n queryName: z.string().describe('Name of the query (e.g., MySecurityQuery)'),\n language: z.string().describe('Target programming language (e.g., javascript, python, java)'),\n description: z.string().optional().describe('Description of what the query does'),\n queryId: z.string().optional().describe('Custom query ID (defaults to language/example/queryname)'),\n },\n async ({ basePath, queryName, language, description, queryId }) => {\n try {\n const result = createCodeQLQuery({\n basePath,\n queryName,\n language,\n description,\n queryId\n });\n \n const summary = {\n success: true,\n queryPath: result.queryPath,\n testPath: result.testPath,\n qlrefPath: result.qlrefPath,\n testCodePath: result.testCodePath,\n filesCreated: result.filesCreated,\n nextSteps: [\n 'Review and customize the generated query in: ' + result.queryPath,\n 'Add test cases to: ' + result.testCodePath,\n 'Run codeql_pack_install to install dependencies',\n 'Run codeql_test_extract to create test database',\n 'Run codeql_test_run to execute tests'\n ]\n };\n \n return {\n content: [{ type: 'text', text: JSON.stringify(summary, null, 2) }],\n };\n } catch (error) {\n logger.error('Error creating CodeQL query:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register CLI tools (alphabetically by tool name)\n registerCLITool(server, codeqlBqrsDecodeTool);\n registerCLITool(server, codeqlBqrsInfoTool);\n registerCLITool(server, codeqlBqrsInterpretTool);\n registerCLITool(server, codeqlDatabaseAnalyzeTool);\n registerCLITool(server, codeqlDatabaseCreateTool);\n registerCLITool(server, codeqlGenerateLogSummaryTool);\n registerCLITool(server, codeqlGenerateQueryHelpTool);\n registerCLITool(server, codeqlPackInstallTool);\n registerCLITool(server, codeqlPackLsTool);\n registerCLITool(server, codeqlQueryCompileTool);\n registerCLITool(server, codeqlQueryFormatTool);\n registerCLITool(server, codeqlQueryRunTool);\n registerCLITool(server, codeqlResolveDatabaseTool);\n registerCLITool(server, codeqlResolveLanguagesTool);\n registerCLITool(server, codeqlResolveLibraryPathTool);\n registerCLITool(server, codeqlResolveMetadataTool);\n registerCLITool(server, codeqlResolveQlrefTool);\n registerCLITool(server, codeqlResolveQueriesTool);\n registerCLITool(server, codeqlResolveTestsTool);\n registerCLITool(server, codeqlTestAcceptTool);\n registerCLITool(server, codeqlTestExtractTool);\n registerCLITool(server, codeqlTestRunTool);\n\n // Register new MCP tools (inspired by JordyZomer/codeql-mcp repository)\n registerFindClassPositionTool(server);\n registerFindCodeQLQueryFilesTool(server);\n registerFindPredicatePositionTool(server);\n registerLanguageServerEvalTool(server);\n registerProfileCodeQLQueryTool(server);\n registerQuickEvaluateTool(server);\n registerRegisterDatabaseTool(server);\n}\n", "/**\n * CodeQL query validation utilities\n */\n\nimport { resolve, normalize, isAbsolute, relative } from 'path';\n\nexport interface CodeQLValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n suggestions: string[];\n}\n\n/**\n * Validates CodeQL query syntax and structure\n */\nexport function validateCodeQLSyntax(query: string, _language?: string): CodeQLValidationResult {\n const validation: CodeQLValidationResult = {\n isValid: true,\n errors: [],\n warnings: [],\n suggestions: [],\n };\n\n if (!query.trim()) {\n validation.isValid = false;\n validation.errors.push('Query cannot be empty');\n return validation;\n }\n\n if (!query.includes('from') && !query.includes('select')) {\n validation.warnings.push('Query should typically include \"from\" and \"select\" clauses');\n }\n\n if (!query.includes('@name') && !query.includes('@description')) {\n validation.suggestions.push('Consider adding @name and @description metadata');\n }\n\n return validation;\n}\n\n/**\n * Validates a file path to prevent path traversal attacks\n * @param filePath - The file path to validate\n * @param workspaceRoot - Optional workspace root directory. If not provided, allows any absolute path but still blocks traversal attempts\n * @returns The validated absolute path\n * @throws Error if the path contains path traversal sequences\n */\nexport function validateFilePath(filePath: string, workspaceRoot?: string): string {\n // Normalize the path to resolve any . or .. segments\n const normalizedPath = normalize(filePath);\n \n // Check for path traversal attempts in the normalized path\n // This blocks paths like \"../../../etc/passwd\" even after normalization\n if (normalizedPath.includes('..')) {\n throw new Error(`Invalid file path: path traversal detected in \"${filePath}\"`);\n }\n \n // Resolve to absolute path\n const absolutePath = isAbsolute(normalizedPath) \n ? normalizedPath \n : resolve(workspaceRoot || process.cwd(), normalizedPath);\n \n // If workspace root is specified, ensure the resolved path is within it\n if (workspaceRoot) {\n const relativePath = relative(workspaceRoot, absolutePath);\n \n // If relative path starts with .. or is absolute, it's outside workspace\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Invalid file path: \"${filePath}\" is outside the workspace root`);\n }\n }\n \n return absolutePath;\n}", "/**\n * CodeQL query scaffolding utilities\n * Handles creation of query directory structure and files\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface QueryScaffoldingOptions {\n basePath: string;\n queryName: string;\n language: string;\n description?: string;\n queryId?: string;\n}\n\nexport interface QueryScaffoldingResult {\n queryPath: string;\n testPath: string;\n qlrefPath: string;\n testCodePath: string;\n filesCreated: string[];\n}\n\n/**\n * Get the file extension for test code based on language\n */\nfunction getLanguageExtension(language: string): string {\n const extensions: Record = {\n javascript: 'js',\n typescript: 'ts',\n python: 'py',\n java: 'java',\n csharp: 'cs',\n cpp: 'cpp',\n go: 'go',\n ruby: 'rb',\n actions: 'yml'\n };\n return extensions[language.toLowerCase()] || 'txt';\n}\n\n/**\n * Generate query template content\n */\nfunction generateQueryTemplate(\n queryName: string,\n language: string,\n description?: string,\n queryId?: string\n): string {\n const desc = description || `${queryName} query`;\n const id = queryId || `${language}/example/${queryName.toLowerCase()}`;\n \n return `/**\n * @id ${id}\n * @name ${queryName}\n * @description ${desc}\n * @kind problem\n * @precision medium\n * @problem.severity warning\n */\n\nimport ${language}\n\n// TODO: Implement query logic\nfrom File f\nwhere f.getBaseName() = \"${queryName}.${getLanguageExtension(language)}\"\nselect f, \"TODO: Add query logic\"\n`;\n}\n\n/**\n * Create the directory structure and files for a new CodeQL query\n */\nexport function createCodeQLQuery(options: QueryScaffoldingOptions): QueryScaffoldingResult {\n const { basePath, queryName, language, description, queryId } = options;\n \n // Resolve absolute paths\n const absoluteBasePath = path.resolve(basePath);\n \n // Define paths with intermediate directory\n const srcDir = path.join(absoluteBasePath, 'src', queryName);\n const testDir = path.join(absoluteBasePath, 'test', queryName);\n \n const queryPath = path.join(srcDir, `${queryName}.ql`);\n const qlrefPath = path.join(testDir, `${queryName}.qlref`);\n const testCodePath = path.join(testDir, `${queryName}.${getLanguageExtension(language)}`);\n \n const filesCreated: string[] = [];\n \n try {\n // Create directories (recursive: true is a no-op if they already exist)\n fs.mkdirSync(srcDir, { recursive: true });\n fs.mkdirSync(testDir, { recursive: true });\n \n // Create files atomically using 'wx' flag (exclusive create) to avoid\n // TOCTOU race between existsSync check and writeFileSync (CWE-367).\n // The 'wx' flag fails with EEXIST if the file already exists.\n try {\n const queryContent = generateQueryTemplate(queryName, language, description, queryId);\n fs.writeFileSync(queryPath, queryContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(queryPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const qlrefContent = `${queryName}/${queryName}.ql\\n`;\n fs.writeFileSync(qlrefPath, qlrefContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(qlrefPath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n try {\n const testCodeContent = `// Test code for ${queryName}\\n// TODO: Add test cases\\n`;\n fs.writeFileSync(testCodePath, testCodeContent, { encoding: 'utf8', flag: 'wx' });\n filesCreated.push(testCodePath);\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n \n return {\n queryPath,\n testPath: testDir,\n qlrefPath,\n testCodePath,\n filesCreated\n };\n } catch (error) {\n throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n", "/**\n * CodeQL learning resources utilities\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get the getting started guide content\n */\nexport function getGettingStartedGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/getting-started.md'), 'utf-8');\n } catch {\n return 'Getting started guide not available';\n }\n}\n\n/**\n * Get the query basics guide content\n */\nexport function getQueryBasicsGuide(): string {\n try {\n return readFileSync(join(__dirname, '../resources/query-basics.md'), 'utf-8');\n } catch {\n return 'Query basics guide not available';\n }\n}\n\n/**\n * Get the security templates content\n */\nexport function getSecurityTemplates(): string {\n try {\n return readFileSync(join(__dirname, '../resources/security-templates.md'), 'utf-8');\n } catch {\n return 'Security templates not available';\n }\n}\n\n/**\n * Get the performance patterns content\n */\nexport function getPerformancePatterns(): string {\n try {\n return readFileSync(join(__dirname, '../resources/performance-patterns.md'), 'utf-8');\n } catch {\n return 'Performance patterns not available';\n }\n}", "/**\n * CodeQL resources registration for MCP server\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n getGettingStartedGuide,\n getQueryBasicsGuide,\n getSecurityTemplates,\n getPerformancePatterns,\n} from '../lib/resources';\n\n/**\n * Register all CodeQL resources with the MCP server\n */\nexport function registerCodeQLResources(server: McpServer): void {\n // Getting Started Guide\n server.resource(\n 'CodeQL Getting Started',\n 'codeql://learning/getting-started',\n {\n description: 'Comprehensive introduction to CodeQL for beginners',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/getting-started',\n mimeType: 'text/markdown',\n text: getGettingStartedGuide(),\n },\n ],\n };\n }\n );\n\n // Query Basics Guide\n server.resource(\n 'CodeQL Query Basics',\n 'codeql://learning/query-basics',\n {\n description: 'Learn the fundamentals of writing CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://learning/query-basics',\n mimeType: 'text/markdown',\n text: getQueryBasicsGuide(),\n },\n ],\n };\n }\n );\n\n // Security Templates\n server.resource(\n 'CodeQL Security Templates',\n 'codeql://templates/security',\n {\n description: 'Ready-to-use security query templates',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://templates/security',\n mimeType: 'text/markdown',\n text: getSecurityTemplates(),\n },\n ],\n };\n }\n );\n\n // Performance Patterns\n server.resource(\n 'CodeQL Performance Patterns',\n 'codeql://patterns/performance',\n {\n description: 'Best practices for writing efficient CodeQL queries',\n mimeType: 'text/markdown',\n },\n async () => {\n return {\n contents: [\n {\n uri: 'codeql://patterns/performance',\n mimeType: 'text/markdown',\n text: getPerformancePatterns(),\n },\n ],\n };\n }\n );\n}\n", "/**\n * Language-specific resources implementation\n * Dynamically loads and serves language-specific AST references and security patterns\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { LANGUAGE_RESOURCES } from '../types/language-types';\nimport { workspaceRootDir } from '../utils/package-paths';\nimport { logger } from '../utils/logger';\n\n/**\n * Get the base path for ql resources.\n * Uses the workspace root (monorepo root or package root) so that\n * resource files are found regardless of the server's process.cwd().\n */\nfunction getQLBasePath(): string {\n return workspaceRootDir;\n}\n\n/**\n * Load content from a resource file\n */\nfunction loadResourceContent(relativePath: string): string | null {\n try {\n const fullPath = join(getQLBasePath(), relativePath);\n \n if (!existsSync(fullPath)) {\n logger.warn(`Resource file not found: ${fullPath}`);\n return null;\n }\n \n return readFileSync(fullPath, 'utf-8');\n } catch (error) {\n logger.error(`Error loading resource file ${relativePath}:`, error);\n return null;\n }\n}\n\n/**\n * Register language-specific AST resources\n */\nexport function registerLanguageASTResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.astFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/ast`;\n \n server.resource(\n `${langResource.language.toUpperCase()} AST Reference`,\n resourceUri,\n {\n description: `CodeQL AST class reference for ${langResource.language} programs`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.astFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} AST Reference\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register language-specific security pattern resources\n */\nexport function registerLanguageSecurityResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.securityFile) continue;\n \n const resourceUri = `codeql://languages/${langResource.language}/security`;\n \n server.resource(\n `${langResource.language.toUpperCase()} Security Patterns`,\n resourceUri,\n {\n description: `CodeQL security query patterns and framework modeling for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(langResource.securityFile!);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} Security Patterns\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n}\n\n/**\n * Register additional language-specific resources (like Go's dataflow patterns)\n */\nexport function registerLanguageAdditionalResources(server: McpServer): void {\n for (const langResource of LANGUAGE_RESOURCES) {\n if (!langResource.additionalFiles) continue;\n \n for (const [resourceType, filePath] of Object.entries(langResource.additionalFiles)) {\n const resourceUri = `codeql://languages/${langResource.language}/${resourceType}`;\n \n server.resource(\n `${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}`,\n resourceUri,\n {\n description: `CodeQL ${resourceType.replace('-', ' ')} guide for ${langResource.language}`,\n mimeType: 'text/markdown'\n },\n async () => {\n const content = loadResourceContent(filePath);\n \n if (!content) {\n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: `# ${langResource.language.toUpperCase()} ${resourceType.replace('-', ' ').replace(/\\b\\w/g, l => l.toUpperCase())}\\n\\nResource file not found or could not be loaded.`\n }]\n };\n }\n \n return {\n contents: [{\n uri: resourceUri,\n mimeType: 'text/markdown',\n text: content\n }]\n };\n }\n );\n }\n }\n}\n\n/**\n * Register all language-specific resources\n */\nexport function registerLanguageResources(server: McpServer): void {\n logger.info('Registering language-specific resources...');\n \n // Register AST references for all languages\n registerLanguageASTResources(server);\n \n // Register security patterns for languages that have them\n registerLanguageSecurityResources(server);\n \n // Register additional resources (like Go's dataflow patterns)\n registerLanguageAdditionalResources(server);\n \n logger.info(`Registered resources for ${LANGUAGE_RESOURCES.length} languages`);\n}", "/**\n * Type definitions and constants for language-specific resources\n */\n\n// Language mappings to resource files\nexport interface LanguageResource {\n language: string;\n astFile?: string;\n securityFile?: string;\n additionalFiles?: Record;\n}\n\nexport const LANGUAGE_RESOURCES: LanguageResource[] = [\n {\n language: 'actions',\n astFile: 'ql/languages/actions/tools/dev/actions_ast.prompt.md'\n },\n {\n language: 'cpp',\n astFile: 'ql/languages/cpp/tools/dev/cpp_ast.prompt.md',\n securityFile: 'ql/languages/cpp/tools/dev/cpp_security_query_guide.prompt.md'\n },\n {\n language: 'csharp',\n astFile: 'ql/languages/csharp/tools/dev/csharp_ast.prompt.md',\n securityFile: 'ql/languages/csharp/tools/dev/csharp_security_query_guide.prompt.md'\n },\n {\n language: 'go',\n astFile: 'ql/languages/go/tools/dev/go_ast.prompt.md',\n securityFile: 'ql/languages/go/tools/dev/go_security_query_guide.prompt.md',\n additionalFiles: {\n 'dataflow': 'ql/languages/go/tools/dev/go_dataflow.prompt.md',\n 'library-modeling': 'ql/languages/go/tools/dev/go_library_modeling.prompt.md',\n 'basic-queries': 'ql/languages/go/tools/dev/go_basic_queries.prompt.md'\n }\n },\n {\n language: 'java',\n astFile: 'ql/languages/java/tools/dev/java_ast.prompt.md'\n },\n {\n language: 'javascript',\n astFile: 'ql/languages/javascript/tools/dev/javascript_ast.prompt.md',\n securityFile: 'ql/languages/javascript/tools/dev/javascript_security_query_guide.prompt.md'\n },\n {\n language: 'python',\n astFile: 'ql/languages/python/tools/dev/python_ast.prompt.md',\n securityFile: 'ql/languages/python/tools/dev/python_security_query_guide.prompt.md'\n },\n {\n language: 'ql',\n astFile: 'ql/languages/ql/tools/dev/ql_ast.prompt.md'\n },\n {\n language: 'ruby',\n astFile: 'ql/languages/ruby/tools/dev/ruby_ast.prompt.md'\n }\n];", "/**\n * MCP Server workflow prompts for CodeQL development\n *\n * All prompt content is loaded from .prompt.md files in this directory.\n * This file only handles prompt registration and parameter processing.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { basename } from 'path';\nimport { loadPromptTemplate, processPromptTemplate } from './prompt-loader';\nimport { logger } from '../utils/logger';\n\n/** Supported CodeQL languages for tools queries */\nexport const SUPPORTED_LANGUAGES = [\n 'actions',\n 'cpp',\n 'csharp',\n 'go',\n 'java',\n 'javascript',\n 'python',\n 'ruby',\n 'swift'\n] as const;\n\n/**\n * Schema for workshop_creation_workflow prompt parameters.\n * Uses z.coerce.number() for numStages to handle string inputs from VSCode slash commands.\n */\nexport const workshopCreationWorkflowSchema = z.object({\n queryPath: z\n .string()\n .describe('Path to the production-grade CodeQL query (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n workshopName: z\n .string()\n .optional()\n .describe('Name for the workshop directory'),\n numStages: z\n .coerce.number()\n .optional()\n .describe('Number of incremental stages (default: 4-8)')\n});\n\n/**\n * Register MCP workflow prompts\n *\n * Each prompt loads its content from a corresponding .prompt.md file\n * and processes any parameter substitutions.\n */\nexport function registerWorkflowPrompts(server: McpServer): void {\n // Test-Driven Development Prompt\n server.prompt(\n 'test_driven_development',\n 'Test-driven development workflow for CodeQL queries using MCP tools',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n queryName: queryName || '[QueryName]'\n });\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `## Context\\n\\n- **Language**: ${language}\\n${queryName ? `- **Query Name**: ${queryName}\\n` : ''}\\n${content}`\n }\n }\n ]\n };\n }\n );\n\n // Tools Query Workflow Prompt\n server.prompt(\n 'tools_query_workflow',\n 'Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n database: z.string().describe('Path to the CodeQL database'),\n sourceFiles: z\n .string()\n .optional()\n .describe(\n 'Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'\n ),\n sourceFunction: z\n .string()\n .optional()\n .describe(\n 'Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'\n ),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")')\n },\n async ({\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n }) => {\n const template = loadPromptTemplate('tools-query-workflow.prompt.md');\n const content = processPromptTemplate(template, {\n language,\n database\n });\n\n const contextSection = buildToolsQueryContext(\n language,\n database,\n sourceFiles,\n sourceFunction,\n targetFunction\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + content\n }\n }\n ]\n };\n }\n );\n\n // Workshop Creation Workflow Prompt\n server.prompt(\n 'workshop_creation_workflow',\n 'Guide for creating CodeQL query development workshops from production-grade queries',\n workshopCreationWorkflowSchema.shape,\n async ({ queryPath, language, workshopName, numStages }) => {\n const template = loadPromptTemplate('workshop-creation-workflow.prompt.md');\n\n // Derive workshop name from query path if not provided\n const derivedName =\n workshopName ||\n basename(queryPath)\n .replace(/\\.(ql|qlref)$/, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') ||\n 'codeql-workshop';\n\n const contextSection = buildWorkshopContext(\n queryPath,\n language,\n derivedName,\n numStages\n );\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Basic Prompt - Test-Driven Development Checklist\n server.prompt(\n 'ql_tdd_basic',\n 'Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop')\n },\n async ({ language, queryName }) => {\n const template = loadPromptTemplate('ql-tdd-basic.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (language || queryName) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // TDD Advanced Prompt - Advanced Techniques with AST/CFG/CallGraph\n server.prompt(\n 'ql_tdd_advanced',\n 'Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis',\n {\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z.string().optional().describe('Name of the query to develop'),\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis')\n },\n async ({ language, queryName, database }) => {\n const template = loadPromptTemplate('ql-tdd-advanced.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryName) {\n contextSection += `- **Query Name**: ${queryName}\\n`;\n }\n if (database) {\n contextSection += `- **Database**: ${database}\\n`;\n }\n if (language || queryName || database) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank False Positives Prompt\n server.prompt(\n 'sarif_rank_false_positives',\n 'Analyze SARIF results to identify likely false positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-false-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // SARIF Rank True Positives Prompt\n server.prompt(\n 'sarif_rank_true_positives',\n 'Analyze SARIF results to identify likely true positives in CodeQL query results',\n {\n queryId: z.string().optional().describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze')\n },\n async ({ queryId, sarifPath }) => {\n const template = loadPromptTemplate('sarif-rank-true-positives.prompt.md');\n\n let contextSection = '## Analysis Context\\n\\n';\n if (queryId) {\n contextSection += `- **Query ID**: ${queryId}\\n`;\n }\n if (sarifPath) {\n contextSection += `- **SARIF File**: ${sarifPath}\\n`;\n }\n if (queryId || sarifPath) {\n contextSection += '\\n';\n }\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Explain CodeQL Query Prompt (for workshop learning content)\n server.prompt(\n 'explain_codeql_query',\n 'Generate detailed explanation of a CodeQL query for workshop learning content - uses MCP tools to gather context and produces both verbal explanations and mermaid evaluation diagrams',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling')\n },\n async ({ queryPath, language, databasePath }) => {\n const template = loadPromptTemplate('explain-codeql-query.prompt.md');\n\n let contextSection = '## Query to Explain\\n\\n';\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n contextSection += `- **Language**: ${language}\\n`;\n if (databasePath) {\n contextSection += `- **Database Path**: ${databasePath}\\n`;\n }\n contextSection += '\\n';\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n // Document CodeQL Query Prompt\n server.prompt(\n 'document_codeql_query',\n 'Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query',\n {\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query')\n },\n async ({ queryPath, language }) => {\n const template = loadPromptTemplate('document-codeql-query.prompt.md');\n\n const contextSection = `## Query to Document\n\n- **Query Path**: ${queryPath}\n- **Language**: ${language}\n\n`;\n\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: contextSection + template\n }\n }\n ]\n };\n }\n );\n\n logger.info('Registered 9 workflow prompts');\n}\n\n/**\n * Build context section for tools query workflow\n */\nexport function buildToolsQueryContext(\n language: string,\n database: string,\n sourceFiles?: string,\n sourceFunction?: string,\n targetFunction?: string\n): string {\n const lines = [\n '## Your Context',\n '',\n `- **Language**: ${language}`,\n `- **Database**: ${database}`\n ];\n\n if (sourceFiles) {\n lines.push(`- **Source Files**: ${sourceFiles}`);\n }\n if (sourceFunction) {\n lines.push(`- **Source Function**: ${sourceFunction}`);\n }\n if (targetFunction) {\n lines.push(`- **Target Function**: ${targetFunction}`);\n }\n\n lines.push('', '## Recommended Next Steps', '');\n\n if (sourceFiles) {\n lines.push(\n `1. Run \\`codeql_query_run\\` with queryName=\"PrintAST\", sourceFiles=\"${sourceFiles}\"`\n );\n } else {\n lines.push('1. Identify source files to analyze with PrintAST');\n }\n\n if (sourceFunction) {\n lines.push(\n `2. Run \\`codeql_query_run\\` with queryName=\"PrintCFG\" or \"CallGraphFrom\", sourceFunction=\"${sourceFunction}\"`\n );\n } else {\n lines.push(\n '2. Identify key functions for CFG or call graph analysis'\n );\n }\n\n if (targetFunction) {\n lines.push(\n `3. Run \\`codeql_query_run\\` with queryName=\"CallGraphTo\", targetFunction=\"${targetFunction}\"`\n );\n } else {\n lines.push('3. Identify target functions to find callers');\n }\n\n lines.push('', '');\n return lines.join('\\n');\n}\n\n/**\n * Build context section for workshop creation workflow\n */\nexport function buildWorkshopContext(\n queryPath: string,\n language: string,\n workshopName: string,\n numStages?: number\n): string {\n return `## Your Workshop Context\n\n- **Target Query**: ${queryPath}\n- **Language**: ${language}\n- **Workshop Name**: ${workshopName}\n- **Suggested Stages**: ${numStages || '4-8 (auto-detect based on query complexity)'}\n\n## Immediate Actions\n\n1. **Locate query files**: Use \\`find_codeql_query_files\\` with queryPath=\"${queryPath}\"\n2. **Understand query for learning content**: Use the \\`explain_codeql_query\\` prompt with queryPath=\"${queryPath}\" and language=\"${language}\"\n3. **Document each workshop stage**: Use the \\`document_codeql_query\\` prompt to create/update documentation for each solution query\n4. **Verify tests pass**: Use \\`codeql_test_run\\` on existing tests\n5. **Run tools queries**: Generate AST/CFG understanding for workshop materials\n\n`;\n}\n", "/**\n * Utility functions for loading prompt template files\n */\n\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Load a prompt template from a .prompt.md file\n */\nexport function loadPromptTemplate(promptFileName: string): string {\n try {\n const promptPath = join(__dirname, promptFileName);\n return readFileSync(promptPath, 'utf-8');\n } catch (error) {\n return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : 'Unknown error'}`;\n }\n}\n\n/**\n * Process prompt template by replacing placeholders with actual values\n */\nexport function processPromptTemplate(template: string, variables: Record): string {\n let processed = template;\n \n // Replace variables in the format {{variable}} or {variable}\n for (const [key, value] of Object.entries(variables)) {\n const patterns = [\n new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'),\n new RegExp(`\\\\{${key}\\\\}`, 'g')\n ];\n \n for (const pattern of patterns) {\n processed = processed.replace(pattern, value);\n }\n }\n \n return processed;\n}", "/**\n * Monitoring Tools - MCP tool implementations for session management and reporting\n * Provides the MCP Tool APIs specified in the monitoring specification\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport { sessionDataManager } from '../lib/session-data-manager';\nimport {\n QueryDevelopmentSession,\n SessionFilter,\n QualityScoreRecord,\n ComparisonReport,\n AggregateReport,\n ExportResult,\n FunctionalTestResult,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Register all monitoring and reporting tools with the MCP server\n * Note: These tools are opt-in and disabled by default for end-users.\n * Set enableMonitoringTools: true in monitoring config to enable them.\n */\nexport function registerMonitoringTools(server: McpServer): void {\n const config = sessionDataManager.getConfig();\n \n // Check if monitoring tools are enabled (opt-in, disabled by default)\n if (!config.enableMonitoringTools) {\n logger.info('Monitoring tools are disabled (opt-in). Set enableMonitoringTools: true to enable session_* tools.');\n return;\n }\n\n // Session Management Tools - session_start removed per feedback (auto-creation instead)\n registerSessionEndTool(server);\n registerSessionGetTool(server);\n registerSessionListTool(server);\n registerSessionUpdateStateTool(server);\n\n // Session Analytics Tools\n registerSessionGetCallHistoryTool(server);\n registerSessionGetTestHistoryTool(server);\n registerSessionGetScoreHistoryTool(server);\n registerSessionCalculateCurrentScoreTool(server);\n\n // Batch Operations Tools\n registerSessionsCompareTool(server);\n registerSessionsAggregateTool(server);\n registerSessionsExportTool(server);\n\n // Note: Functional Testing Support Tools are internal only, not exposed as MCP tools\n\n logger.info('Registered monitoring and reporting tools');\n}\n\n/**\n * Session Management Tools\n */\n\n// session_start tool removed - sessions are now auto-created when needed\n// Sessions are automatically created when MCP tools are called with queryPath\n// If explicit session creation is needed, provide sessionId=null and it will auto-create\n\nfunction registerSessionEndTool(server: McpServer): void {\n server.tool(\n 'session_end',\n 'End a query development session with final status',\n {\n sessionId: z.string().describe('ID of the session to end'),\n status: z.enum(['completed', 'failed', 'abandoned']).describe('Final status of the session'),\n },\n async ({ sessionId, status }) => {\n try {\n const session = await sessionDataManager.endSession(sessionId, status);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error ending session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error ending session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTool(server: McpServer): void {\n server.tool(\n 'session_get',\n 'Get complete details of a specific query development session',\n {\n sessionId: z.string().describe('ID of the session to retrieve'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting session:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting session: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionListTool(server: McpServer): void {\n server.tool(\n 'session_list',\n 'List query development sessions with optional filtering',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const sessionList = {\n totalSessions: sessions.length,\n sessions: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n language: s.language,\n status: s.status,\n startTime: s.startTime,\n endTime: s.endTime,\n mcpCallsCount: s.mcpCalls.length,\n testExecutionsCount: s.testExecutions.length,\n currentScore: s.qualityScores.length > 0 \n ? s.qualityScores[s.qualityScores.length - 1].overallScore \n : null,\n })),\n };\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(sessionList, null, 2),\n },\n ],\n recommendations: generateListRecommendations(sessions),\n };\n } catch (error) {\n logger.error('Error listing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error listing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionUpdateStateTool(server: McpServer): void {\n server.tool(\n 'session_update_state',\n 'Update the current state of a query development session',\n {\n sessionId: z.string().describe('ID of the session to update'),\n filesPresent: z.array(z.string()).optional().describe('List of files present in the query development'),\n compilationStatus: z.enum(['unknown', 'success', 'failed']).optional().describe('Current compilation status'),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']).optional().describe('Current test status'),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']).optional().describe('Documentation status'),\n },\n async ({ sessionId, filesPresent, compilationStatus, testStatus, documentationStatus }) => {\n try {\n const stateUpdate: Record = {};\n if (filesPresent !== undefined) stateUpdate.filesPresent = filesPresent;\n if (compilationStatus !== undefined) stateUpdate.compilationStatus = compilationStatus;\n if (testStatus !== undefined) stateUpdate.testStatus = testStatus;\n if (documentationStatus !== undefined) stateUpdate.documentationStatus = documentationStatus;\n\n const session = await sessionDataManager.updateSessionState(sessionId, stateUpdate);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(session, null, 2),\n },\n ],\n recommendations: generateRecommendations(session, 'session_update_state'),\n };\n } catch (error) {\n logger.error('Error updating session state:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error updating session state: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Session Analytics Tools\n */\n\nfunction registerSessionGetCallHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_call_history',\n 'Get MCP call history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of calls to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let calls = [...session.mcpCalls].reverse(); // Most recent first\n if (limit && limit > 0) {\n calls = calls.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalCalls: session.mcpCalls.length,\n callHistory: calls,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting call history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting call history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetTestHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_test_history',\n 'Get test execution history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of test executions to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let tests = [...session.testExecutions].reverse(); // Most recent first\n if (limit && limit > 0) {\n tests = tests.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalTests: session.testExecutions.length,\n testHistory: tests,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting test history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting test history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionGetScoreHistoryTool(server: McpServer): void {\n server.tool(\n 'session_get_score_history',\n 'Get quality score history for a specific session',\n {\n sessionId: z.string().describe('ID of the session'),\n limit: z.number().optional().describe('Maximum number of scores to return (most recent first)'),\n },\n async ({ sessionId, limit }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n let scores = [...session.qualityScores].reverse(); // Most recent first\n if (limit && limit > 0) {\n scores = scores.slice(0, limit);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n sessionId,\n totalScores: session.qualityScores.length,\n scoreHistory: scores,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error getting score history:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error getting score history: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionCalculateCurrentScoreTool(server: McpServer): void {\n server.tool(\n 'session_calculate_current_score',\n 'Calculate current quality score for a session based on its state',\n {\n sessionId: z.string().describe('ID of the session'),\n },\n async ({ sessionId }) => {\n try {\n const session = await sessionDataManager.getSession(sessionId);\n \n if (!session) {\n return {\n content: [\n {\n type: 'text',\n text: `Session not found: ${sessionId}`,\n },\n ],\n isError: true,\n };\n }\n\n // Calculate quality score based on current state\n const scoreRecord = calculateQualityScore(session);\n \n // Add the score to the session\n await sessionDataManager.addQualityScore(sessionId, scoreRecord);\n \n // Get updated session with new score\n const updatedSession = await sessionDataManager.getSession(sessionId);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(scoreRecord, null, 2),\n },\n ],\n recommendations: generateRecommendations(updatedSession, 'session_calculate_current_score'),\n };\n } catch (error) {\n logger.error('Error calculating current score:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error calculating current score: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Batch Operations Tools\n */\n\nfunction registerSessionsCompareTool(server: McpServer): void {\n server.tool(\n 'sessions_compare',\n 'Compare multiple query development sessions across specified dimensions',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to compare'),\n dimensions: z.array(z.string()).optional().describe('Specific dimensions to compare (default: all)'),\n },\n async ({ sessionIds, dimensions }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for comparison',\n },\n ],\n isError: true,\n };\n }\n\n const comparison = await compareSessions(validSessions, dimensions);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(comparison, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error comparing sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error comparing sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsAggregateTool(server: McpServer): void {\n server.tool(\n 'sessions_aggregate',\n 'Generate aggregate insights from multiple sessions based on filters',\n {\n queryPath: z.string().optional().describe('Filter by query path (partial match)'),\n status: z.string().optional().describe('Filter by session status'),\n dateRange: z.array(z.string()).length(2).optional().describe('Filter by date range [start, end] (ISO timestamps)'),\n language: z.string().optional().describe('Filter by programming language'),\n queryType: z.string().optional().describe('Filter by query type'),\n },\n async ({ queryPath, status, dateRange, language, queryType }) => {\n try {\n const filters: SessionFilter = {};\n if (queryPath) filters.queryPath = queryPath;\n if (status) filters.status = status;\n if (dateRange) filters.dateRange = [dateRange[0], dateRange[1]];\n if (language) filters.language = language;\n if (queryType) filters.queryType = queryType;\n\n const sessions = await sessionDataManager.listSessions(\n Object.keys(filters).length > 0 ? filters : undefined\n );\n\n const aggregate = await aggregateSessions(sessions, filters);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(aggregate, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error aggregating sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error aggregating sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\nfunction registerSessionsExportTool(server: McpServer): void {\n server.tool(\n 'sessions_export',\n 'Export session data in specified format for external analysis',\n {\n sessionIds: z.array(z.string()).describe('Array of session IDs to export'),\n format: z.enum(['json', 'html', 'markdown']).optional().default('json').describe('Export format'),\n },\n async ({ sessionIds, format = 'json' }) => {\n try {\n const sessions = await Promise.all(\n sessionIds.map(id => sessionDataManager.getSession(id))\n );\n\n const validSessions = sessions.filter(s => s !== null) as QueryDevelopmentSession[];\n \n if (validSessions.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No valid sessions found for export',\n },\n ],\n isError: true,\n };\n }\n\n const exportResult = await exportSessions(validSessions, format);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(exportResult, null, 2),\n },\n ],\n };\n } catch (error) {\n logger.error('Error exporting sessions:', error);\n return {\n content: [\n {\n type: 'text',\n text: `Error exporting sessions: ${error instanceof Error ? error.message : 'Unknown error'}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n}\n\n/**\n * Helper Functions\n */\n\n/**\n * Calculate quality score for a session based on current state and history\n */\nfunction calculateQualityScore(session: QueryDevelopmentSession): QualityScoreRecord {\n const timestamp = new Date().toISOString();\n \n // Calculate syntactic correctness (25%)\n const syntacticCorrectness = session.currentState.compilationStatus === 'success' ? 100 :\n session.currentState.compilationStatus === 'failed' ? 0 : 50;\n\n // Calculate test coverage and results (30%)\n const testCoverageResults = session.currentState.testStatus === 'passing' ? 100 :\n session.currentState.testStatus === 'failing' ? 25 :\n session.currentState.testStatus === 'no_tests' ? 0 : 50;\n\n // Calculate documentation quality (20%)\n const documentationQuality = session.currentState.documentationStatus === 'present' ? 100 :\n session.currentState.documentationStatus === 'incomplete' ? 60 :\n session.currentState.documentationStatus === 'missing' ? 0 : 50;\n\n // Calculate functional correctness (25%) - based on successful test runs\n const successfulTests = session.testExecutions.filter(t => t.success && t.type === 'test_run').length;\n const totalTests = session.testExecutions.filter(t => t.type === 'test_run').length;\n const functionalCorrectness = totalTests > 0 ? (successfulTests / totalTests) * 100 : 50;\n\n // Calculate overall score\n const overallScore = Math.round(\n (syntacticCorrectness * 0.25) +\n (testCoverageResults * 0.30) +\n (documentationQuality * 0.20) +\n (functionalCorrectness * 0.25)\n );\n\n // Determine grade\n const grade = overallScore >= 90 ? 'A' :\n overallScore >= 80 ? 'B' :\n overallScore >= 70 ? 'C' :\n overallScore >= 60 ? 'D' : 'F';\n\n // Generate recommendations\n const recommendations: string[] = [];\n if (syntacticCorrectness < 100) {\n recommendations.push('Fix compilation errors to improve syntactic correctness');\n }\n if (testCoverageResults < 70) {\n recommendations.push('Add comprehensive tests and ensure they pass');\n }\n if (documentationQuality < 80) {\n recommendations.push('Add or improve query documentation with examples');\n }\n if (functionalCorrectness < 80) {\n recommendations.push('Improve test pass rate and verify query logic');\n }\n\n return {\n scoreId: randomUUID(),\n timestamp,\n overallScore,\n dimensions: {\n syntacticCorrectness,\n testCoverageResults,\n documentationQuality,\n functionalCorrectness,\n },\n grade,\n recommendations,\n };\n}\n\n/**\n * Compare multiple sessions\n */\nasync function compareSessions(\n sessions: QueryDevelopmentSession[],\n dimensions?: string[]\n): Promise {\n const timestamp = new Date().toISOString();\n const sessionIds = sessions.map(s => s.sessionId);\n \n const results: Record = {\n sessionCount: sessions.length,\n sessionOverview: sessions.map(s => ({\n sessionId: s.sessionId,\n queryPath: s.queryPath,\n status: s.status,\n mcpCallsCount: s.mcpCalls.length,\n duration: s.endTime ? \n new Date(s.endTime).getTime() - new Date(s.startTime).getTime() : \n new Date().getTime() - new Date(s.startTime).getTime(),\n currentScore: s.qualityScores.length > 0 ? \n s.qualityScores[s.qualityScores.length - 1].overallScore : null,\n })),\n };\n\n if (!dimensions || dimensions.includes('quality')) {\n const qualityScores = sessions.map(s => \n s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1] : null\n );\n results.qualityComparison = {\n averageScore: qualityScores\n .filter(q => q !== null)\n .reduce((sum, q) => sum + q!.overallScore, 0) / qualityScores.filter(q => q !== null).length,\n scoreRange: {\n min: Math.min(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n max: Math.max(...qualityScores.filter(q => q !== null).map(q => q!.overallScore)),\n },\n };\n }\n\n if (!dimensions || dimensions.includes('activity')) {\n results.activityComparison = {\n totalMCPCalls: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0),\n averageCallsPerSession: sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length,\n mostActiveTool: getMostUsedTool(sessions),\n };\n }\n\n return {\n sessionIds,\n dimensions: dimensions || ['all'],\n timestamp,\n results,\n };\n}\n\n/**\n * Aggregate insights from multiple sessions\n */\nasync function aggregateSessions(\n sessions: QueryDevelopmentSession[],\n filters: SessionFilter\n): Promise {\n const timestamp = new Date().toISOString();\n \n const completedSessions = sessions.filter(s => s.status === 'completed');\n const successRate = sessions.length > 0 ? completedSessions.length / sessions.length : 0;\n \n const qualityScores = sessions\n .map(s => s.qualityScores.length > 0 ? s.qualityScores[s.qualityScores.length - 1].overallScore : null)\n .filter(score => score !== null) as number[];\n \n const averageQualityScore = qualityScores.length > 0 ? \n qualityScores.reduce((sum, score) => sum + score, 0) / qualityScores.length : 0;\n\n const commonPatterns = identifyCommonPatterns(sessions);\n const recommendations = generateAggregateRecommendations(sessions);\n\n return {\n filters,\n timestamp,\n totalSessions: sessions.length,\n successRate,\n averageQualityScore,\n commonPatterns,\n recommendations,\n };\n}\n\n/**\n * Export sessions in specified format\n */\nasync function exportSessions(\n sessions: QueryDevelopmentSession[],\n format: 'json' | 'html' | 'markdown'\n): Promise {\n const timestamp = new Date().toISOString();\n const filename = `session-export-${timestamp.replace(/[:.]/g, '-')}.${format}`;\n \n let content: string;\n \n switch (format) {\n case 'json':\n content = JSON.stringify(sessions, null, 2);\n break;\n case 'html':\n content = generateHTMLReport(sessions);\n break;\n case 'markdown':\n content = generateMarkdownReport(sessions);\n break;\n }\n\n return {\n format,\n filename,\n content,\n timestamp,\n };\n}\n\n/**\n * Utility functions\n */\n\nfunction getMostUsedTool(sessions: QueryDevelopmentSession[]): string {\n const toolCounts: Record = {};\n \n sessions.forEach(session => {\n session.mcpCalls.forEach(call => {\n toolCounts[call.toolName] = (toolCounts[call.toolName] || 0) + 1;\n });\n });\n\n return Object.entries(toolCounts)\n .sort(([, a], [, b]) => b - a)[0]?.[0] || 'none';\n}\n\nfunction identifyCommonPatterns(sessions: QueryDevelopmentSession[]): string[] {\n const patterns: string[] = [];\n \n const commonTools = getMostUsedTool(sessions);\n if (commonTools && commonTools !== 'none') {\n patterns.push(`Most commonly used tool: ${commonTools}`);\n }\n\n const completionRate = sessions.filter(s => s.status === 'completed').length / sessions.length;\n if (completionRate > 0.8) {\n patterns.push('High completion rate indicates effective workflow');\n } else if (completionRate < 0.5) {\n patterns.push('Low completion rate suggests workflow issues');\n }\n\n return patterns;\n}\n\nfunction generateAggregateRecommendations(sessions: QueryDevelopmentSession[]): string[] {\n const recommendations: string[] = [];\n \n const failedSessions = sessions.filter(s => s.status === 'failed');\n if (failedSessions.length > sessions.length * 0.3) {\n recommendations.push('High failure rate - consider improving error handling and guidance');\n }\n\n const averageCallsPerSession = sessions.reduce((sum, s) => sum + s.mcpCalls.length, 0) / sessions.length;\n if (averageCallsPerSession > 20) {\n recommendations.push('High number of MCP calls per session - consider workflow optimization');\n }\n\n return recommendations;\n}\n\nfunction generateHTMLReport(sessions: QueryDevelopmentSession[]): string {\n const html = `\n\n\n\n Session Export Report\n \n\n\n

Query Development Sessions Report

\n

Generated: ${new Date().toISOString()}

\n

Total Sessions: ${sessions.length}

\n \n ${sessions.map(session => `\n
\n

Session: ${session.sessionId}

\n

Query Path: ${session.queryPath}

\n

Status: ${session.status}

\n

Language: ${session.language}

\n

Start Time: ${session.startTime}

\n

MCP Calls: ${session.mcpCalls.length}

\n

Test Executions: ${session.testExecutions.length}

\n

Quality Scores: ${session.qualityScores.length}

\n
\n `).join('')}\n\n`;\n \n return html;\n}\n\nfunction generateMarkdownReport(sessions: QueryDevelopmentSession[]): string {\n const md = `# Query Development Sessions Report\n\nGenerated: ${new Date().toISOString()}\nTotal Sessions: ${sessions.length}\n\n## Session Summary\n\n| Session ID | Query Path | Status | Language | MCP Calls | Test Executions |\n|------------|-----------|--------|----------|-----------|-----------------|\n${sessions.map(session => \n `| ${session.sessionId} | ${session.queryPath} | ${session.status} | ${session.language} | ${session.mcpCalls.length} | ${session.testExecutions.length} |`\n).join('\\n')}\n\n## Detailed Sessions\n\n${sessions.map(session => `\n### Session: ${session.sessionId}\n\n- **Query Path:** ${session.queryPath}\n- **Status:** ${session.status}\n- **Language:** ${session.language}\n- **Start Time:** ${session.startTime}\n- **End Time:** ${session.endTime || 'N/A'}\n- **MCP Calls:** ${session.mcpCalls.length}\n- **Test Executions:** ${session.testExecutions.length}\n- **Quality Scores:** ${session.qualityScores.length}\n\n${session.recommendations.length > 0 ? `\n**Current Recommendations:**\n${session.recommendations.map(rec => `- ${rec}`).join('\\n')}\n` : ''}\n`).join('\\n')}`;\n\n return md;\n}\n\nfunction _calculateAverageDuration(sessions: QueryDevelopmentSession[]): number {\n const completedSessions = sessions.filter(s => s.endTime);\n if (completedSessions.length === 0) return 0;\n\n const totalDuration = completedSessions.reduce((sum, session) => {\n return sum + (new Date(session.endTime!).getTime() - new Date(session.startTime).getTime());\n }, 0);\n\n return totalDuration / completedSessions.length;\n}\n\nfunction _identifyFailureReasons(results: FunctionalTestResult[]): string[] {\n const failedResults = results.filter(r => !r.passed);\n const reasons: Record = {};\n\n failedResults.forEach(result => {\n Object.entries(result.criteria).forEach(([criterion, passed]) => {\n if (!passed) {\n reasons[criterion] = (reasons[criterion] || 0) + 1;\n }\n });\n });\n\n return Object.entries(reasons)\n .sort(([, a], [, b]) => b - a)\n .map(([reason, count]) => `${reason}: ${count} sessions`);\n}\n\n/**\n * Generate recommendations for MCP tool responses\n * Returns a map of MCP primitive paths to recommendation reasons\n */\nfunction generateRecommendations(\n session: QueryDevelopmentSession | null,\n currentTool: string\n): Record {\n if (!session) {\n return {};\n }\n\n const recommendations: Record = {};\n\n // Session state-based recommendations\n if (session.currentState.compilationStatus === 'failed') {\n recommendations['codeql_query_format'] = 'Format query to fix potential syntax issues';\n recommendations['codeql_query_compile'] = 'Recompile after fixing syntax errors';\n } else if (session.currentState.compilationStatus === 'success') {\n if (session.currentState.testStatus === 'unknown' || session.currentState.testStatus === 'no_tests') {\n recommendations['codeql_test_run'] = 'Run tests to validate query functionality';\n } else if (session.currentState.testStatus === 'failing') {\n recommendations['session_get_test_history'] = 'Review test failures to identify issues';\n recommendations['codeql_query_compile'] = 'Verify query logic matches test expectations';\n } else if (session.currentState.testStatus === 'passing') {\n recommendations['session_calculate_current_score'] = 'Calculate quality score for completed query';\n }\n }\n\n // Tool-specific follow-up recommendations\n switch (currentTool) {\n case 'session_get':\n if (session.mcpCalls.length === 0) {\n recommendations['codeql_query_compile'] = 'Start development by compiling the query';\n }\n break;\n case 'session_end':\n if (session.status === 'completed') {\n recommendations['sessions_export'] = 'Export session data for analysis';\n }\n break;\n case 'session_calculate_current_score': {\n const latestScore = session.qualityScores[session.qualityScores.length - 1];\n if (latestScore && latestScore.overallScore < 80) {\n if (latestScore.dimensions.syntacticCorrectness < 100) {\n recommendations['codeql_query_format'] = 'Improve syntax and formatting';\n }\n if (latestScore.dimensions.testCoverageResults < 70) {\n recommendations['codeql_test_run'] = 'Improve test coverage and results';\n }\n }\n break;\n }\n case 'session_update_state':\n // Recommend next logical step based on updated state\n if (session.currentState.compilationStatus === 'success' && session.currentState.testStatus === 'unknown') {\n recommendations['codeql_test_run'] = 'Run tests now that compilation is successful';\n }\n break;\n }\n\n return recommendations;\n}\n\n/**\n * Generate recommendations for session list results\n */\nfunction generateListRecommendations(sessions: QueryDevelopmentSession[]): Record {\n const recommendations: Record = {};\n\n const activeSessions = sessions.filter(s => s.status === 'active');\n const completedSessions = sessions.filter(s => s.status === 'completed');\n\n if (activeSessions.length > 0) {\n recommendations['session_get'] = `Review details of ${activeSessions.length} active session(s)`;\n }\n\n if (completedSessions.length > 1) {\n recommendations['sessions_compare'] = 'Compare completed sessions to identify patterns';\n recommendations['sessions_aggregate'] = 'Generate aggregate insights from multiple sessions';\n }\n\n if (sessions.length > 5) {\n recommendations['sessions_export'] = 'Export session data for comprehensive analysis';\n }\n\n return recommendations;\n}", "function checkArgs(adapter, defaultData) {\n if (adapter === undefined)\n throw new Error('lowdb: missing adapter');\n if (defaultData === undefined)\n throw new Error('lowdb: missing default data');\n}\nexport class Low {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n async read() {\n const data = await this.adapter.read();\n if (data)\n this.data = data;\n }\n async write() {\n if (this.data)\n await this.adapter.write(this.data);\n }\n async update(fn) {\n fn(this.data);\n await this.write();\n }\n}\nexport class LowSync {\n adapter;\n data;\n constructor(adapter, defaultData) {\n checkArgs(adapter, defaultData);\n this.adapter = adapter;\n this.data = defaultData;\n }\n read() {\n const data = this.adapter.read();\n if (data)\n this.data = data;\n }\n write() {\n if (this.data)\n this.adapter.write(this.data);\n }\n update(fn) {\n fn(this.data);\n this.write();\n }\n}\n", "import { readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { Writer } from 'steno';\nexport class TextFile {\n #filename;\n #writer;\n constructor(filename) {\n this.#filename = filename;\n this.#writer = new Writer(filename);\n }\n async read() {\n let data;\n try {\n data = await readFile(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n return this.#writer.write(str);\n }\n}\nexport class TextFileSync {\n #tempFilename;\n #filename;\n constructor(filename) {\n this.#filename = filename;\n const f = filename.toString();\n this.#tempFilename = path.join(path.dirname(f), `.${path.basename(f)}.tmp`);\n }\n read() {\n let data;\n try {\n data = readFileSync(this.#filename, 'utf-8');\n }\n catch (e) {\n if (e.code === 'ENOENT') {\n return null;\n }\n throw e;\n }\n return data;\n }\n write(str) {\n writeFileSync(this.#tempFilename, str);\n renameSync(this.#tempFilename, this.#filename);\n }\n}\n", "import { TextFile, TextFileSync } from './TextFile.js';\nexport class DataFile {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFile(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n async read() {\n const data = await this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n return this.#adapter.write(this.#stringify(obj));\n }\n}\nexport class DataFileSync {\n #adapter;\n #parse;\n #stringify;\n constructor(filename, { parse, stringify, }) {\n this.#adapter = new TextFileSync(filename);\n this.#parse = parse;\n this.#stringify = stringify;\n }\n read() {\n const data = this.#adapter.read();\n if (data === null) {\n return null;\n }\n else {\n return this.#parse(data);\n }\n }\n write(obj) {\n this.#adapter.write(this.#stringify(obj));\n }\n}\n", "import { DataFile, DataFileSync } from './DataFile.js';\nexport class JSONFile extends DataFile {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\nexport class JSONFileSync extends DataFileSync {\n constructor(filename) {\n super(filename, {\n parse: JSON.parse,\n stringify: (data) => JSON.stringify(data, null, 2),\n });\n }\n}\n", "/**\n * Session Data Management\n * Provides unified JSON storage and session lifecycle management using lowdb\n */\n\nimport { Low } from 'lowdb';\nimport { JSONFileSync } from 'lowdb/node';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport { getPackageRootDir } from '../utils/package-paths';\nimport {\n QueryDevelopmentSession,\n QueryState,\n MCPCallRecord,\n TestExecutionRecord,\n QualityScoreRecord,\n SessionFilter,\n MonitoringConfig,\n MonitoringConfigSchema,\n} from '../types/monitoring';\nimport { logger } from '../utils/logger';\n\n/**\n * Database schema for lowdb - sessions only\n */\ninterface SessionDatabase {\n sessions: QueryDevelopmentSession[];\n}\n\n/**\n * Session Data Manager - handles all session persistence and lifecycle\n */\nexport class SessionDataManager {\n private db: Low;\n private config: MonitoringConfig;\n private storageDir: string;\n\n constructor(configOverrides: Partial = {}) {\n this.config = MonitoringConfigSchema.parse({\n ...MonitoringConfigSchema.parse({}),\n ...configOverrides,\n });\n\n this.storageDir = this.config.storageLocation;\n this.ensureStorageDirectory();\n\n const adapter = new JSONFileSync(join(this.storageDir, 'sessions.json'));\n this.db = new Low(adapter, {\n sessions: [],\n });\n\n this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n async initialize(): Promise {\n await this.initializeDatabase();\n }\n\n /**\n * Initialize the database and ensure it's properly set up\n */\n private async initializeDatabase(): Promise {\n try {\n await this.db.read();\n \n logger.info(`Session data manager initialized with ${this.db.data.sessions.length} sessions`);\n } catch (error) {\n logger.error('Failed to initialize session database:', error);\n throw error;\n }\n }\n\n /**\n * Ensure storage directory structure exists\n */\n private ensureStorageDirectory(): void {\n try {\n // mkdirSync with recursive: true is a no-op if directories already exist\n mkdirSync(this.storageDir, { recursive: true });\n\n // Create subdirectories\n const subdirs = ['sessions-archive', 'exports'];\n for (const subdir of subdirs) {\n mkdirSync(join(this.storageDir, subdir), { recursive: true });\n }\n\n // Use 'wx' flag (exclusive create) to atomically create config only\n // if it doesn't exist, avoiding TOCTOU race (CWE-367).\n const configPath = join(this.storageDir, 'config.json');\n try {\n writeFileSync(configPath, JSON.stringify(this.config, null, 2), { flag: 'wx' });\n } catch (e: unknown) {\n const err = e as { code?: string };\n if (err.code !== 'EEXIST') throw e;\n }\n\n logger.debug(`Storage directory initialized: ${this.storageDir}`);\n } catch (error) {\n logger.error('Failed to create storage directory:', error);\n throw error;\n }\n }\n\n /**\n * Start a new query development session\n */\n async startSession(\n queryPath: string,\n language?: string,\n queryType?: string,\n description?: string\n ): Promise {\n const sessionId = randomUUID();\n const startTime = new Date().toISOString();\n\n const session: QueryDevelopmentSession = {\n sessionId,\n queryPath,\n language: language || 'unknown',\n queryType,\n description,\n startTime,\n status: 'active',\n mcpCalls: [],\n testExecutions: [],\n qualityScores: [],\n currentState: {\n filesPresent: [],\n compilationStatus: 'unknown',\n testStatus: 'unknown',\n documentationStatus: 'unknown',\n lastActivity: startTime,\n },\n recommendations: [],\n };\n\n await this.db.read();\n this.db.data.sessions.push(session);\n await this.db.write();\n\n logger.info(`Started new session: ${sessionId} for query: ${queryPath}`);\n return sessionId;\n }\n\n /**\n * End a session with final status\n */\n async endSession(\n sessionId: string,\n status: 'completed' | 'failed' | 'abandoned'\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.status = status;\n session.endTime = new Date().toISOString();\n session.currentState.lastActivity = session.endTime;\n\n await this.db.write();\n\n // Archive completed session if enabled\n if (this.config.archiveCompletedSessions && status === 'completed') {\n await this.archiveSession(sessionId);\n }\n\n logger.info(`Ended session: ${sessionId} with status: ${status}`);\n return session;\n }\n\n /**\n * Get a specific session by ID\n */\n async getSession(sessionId: string): Promise {\n await this.db.read();\n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n return session || null;\n }\n\n /**\n * List sessions with optional filtering\n */\n async listSessions(filters?: SessionFilter): Promise {\n await this.db.read();\n let sessions = [...this.db.data.sessions];\n\n if (filters) {\n if (filters.queryPath) {\n sessions = sessions.filter(s => s.queryPath.includes(filters.queryPath!));\n }\n if (filters.status) {\n sessions = sessions.filter(s => s.status === filters.status);\n }\n if (filters.language) {\n sessions = sessions.filter(s => s.language === filters.language);\n }\n if (filters.queryType) {\n sessions = sessions.filter(s => s.queryType === filters.queryType);\n }\n if (filters.dateRange) {\n const [start, end] = filters.dateRange;\n sessions = sessions.filter(s => \n s.startTime >= start && s.startTime <= end\n );\n }\n }\n\n return sessions;\n }\n\n /**\n * Update session state\n */\n async updateSessionState(\n sessionId: string,\n stateUpdate: Partial\n ): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found: ${sessionId}`);\n return null;\n }\n\n session.currentState = {\n ...session.currentState,\n ...stateUpdate,\n lastActivity: new Date().toISOString(),\n };\n\n await this.db.write();\n return session;\n }\n\n /**\n * Add MCP call record to session\n */\n async addMCPCall(sessionId: string, callRecord: MCPCallRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for MCP call: ${sessionId}`);\n return;\n }\n\n session.mcpCalls.push(callRecord);\n session.currentState.lastActivity = callRecord.timestamp;\n\n // Update next suggested tool if provided\n if (callRecord.nextSuggestedTool) {\n session.nextSuggestedTool = callRecord.nextSuggestedTool;\n }\n\n await this.db.write();\n }\n\n /**\n * Add test execution record to session\n */\n async addTestExecution(sessionId: string, testRecord: TestExecutionRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for test execution: ${sessionId}`);\n return;\n }\n\n session.testExecutions.push(testRecord);\n session.currentState.lastActivity = testRecord.timestamp;\n\n // Update compilation/test status based on execution\n if (testRecord.type === 'compilation') {\n session.currentState.compilationStatus = testRecord.success ? 'success' : 'failed';\n } else if (testRecord.type === 'test_run') {\n session.currentState.testStatus = testRecord.success ? 'passing' : 'failing';\n }\n\n await this.db.write();\n }\n\n /**\n * Add quality score record to session\n */\n async addQualityScore(sessionId: string, scoreRecord: QualityScoreRecord): Promise {\n await this.db.read();\n \n const session = this.db.data.sessions.find(s => s.sessionId === sessionId);\n if (!session) {\n logger.warn(`Session not found for quality score: ${sessionId}`);\n return;\n }\n\n session.qualityScores.push(scoreRecord);\n session.currentState.lastActivity = scoreRecord.timestamp;\n session.recommendations = scoreRecord.recommendations;\n\n await this.db.write();\n }\n\n /**\n * Archive a completed session to monthly file\n */\n private async archiveSession(sessionId: string): Promise {\n try {\n const session = await this.getSession(sessionId);\n if (!session) return;\n\n const date = new Date(session.endTime || session.startTime);\n const monthDir = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;\n const archiveDir = join(this.storageDir, 'sessions-archive', monthDir);\n\n mkdirSync(archiveDir, { recursive: true });\n\n const archiveFile = join(archiveDir, `${sessionId}.json`);\n writeFileSync(archiveFile, JSON.stringify(session, null, 2));\n\n // Remove from active sessions\n await this.db.read();\n this.db.data.sessions = this.db.data.sessions.filter(s => s.sessionId !== sessionId);\n await this.db.write();\n\n logger.info(`Archived session: ${sessionId} to ${archiveFile}`);\n } catch (error) {\n logger.error(`Failed to archive session ${sessionId}:`, error);\n }\n }\n\n /**\n * Get active sessions for a specific query path\n */\n async getActiveSessionsForQuery(queryPath: string): Promise {\n await this.db.read();\n return this.db.data.sessions.filter(s => \n s.queryPath === queryPath && s.status === 'active'\n );\n }\n\n /**\n * Clean up old sessions based on retention policy\n */\n async cleanupOldSessions(): Promise {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);\n const cutoffTimestamp = cutoffDate.toISOString();\n\n await this.db.read();\n const sessionsToRemove = this.db.data.sessions.filter(s => \n s.endTime && s.endTime < cutoffTimestamp\n );\n\n if (sessionsToRemove.length > 0) {\n this.db.data.sessions = this.db.data.sessions.filter(s => \n !s.endTime || s.endTime >= cutoffTimestamp\n );\n await this.db.write();\n\n logger.info(`Cleaned up ${sessionsToRemove.length} old sessions`);\n }\n }\n\n /**\n * Get configuration\n */\n getConfig(): MonitoringConfig {\n return this.config;\n }\n\n /**\n * Update configuration\n */\n async updateConfig(configUpdate: Partial): Promise {\n this.config = MonitoringConfigSchema.parse({\n ...this.config,\n ...configUpdate,\n });\n\n // Update config.json file only\n const configPath = join(this.storageDir, 'config.json');\n writeFileSync(configPath, JSON.stringify(this.config, null, 2));\n\n logger.info('Updated monitoring configuration');\n }\n}\n\n/**\n * Parse boolean environment variable\n */\nfunction parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolean {\n if (envVar === undefined) return defaultValue;\n return envVar.toLowerCase() === 'true' || envVar === '1';\n}\n\n// Export singleton instance with environment variable support\nexport const sessionDataManager = new SessionDataManager({\n storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getPackageRootDir(), '.ql-mcp-tracking'),\n enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false),\n});", "import { z } from 'zod';\n\n/**\n * Monitoring and Reporting types for CodeQL Development MCP Server\n * Based on the specification in docs/mcp-server-monitoring-and-reporting.md\n */\n\n/**\n * MCP Call Record - captures individual MCP tool calls\n */\nexport const MCPCallRecordSchema = z.object({\n callId: z.string(),\n timestamp: z.string(), // ISO timestamp\n toolName: z.string(),\n parameters: z.record(z.any()),\n result: z.any(),\n success: z.boolean(),\n duration: z.number(), // milliseconds\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type MCPCallRecord = z.infer;\n\n/**\n * Test Execution Record - captures query compilation and test runs\n */\nexport const TestExecutionRecordSchema = z.object({\n executionId: z.string(),\n timestamp: z.string(),\n type: z.enum(['compilation', 'test_run', 'database_build']),\n success: z.boolean(),\n details: z.record(z.any()),\n metrics: z.object({\n passRate: z.number().optional(),\n coverage: z.number().optional(),\n performance: z.number().optional(),\n }).optional(),\n});\n\nexport type TestExecutionRecord = z.infer;\n\n/**\n * Quality Score Record - multi-dimensional quality assessment\n */\nexport const QualityScoreRecordSchema = z.object({\n scoreId: z.string(),\n timestamp: z.string(),\n overallScore: z.number().min(0).max(100), // 0-100\n dimensions: z.object({\n syntacticCorrectness: z.number().min(0).max(100),\n testCoverageResults: z.number().min(0).max(100),\n documentationQuality: z.number().min(0).max(100),\n functionalCorrectness: z.number().min(0).max(100),\n }),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n recommendations: z.array(z.string()),\n});\n\nexport type QualityScoreRecord = z.infer;\n\n/**\n * Query State - current state of the query development\n */\nexport const QueryStateSchema = z.object({\n filesPresent: z.array(z.string()),\n compilationStatus: z.enum(['unknown', 'success', 'failed']),\n testStatus: z.enum(['unknown', 'passing', 'failing', 'no_tests']),\n documentationStatus: z.enum(['unknown', 'present', 'missing', 'incomplete']),\n lastActivity: z.string(), // ISO timestamp\n});\n\nexport type QueryState = z.infer;\n\n/**\n * Query Development Session - main data structure for tracking\n */\nexport const QueryDevelopmentSessionSchema = z.object({\n // Session Metadata\n sessionId: z.string(),\n queryPath: z.string(),\n language: z.string(),\n queryType: z.string().optional(),\n description: z.string().optional(),\n startTime: z.string(), // ISO timestamp\n endTime: z.string().optional(), // ISO timestamp\n status: z.enum(['active', 'completed', 'failed', 'abandoned']),\n\n // MCP Call History\n mcpCalls: z.array(MCPCallRecordSchema),\n\n // Test Execution Records\n testExecutions: z.array(TestExecutionRecordSchema),\n\n // Quality Metrics\n qualityScores: z.array(QualityScoreRecordSchema),\n\n // Development State\n currentState: QueryStateSchema,\n recommendations: z.array(z.string()),\n nextSuggestedTool: z.string().optional(),\n});\n\nexport type QueryDevelopmentSession = z.infer;\n\n/**\n * Session Filter for listing and searching\n */\nexport const SessionFilterSchema = z.object({\n queryPath: z.string().optional(),\n status: z.string().optional(),\n dateRange: z.tuple([z.string(), z.string()]).optional(),\n language: z.string().optional(),\n queryType: z.string().optional(),\n});\n\nexport type SessionFilter = z.infer;\n\n/**\n * Comparison Report for analyzing multiple sessions\n */\nexport const ComparisonReportSchema = z.object({\n sessionIds: z.array(z.string()),\n dimensions: z.array(z.string()),\n timestamp: z.string(),\n results: z.record(z.any()),\n});\n\nexport type ComparisonReport = z.infer;\n\n/**\n * Aggregate Report for batch analysis\n */\nexport const AggregateReportSchema = z.object({\n filters: SessionFilterSchema,\n timestamp: z.string(),\n totalSessions: z.number(),\n successRate: z.number(),\n averageQualityScore: z.number(),\n commonPatterns: z.array(z.string()),\n recommendations: z.array(z.string()),\n});\n\nexport type AggregateReport = z.infer;\n\n/**\n * Export Result for data export operations\n */\nexport const ExportResultSchema = z.object({\n format: z.enum(['json', 'html', 'markdown']),\n filename: z.string(),\n content: z.string(),\n timestamp: z.string(),\n});\n\nexport type ExportResult = z.infer;\n\n/**\n * Functional Test Result for automated testing\n */\nexport const FunctionalTestResultSchema = z.object({\n sessionId: z.string(),\n queryPath: z.string(),\n passed: z.boolean(),\n criteria: z.record(z.any()),\n details: z.record(z.any()),\n timestamp: z.string(),\n});\n\nexport type FunctionalTestResult = z.infer;\n\n/**\n * Test Report for comprehensive test analysis\n */\nexport const TestReportSchema = z.object({\n sessionIds: z.array(z.string()),\n criteria: z.record(z.any()),\n timestamp: z.string(),\n overallPassRate: z.number(),\n results: z.array(FunctionalTestResultSchema),\n summary: z.record(z.any()),\n});\n\nexport type TestReport = z.infer;\n\n/**\n * Monitoring Configuration\n */\nexport const MonitoringConfigSchema = z.object({\n storageLocation: z.string().default('.ql-mcp-tracking/'),\n autoTrackSessions: z.boolean().default(true),\n retentionDays: z.number().default(90),\n includeCallParameters: z.boolean().default(true),\n includeCallResults: z.boolean().default(true),\n maxActiveSessionsPerQuery: z.number().default(3),\n scoringFrequency: z.enum(['per_call', 'periodic', 'manual']).default('per_call'),\n archiveCompletedSessions: z.boolean().default(true),\n enableRecommendations: z.boolean().default(true),\n enableMonitoringTools: z.boolean().default(false), // Opt-in: session_* tools disabled by default for end-users\n});\n\nexport type MonitoringConfig = z.infer;"], + "mappings": "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", "names": ["binary", "dirname", "existsSync", "readFileSync", "resolve", "pathToFileURL", "z", "dirname", "isAbsolute", "mkdirSync", "existsSync", "join", "resolve", "mkdirSync", "resolve", "existsSync", "mkdirSync", "timestamp", "join", "writeFileSync", "existsSync", "mkdirSync", "basename", "dirname", "isAbsolute", "join", "resolve", "isAbsolute", "resolve", "join", "writeFileSync", "existsSync", "logger", "executeCodeQLCommand", "basename", "mkdirSync", "dirname", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "readFile", "z", "exception", "map", "schema", "type", "extend", "str", "string", "z", "z", "z", "z", "z", "z", "setTimeout", "delimiter", "join", "delimiter", "resolve", "setTimeout", "join", "join", "resolve", "pathToFileURL", "z", "z", "z", "z", "z", "z", "writeFileSync", "readFileSync", "existsSync", "join", "dirname", "basename", "mkdirSync", "z", "z", "z", "z", "z", "z", "join", "resolve", "resolve", "join", "z", "z", "resolve", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "fs", "path", "getLanguageExtension", "z", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "readFileSync", "existsSync", "join", "join", "existsSync", "readFileSync", "z", "basename", "readFileSync", "join", "dirname", "fileURLToPath", "__filename", "__dirname", "z", "basename", "z", "randomUUID", "readFileSync", "writeFileSync", "path", "path", "readFileSync", "str", "writeFileSync", "parse", "mkdirSync", "writeFileSync", "join", "z", "join", "mkdirSync", "writeFileSync", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/package.json b/server/package.json index 1e1fe8cf..84ff9718 100644 --- a/server/package.json +++ b/server/package.json @@ -3,7 +3,6 @@ "version": "2.23.9", "description": "An MCP server supporting LLM requests for CodeQL development tools and resources.", "main": "dist/codeql-development-mcp-server.js", - "types": "dist/codeql-development-mcp-server.d.ts", "type": "module", "bin": { "codeql-development-mcp-server": "./dist/codeql-development-mcp-server.js" diff --git a/server/src/lib/cli-executor.ts b/server/src/lib/cli-executor.ts index 59081cd8..a6cb356e 100644 --- a/server/src/lib/cli-executor.ts +++ b/server/src/lib/cli-executor.ts @@ -166,7 +166,7 @@ export function resolveCodeQLBinary(): string { } resolvedCodeQLDir = dirname(envPath); - resolvedBinaryResult = envPath; + resolvedBinaryResult = 'codeql'; logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`); return resolvedBinaryResult; } diff --git a/server/src/utils/package-paths.ts b/server/src/utils/package-paths.ts index 03a01b08..ca26b34b 100644 --- a/server/src/utils/package-paths.ts +++ b/server/src/utils/package-paths.ts @@ -25,10 +25,14 @@ const __dirname = dirname(__filename); /** * Detect whether the current __dirname looks like source code (`src/lib` or * `src/utils`) vs a bundled flat output directory (`dist/`). + * + * Uses a tail-of-path check so that unrelated `/src/` segments earlier in the + * install path (e.g. `~/src/project/node_modules/.../dist`) don't cause a + * false positive. */ function isRunningFromSource(dir: string): boolean { const normalized = dir.replace(/\\/g, '/'); - return normalized.includes('/src/'); + return /\/src(\/[^/]+)?$/.test(normalized); } /** diff --git a/server/test/src/lib/cli-executor.test.ts b/server/test/src/lib/cli-executor.test.ts index 47cef27c..d773e780 100644 --- a/server/test/src/lib/cli-executor.test.ts +++ b/server/test/src/lib/cli-executor.test.ts @@ -3,9 +3,10 @@ */ import { describe, it, expect, beforeAll, afterAll, afterEach, vi } from 'vitest'; -import { mkdirSync, writeFileSync, rmSync, chmodSync } from 'fs'; +import { writeFileSync, rmSync, chmodSync } from 'fs'; import { execFileSync } from 'child_process'; import { join } from 'path'; +import { createProjectTempDir } from '../../../src/utils/temp-dir'; import { buildCodeQLArgs, buildQLTArgs, @@ -603,17 +604,16 @@ describe('resolveCodeQLBinary', () => { expect(getResolvedCodeQLDir()).toBeNull(); }); - it('should return the full path and set dir to parent directory', () => { + it('should return bare codeql command and set dir to parent directory', () => { // Create a temporary file named "codeql" to pass validation - const tmpDir = join(process.cwd(), '.tmp', 'codeql-path-test'); + const tmpDir = createProjectTempDir('codeql-path-test-'); const codeqlPath = join(tmpDir, 'codeql'); - mkdirSync(tmpDir, { recursive: true }); writeFileSync(codeqlPath, '#!/bin/sh\necho test', { mode: 0o755 }); try { process.env.CODEQL_PATH = codeqlPath; const result = resolveCodeQLBinary(); - expect(result).toBe(codeqlPath); + expect(result).toBe('codeql'); expect(getResolvedCodeQLDir()).toBe(tmpDir); } finally { rmSync(tmpDir, { recursive: true, force: true }); @@ -696,9 +696,8 @@ describe('CODEQL_PATH - PATH prepend integration', () => { it('should prepend CODEQL_PATH directory to child process PATH', async () => { // Create a temporary directory with a fake "codeql" script - const tmpDir = join(process.cwd(), '.tmp', 'codeql-path-prepend-test'); + const tmpDir = createProjectTempDir('codeql-path-prepend-test-'); const codeqlPath = join(tmpDir, 'codeql'); - mkdirSync(tmpDir, { recursive: true }); writeFileSync(codeqlPath, '#!/bin/sh\necho test', { mode: 0o755 }); chmodSync(codeqlPath, 0o755); @@ -755,9 +754,8 @@ describe('validateCodeQLBinaryReachable', () => { it('should throw a descriptive error when codeql is not reachable', async () => { // Create a temporary directory with a fake "codeql" that exits with error - const tmpDir = join(process.cwd(), '.tmp', 'codeql-unreachable-test'); + const tmpDir = createProjectTempDir('codeql-unreachable-test-'); const codeqlPath = join(tmpDir, 'codeql'); - mkdirSync(tmpDir, { recursive: true }); // Create a script that fails immediately writeFileSync(codeqlPath, '#!/bin/sh\nexit 1', { mode: 0o755 }); chmodSync(codeqlPath, 0o755); @@ -773,9 +771,8 @@ describe('validateCodeQLBinaryReachable', () => { }); it('should include guidance about CODEQL_PATH in error message', async () => { - const tmpDir = join(process.cwd(), '.tmp', 'codeql-guidance-test'); + const tmpDir = createProjectTempDir('codeql-guidance-test-'); const codeqlPath = join(tmpDir, 'codeql'); - mkdirSync(tmpDir, { recursive: true }); writeFileSync(codeqlPath, '#!/bin/sh\nexit 1', { mode: 0o755 }); chmodSync(codeqlPath, 0o755); From 6d9c9278da42ce2009bf0538d1554fc3815416a4 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sun, 8 Feb 2026 10:47:58 -0700 Subject: [PATCH 6/9] Standardize on node24 : v24.13.0 This commit: - addresses the latest PR review comments for #24 - enforces consistent repo use of node v24.13.0 / node24 --- .devcontainer/devcontainer.json | 2 +- .github/workflows/release.yml | 1 + .node-version | 2 +- README.md | 2 +- client/package.json | 2 +- docs/getting-started.md | 2 +- docs/public.md | 4 +- package-lock.json | 784 +-------------------------- package.json | 2 +- server/README.md | 2 +- server/esbuild.config.js | 2 +- server/package.json | 4 +- server/test/src/utils/logger.test.ts | 12 +- 13 files changed, 39 insertions(+), 782 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 19acfea1..6424e9a4 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "image": "mcr.microsoft.com/devcontainers/typescript-node:22", + "image": "mcr.microsoft.com/devcontainers/typescript-node:24", "customizations": { "vscode": { "extensions": [ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4e067655..2fe22938 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,6 +38,7 @@ jobs: cache: 'npm' node-version-file: '.node-version' registry-url: 'https://npm.pkg.github.com' + scope: '@advanced-security' - name: Release - Determine version id: version diff --git a/.node-version b/.node-version index 7cef2a09..e8416a15 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -v25.2.1 +v24.13.0 diff --git a/README.md b/README.md index af10813c..f7f9fcac 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Please note that this project is released with a [Contributor Code of Conduct](C ### Environment -- **Node.js** v25.2.1 or later ([nodejs.org](https://nodejs.org/)) +- **Node.js** v24.13.0 or later ([nodejs.org](https://nodejs.org/)) - **Some calling LLM** Bring your own LLM, but some LLMs are (much) better than others. ### External Dependencies diff --git a/client/package.json b/client/package.json index 4728bd33..2d34cc34 100644 --- a/client/package.json +++ b/client/package.json @@ -23,7 +23,7 @@ "author": "@github/ps-codeql", "license": "SEE LICENSE IN LICENSE", "engines": { - "node": ">=25.2.1", + "node": ">=24.13.0", "npm": ">=11.6.2" }, "dependencies": { diff --git a/docs/getting-started.md b/docs/getting-started.md index 24c684b1..5d874d4e 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -4,7 +4,7 @@ This guide covers installation, configuration, and usage of the CodeQL Developme ## Prerequisites -- **Node.js** v25.2.1 or later ([nodejs.org](https://nodejs.org/)) +- **Node.js** v24.13.0 or later ([nodejs.org](https://nodejs.org/)) - **CodeQL CLI** ([github.com/github/codeql-cli-binaries](https://github.com/github/codeql-cli-binaries/releases)) - **VS Code** with GitHub Copilot extension diff --git a/docs/public.md b/docs/public.md index ee8164bb..731a94a8 100644 --- a/docs/public.md +++ b/docs/public.md @@ -12,14 +12,14 @@ Users install the server via `npm` and the tool query packs via `codeql pack dow | Dependency | Minimum Version | Purpose | | ---------------------------------------------------------------------------------------------------- | --------------- | ------------------------------- | -| [Node.js](https://nodejs.org/) | v22.0.0 | Runtime for the MCP server | +| [Node.js](https://nodejs.org/) | v24.13.0 | Runtime for the MCP server | | [CodeQL CLI](https://github.com/github/codeql-cli-binaries/releases) | Latest | Query compilation and execution | | [VS Code](https://code.visualstudio.com/) with [GitHub Copilot](https://github.com/features/copilot) | Latest | IDE with MCP support | Verify prerequisites: ```bash -node --version # >= v22.0.0 +node --version # >= v24.13.0 codeql --version # any recent release ``` diff --git a/package-lock.json b/package-lock.json index fd1921b2..887ddb08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "typescript-eslint": "^8.54.0" }, "engines": { - "node": ">=25.2.1", + "node": ">=24.13.0", "npm": ">=11.6.2" } }, @@ -45,7 +45,7 @@ "prettier": "^3.8.1" }, "engines": { - "node": ">=25.2.1", + "node": ">=24.13.0", "npm": ">=11.6.2" } }, @@ -113,401 +113,10 @@ "node": ">=18" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -515,41 +124,7 @@ "license": "MIT", "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" + "darwin" ], "engines": { "node": ">=18" @@ -866,34 +441,6 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", - "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", - "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.57.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", @@ -908,314 +455,6 @@ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", - "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", - "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", - "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", - "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", - "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", - "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", - "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", - "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", - "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", - "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", - "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", - "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", - "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", - "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", - "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", - "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", - "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", - "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", - "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", - "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", - "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", - "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -1415,6 +654,7 @@ "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", @@ -1787,6 +1027,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2551,6 +1792,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -2896,6 +2138,7 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -3577,6 +2820,7 @@ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -4098,6 +3342,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4171,6 +3416,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -4246,6 +3492,7 @@ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", @@ -4384,6 +3631,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -4430,7 +3678,7 @@ "vitest": "^4.0.18" }, "engines": { - "node": ">=25.2.1", + "node": ">=24.13.0", "npm": ">=11.6.2" } } diff --git a/package.json b/package.json index f2d02c2f..82811073 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "author": "@github/ps-codeql", "license": "SEE LICENSE IN LICENSE", "engines": { - "node": ">=25.2.1", + "node": ">=24.13.0", "npm": ">=11.6.2" }, "devDependencies": { diff --git a/server/README.md b/server/README.md index 1b838ab8..8367cfe3 100644 --- a/server/README.md +++ b/server/README.md @@ -62,7 +62,7 @@ server/ ### Server Won't Start -1. **Check Node.js version**: The server requires Node.js v22.0.0 or later +1. **Check Node.js version**: The server requires Node.js v24.13.0 or later ```bash node --version diff --git a/server/esbuild.config.js b/server/esbuild.config.js index 1096cea8..ff20601e 100644 --- a/server/esbuild.config.js +++ b/server/esbuild.config.js @@ -17,7 +17,7 @@ const config = { outfile: outFile, format: 'esm', platform: 'node', - target: 'node22', + target: 'node24', sourcemap: true, external: [ '@modelcontextprotocol/sdk', diff --git a/server/package.json b/server/package.json index 84ff9718..7e3bba79 100644 --- a/server/package.json +++ b/server/package.json @@ -49,8 +49,8 @@ "url": "https://github.com/advanced-security/codeql-development-mcp-server/issues" }, "engines": { - "node": ">=22.0.0", - "npm": ">=10.0.0" + "node": ">=24.13.0", + "npm": ">=11.6.2" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", diff --git a/server/test/src/utils/logger.test.ts b/server/test/src/utils/logger.test.ts index 7895803f..0fc9dcda 100644 --- a/server/test/src/utils/logger.test.ts +++ b/server/test/src/utils/logger.test.ts @@ -82,7 +82,11 @@ describe('Logger', () => { // Only the beforeEach spy call should exist, not any from logger.debug expect(consoleSpy.error).not.toHaveBeenCalled(); - process.env.DEBUG = originalDebug; + if (originalDebug === undefined) { + delete process.env.DEBUG; + } else { + process.env.DEBUG = originalDebug; + } }); it('should log debug messages to stderr when DEBUG is set', () => { @@ -95,7 +99,11 @@ describe('Logger', () => { const call = consoleSpy.error.mock.calls[0][0]; expect(call).toMatch(/\[DEBUG\] \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z Debug message/); - process.env.DEBUG = originalDebug; + if (originalDebug === undefined) { + delete process.env.DEBUG; + } else { + process.env.DEBUG = originalDebug; + } }); }); }); From 97762c13d3d1461a1e776793ce2b6bdfbdf80763 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sun, 8 Feb 2026 13:06:51 -0700 Subject: [PATCH 7/9] Update package-lock.json --- package-lock.json | 531 ---------------------------------------------- 1 file changed, 531 deletions(-) diff --git a/package-lock.json b/package-lock.json index 887ddb08..5d51cdd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,8 +55,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -65,8 +63,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -75,8 +71,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -91,8 +85,6 @@ }, "node_modules/@babel/types": { "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "dev": true, "license": "MIT", "dependencies": { @@ -105,8 +97,6 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", "engines": { @@ -115,8 +105,6 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -132,8 +120,6 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -151,8 +137,6 @@ }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -164,8 +148,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -174,8 +156,6 @@ }, "node_modules/@eslint/config-array": { "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -189,8 +169,6 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -202,8 +180,6 @@ }, "node_modules/@eslint/core": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -215,8 +191,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -239,8 +213,6 @@ }, "node_modules/@eslint/js": { "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -252,8 +224,6 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -262,8 +232,6 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -276,8 +244,6 @@ }, "node_modules/@hono/node-server": { "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", "license": "MIT", "engines": { "node": ">=18.14.1" @@ -288,8 +254,6 @@ }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -298,8 +262,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -312,8 +274,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -326,8 +286,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -340,8 +298,6 @@ }, "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": { @@ -350,15 +306,11 @@ }, "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": { @@ -368,8 +320,6 @@ }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", - "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9", @@ -408,8 +358,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -424,14 +372,10 @@ }, "node_modules/@modelcontextprotocol/sdk/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/@pkgr/core": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { @@ -443,8 +387,6 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", - "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", "cpu": [ "arm64" ], @@ -457,15 +399,11 @@ }, "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "license": "MIT" }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -475,8 +413,6 @@ }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -486,8 +422,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -496,8 +430,6 @@ }, "node_modules/@types/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -506,22 +438,16 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -532,8 +458,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", "dev": true, "license": "MIT", "dependencies": { @@ -545,29 +469,21 @@ }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/js-yaml": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "25.2.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.1.tgz", - "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", "dev": true, "license": "MIT", "dependencies": { @@ -576,22 +492,16 @@ }, "node_modules/@types/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -600,8 +510,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -611,8 +519,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", - "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -640,8 +546,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -650,8 +554,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", - "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", "peer": true, @@ -676,8 +578,6 @@ }, "node_modules/@typescript-eslint/project-service": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", - "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", "dev": true, "license": "MIT", "dependencies": { @@ -698,8 +598,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", - "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", "dev": true, "license": "MIT", "dependencies": { @@ -716,8 +614,6 @@ }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", - "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", "dev": true, "license": "MIT", "engines": { @@ -733,8 +629,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", - "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", "dev": true, "license": "MIT", "dependencies": { @@ -758,8 +652,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", - "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", "dev": true, "license": "MIT", "engines": { @@ -772,8 +664,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", - "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", "dev": true, "license": "MIT", "dependencies": { @@ -800,8 +690,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -810,8 +698,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -826,8 +712,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", - "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", "dev": true, "license": "MIT", "dependencies": { @@ -850,8 +734,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", - "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", "dev": true, "license": "MIT", "dependencies": { @@ -868,8 +750,6 @@ }, "node_modules/@vitest/coverage-v8": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", - "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==", "dev": true, "license": "MIT", "dependencies": { @@ -899,8 +779,6 @@ }, "node_modules/@vitest/expect": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -917,8 +795,6 @@ }, "node_modules/@vitest/mocker": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -944,8 +820,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, "license": "MIT", "dependencies": { @@ -957,8 +831,6 @@ }, "node_modules/@vitest/runner": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, "license": "MIT", "dependencies": { @@ -971,8 +843,6 @@ }, "node_modules/@vitest/snapshot": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, "license": "MIT", "dependencies": { @@ -986,8 +856,6 @@ }, "node_modules/@vitest/spy": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, "license": "MIT", "funding": { @@ -996,8 +864,6 @@ }, "node_modules/@vitest/utils": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, "license": "MIT", "dependencies": { @@ -1010,8 +876,6 @@ }, "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", @@ -1023,8 +887,6 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "peer": true, @@ -1037,8 +899,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1047,8 +907,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1064,8 +922,6 @@ }, "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" @@ -1081,8 +937,6 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1097,14 +951,10 @@ }, "node_modules/ajv-formats/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/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": { @@ -1119,14 +969,10 @@ }, "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==", "license": "Python-2.0" }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -1135,8 +981,6 @@ }, "node_modules/ast-v8-to-istanbul": { "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.10.tgz", - "integrity": "sha512-p4K7vMz2ZSk3wN8l5o3y2bJAoZXT3VuJI5OLTATY/01CYWumWvwkUw0SqDBnNq6IiTO3qDa1eSQDibAV8g7XOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1147,15 +991,11 @@ }, "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/body-parser": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -1178,8 +1018,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -1189,8 +1027,6 @@ }, "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" @@ -1198,8 +1034,6 @@ }, "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", @@ -1211,8 +1045,6 @@ }, "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", @@ -1227,8 +1059,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -1237,8 +1067,6 @@ }, "node_modules/chai": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -1247,8 +1075,6 @@ }, "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": { @@ -1268,8 +1094,6 @@ }, "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": { @@ -1281,22 +1105,16 @@ }, "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/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/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -1308,8 +1126,6 @@ }, "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" @@ -1317,8 +1133,6 @@ }, "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" @@ -1326,8 +1140,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" @@ -1335,8 +1147,6 @@ }, "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", @@ -1352,8 +1162,6 @@ }, "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", @@ -1366,8 +1174,6 @@ }, "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" @@ -1383,15 +1189,11 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "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" @@ -1399,8 +1201,6 @@ }, "node_modules/dotenv": { "version": "17.2.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz", - "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -1411,8 +1211,6 @@ }, "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", @@ -1425,14 +1223,10 @@ }, "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/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" @@ -1440,8 +1234,6 @@ }, "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" @@ -1449,8 +1241,6 @@ }, "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" @@ -1458,15 +1248,11 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1477,8 +1263,6 @@ }, "node_modules/esbuild": { "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1519,14 +1303,10 @@ }, "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": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -1538,8 +1318,6 @@ }, "node_modules/eslint": { "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { @@ -1598,8 +1376,6 @@ }, "node_modules/eslint-config-prettier": { "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { @@ -1614,8 +1390,6 @@ }, "node_modules/eslint-plugin-prettier": { "version": "5.5.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", - "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { @@ -1645,8 +1419,6 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1662,8 +1434,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1675,8 +1445,6 @@ }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1693,8 +1461,6 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1706,8 +1472,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1719,8 +1483,6 @@ }, "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": { @@ -1729,8 +1491,6 @@ }, "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": { @@ -1739,8 +1499,6 @@ }, "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": { @@ -1749,8 +1507,6 @@ }, "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" @@ -1758,8 +1514,6 @@ }, "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" @@ -1770,8 +1524,6 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -1779,8 +1531,6 @@ }, "node_modules/expect-type": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1789,8 +1539,6 @@ }, "node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "peer": true, "dependencies": { @@ -1833,8 +1581,6 @@ }, "node_modules/express-rate-limit": { "version": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", "license": "MIT", "dependencies": { "ip-address": "10.0.1" @@ -1851,35 +1597,25 @@ }, "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-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, "license": "Apache-2.0" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -1894,8 +1630,6 @@ }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -1912,8 +1646,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1925,8 +1657,6 @@ }, "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", @@ -1946,8 +1676,6 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -1963,8 +1691,6 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -1977,15 +1703,11 @@ }, "node_modules/flatted": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "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" @@ -1993,8 +1715,6 @@ }, "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" @@ -2002,10 +1722,7 @@ }, "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": [ @@ -2017,8 +1734,6 @@ }, "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" @@ -2026,8 +1741,6 @@ }, "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", @@ -2050,8 +1763,6 @@ }, "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", @@ -2063,8 +1774,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -2076,8 +1785,6 @@ }, "node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -2089,8 +1796,6 @@ }, "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" @@ -2101,8 +1806,6 @@ }, "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": { @@ -2111,8 +1814,6 @@ }, "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" @@ -2123,8 +1824,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -2135,8 +1834,6 @@ }, "node_modules/hono": { "version": "4.11.7", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", - "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", "license": "MIT", "peer": true, "engines": { @@ -2145,15 +1842,11 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "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", @@ -2172,8 +1865,6 @@ }, "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" @@ -2188,8 +1879,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -2198,8 +1887,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2215,8 +1902,6 @@ }, "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": { @@ -2225,14 +1910,10 @@ }, "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/ip-address": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", "license": "MIT", "engines": { "node": ">= 12" @@ -2240,8 +1921,6 @@ }, "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" @@ -2249,8 +1928,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -2259,8 +1936,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2272,20 +1947,14 @@ }, "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/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -2294,8 +1963,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2309,8 +1976,6 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2323,8 +1988,6 @@ }, "node_modules/jose": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -2332,15 +1995,11 @@ }, "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/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -2351,35 +2010,25 @@ }, "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": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "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/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "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": { @@ -2388,8 +2037,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2402,8 +2049,6 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -2418,15 +2063,11 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lowdb": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz", - "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==", "license": "MIT", "dependencies": { "steno": "^4.0.2" @@ -2440,8 +2081,6 @@ }, "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": { @@ -2450,8 +2089,6 @@ }, "node_modules/magicast": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", - "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", "dev": true, "license": "MIT", "dependencies": { @@ -2462,8 +2099,6 @@ }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -2478,8 +2113,6 @@ }, "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" @@ -2487,8 +2120,6 @@ }, "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" @@ -2496,8 +2127,6 @@ }, "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" @@ -2508,8 +2137,6 @@ }, "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" @@ -2517,8 +2144,6 @@ }, "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" @@ -2533,8 +2158,6 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -2546,14 +2169,10 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -2571,15 +2190,11 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "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" @@ -2587,8 +2202,6 @@ }, "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" @@ -2596,8 +2209,6 @@ }, "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" @@ -2608,8 +2219,6 @@ }, "node_modules/obug": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -2619,8 +2228,6 @@ }, "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" @@ -2631,8 +2238,6 @@ }, "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" @@ -2640,8 +2245,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2658,8 +2261,6 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2674,8 +2275,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -2690,8 +2289,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -2703,8 +2300,6 @@ }, "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" @@ -2712,8 +2307,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -2722,8 +2315,6 @@ }, "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" @@ -2731,8 +2322,6 @@ }, "node_modules/path-to-regexp": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -2741,22 +2330,16 @@ }, "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/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.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -2768,8 +2351,6 @@ }, "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" @@ -2777,8 +2358,6 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -2806,8 +2385,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -2816,8 +2393,6 @@ }, "node_modules/prettier": { "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", "peer": true, @@ -2833,8 +2408,6 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", - "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -2846,8 +2419,6 @@ }, "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", @@ -2859,8 +2430,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -2869,8 +2438,6 @@ }, "node_modules/qs": { "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -2884,8 +2451,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2893,8 +2458,6 @@ }, "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", @@ -2908,8 +2471,6 @@ }, "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" @@ -2917,8 +2478,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -2927,8 +2486,6 @@ }, "node_modules/rollup": { "version": "4.57.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", - "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", "dev": true, "license": "MIT", "dependencies": { @@ -2972,8 +2529,6 @@ }, "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", @@ -2988,14 +2543,10 @@ }, "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/semver": { "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -3007,8 +2558,6 @@ }, "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", @@ -3033,8 +2582,6 @@ }, "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", @@ -3052,14 +2599,10 @@ }, "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/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" @@ -3070,8 +2613,6 @@ }, "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" @@ -3079,8 +2620,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3098,8 +2637,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3114,8 +2651,6 @@ }, "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", @@ -3132,8 +2667,6 @@ }, "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", @@ -3151,15 +2684,11 @@ }, "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/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": { @@ -3168,15 +2697,11 @@ }, "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" @@ -3184,15 +2709,11 @@ }, "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/steno": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz", - "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==", "license": "MIT", "engines": { "node": ">=18" @@ -3203,8 +2724,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -3216,8 +2735,6 @@ }, "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": { @@ -3229,8 +2746,6 @@ }, "node_modules/synckit": { "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3245,15 +2760,11 @@ }, "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/tinyexec": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, "license": "MIT", "engines": { @@ -3262,8 +2773,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3279,8 +2788,6 @@ }, "node_modules/tinyrainbow": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -3289,8 +2796,6 @@ }, "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" @@ -3298,8 +2803,6 @@ }, "node_modules/ts-api-utils": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -3311,8 +2814,6 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -3324,8 +2825,6 @@ }, "node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -3338,8 +2837,6 @@ }, "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", "peer": true, @@ -3353,8 +2850,6 @@ }, "node_modules/typescript-eslint": { "version": "8.54.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", - "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3377,15 +2872,11 @@ }, "node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "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" @@ -3393,8 +2884,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3403,8 +2892,6 @@ }, "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" @@ -3412,8 +2899,6 @@ }, "node_modules/vite": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", "peer": true, @@ -3488,8 +2973,6 @@ }, "node_modules/vitest": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", "peer": true, @@ -3567,8 +3050,6 @@ }, "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" @@ -3582,8 +3063,6 @@ }, "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": { @@ -3599,8 +3078,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -3609,14 +3086,10 @@ }, "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/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -3628,8 +3101,6 @@ }, "node_modules/zod": { "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "peer": true, "funding": { @@ -3638,8 +3109,6 @@ }, "node_modules/zod-to-json-schema": { "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" From fd9d0cfa56771d26e7aed653cbb2ea92a3efbd33 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sun, 8 Feb 2026 13:12:41 -0700 Subject: [PATCH 8/9] Attempted fix for build-server.yml workflow --- .github/workflows/build-server.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-server.yml b/.github/workflows/build-server.yml index 618e14c3..e776736a 100644 --- a/.github/workflows/build-server.yml +++ b/.github/workflows/build-server.yml @@ -39,6 +39,7 @@ jobs: - name: Build Server - Install dependencies run: npm ci + working-directory: . - name: Build Server - Clean previous build run: npm run clean From 83f6a62d6424cf22667e223ab0ee0647f432305f Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sun, 8 Feb 2026 13:34:39 -0700 Subject: [PATCH 9/9] Fix npm optional dependencies not installed from cache in CI (#25) --- .github/workflows/build-server.yml | 2 +- .github/workflows/copilot-setup-steps.yml | 2 +- .github/workflows/release.yml | 4 +- package-lock.json | 1370 ++++++++++++++++++++- 4 files changed, 1335 insertions(+), 43 deletions(-) diff --git a/.github/workflows/build-server.yml b/.github/workflows/build-server.yml index e776736a..766565d8 100644 --- a/.github/workflows/build-server.yml +++ b/.github/workflows/build-server.yml @@ -38,7 +38,7 @@ jobs: node-version-file: '.node-version' - name: Build Server - Install dependencies - run: npm ci + run: npm ci --include=optional working-directory: . - name: Build Server - Clean previous build diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index a4f7afe3..3b11b431 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -51,7 +51,7 @@ jobs: node-version-file: '.node-version' - name: Copilot Setup - Install dependencies - run: npm ci + run: npm ci --include=optional - name: Copilot Setup - Setup CodeQL environment uses: ./.github/actions/setup-codeql-environment diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2fe22938..995eab01 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -86,7 +86,7 @@ jobs: fi - name: Release - Install dependencies - run: npm ci + run: npm ci --include=optional - name: Release - Build server run: npm run build -w server @@ -152,7 +152,7 @@ jobs: - name: Release - Install production dependencies working-directory: dist-package/server - run: npm ci --omit=dev + run: npm ci --omit=dev --include=optional - name: Release - Create archive run: | diff --git a/package-lock.json b/package-lock.json index 5d51cdd3..bf5a3416 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,6 +55,8 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -63,6 +65,8 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -70,11 +74,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.6", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -84,7 +90,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -97,14 +105,86 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/darwin-arm64": { "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -118,8 +198,367 @@ "node": ">=18" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -137,6 +576,8 @@ }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -148,6 +589,8 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -156,6 +599,8 @@ }, "node_modules/@eslint/config-array": { "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -169,6 +614,8 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -180,6 +627,8 @@ }, "node_modules/@eslint/core": { "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -191,6 +640,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -213,6 +664,8 @@ }, "node_modules/@eslint/js": { "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -224,6 +677,8 @@ }, "node_modules/@eslint/object-schema": { "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -232,6 +687,8 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -244,6 +701,8 @@ }, "node_modules/@hono/node-server": { "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", "license": "MIT", "engines": { "node": ">=18.14.1" @@ -254,6 +713,8 @@ }, "node_modules/@humanfs/core": { "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -262,6 +723,8 @@ }, "node_modules/@humanfs/node": { "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -274,6 +737,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -286,6 +751,8 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -298,6 +765,8 @@ }, "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": { @@ -306,11 +775,15 @@ }, "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": { @@ -320,6 +793,8 @@ }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", + "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9", @@ -358,6 +833,8 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -372,10 +849,14 @@ }, "node_modules/@modelcontextprotocol/sdk/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/@pkgr/core": { "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { @@ -385,8 +866,38 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.0", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], @@ -397,13 +908,325 @@ "darwin" ] }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "license": "MIT" }, "node_modules/@types/body-parser": { "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -413,6 +1236,8 @@ }, "node_modules/@types/chai": { "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -422,6 +1247,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -430,6 +1257,8 @@ }, "node_modules/@types/cors": { "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -438,16 +1267,22 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -458,6 +1293,8 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", "dev": true, "license": "MIT", "dependencies": { @@ -469,21 +1306,29 @@ }, "node_modules/@types/http-errors": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/js-yaml": { "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.1", + "version": "25.2.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.2.tgz", + "integrity": "sha512-BkmoP5/FhRYek5izySdkOneRyXYN35I860MFAGupTdebyE66uZaR+bXLHq8k4DirE5DwQi3NuhvRU1jqTVwUrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -492,16 +1337,22 @@ }, "node_modules/@types/qs": { "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -510,6 +1361,8 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -519,6 +1372,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.54.0.tgz", + "integrity": "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -546,6 +1401,8 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -554,6 +1411,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.54.0.tgz", + "integrity": "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==", "dev": true, "license": "MIT", "peer": true, @@ -578,6 +1437,8 @@ }, "node_modules/@typescript-eslint/project-service": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.54.0.tgz", + "integrity": "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==", "dev": true, "license": "MIT", "dependencies": { @@ -598,6 +1459,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.54.0.tgz", + "integrity": "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==", "dev": true, "license": "MIT", "dependencies": { @@ -614,6 +1477,8 @@ }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.54.0.tgz", + "integrity": "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==", "dev": true, "license": "MIT", "engines": { @@ -629,6 +1494,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.54.0.tgz", + "integrity": "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==", "dev": true, "license": "MIT", "dependencies": { @@ -652,6 +1519,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.54.0.tgz", + "integrity": "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==", "dev": true, "license": "MIT", "engines": { @@ -664,6 +1533,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.54.0.tgz", + "integrity": "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==", "dev": true, "license": "MIT", "dependencies": { @@ -690,6 +1561,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -698,6 +1571,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -712,6 +1587,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.54.0.tgz", + "integrity": "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==", "dev": true, "license": "MIT", "dependencies": { @@ -734,6 +1611,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.54.0.tgz", + "integrity": "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==", "dev": true, "license": "MIT", "dependencies": { @@ -750,6 +1629,8 @@ }, "node_modules/@vitest/coverage-v8": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.18.tgz", + "integrity": "sha512-7i+N2i0+ME+2JFZhfuz7Tg/FqKtilHjGyGvoHYQ6iLV0zahbsJ9sljC9OcFcPDbhYKCet+sG8SsVqlyGvPflZg==", "dev": true, "license": "MIT", "dependencies": { @@ -779,6 +1660,8 @@ }, "node_modules/@vitest/expect": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -795,6 +1678,8 @@ }, "node_modules/@vitest/mocker": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -820,6 +1705,8 @@ }, "node_modules/@vitest/pretty-format": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, "license": "MIT", "dependencies": { @@ -831,6 +1718,8 @@ }, "node_modules/@vitest/runner": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, "license": "MIT", "dependencies": { @@ -843,6 +1732,8 @@ }, "node_modules/@vitest/snapshot": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, "license": "MIT", "dependencies": { @@ -856,6 +1747,8 @@ }, "node_modules/@vitest/spy": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, "license": "MIT", "funding": { @@ -864,6 +1757,8 @@ }, "node_modules/@vitest/utils": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, "license": "MIT", "dependencies": { @@ -876,6 +1771,8 @@ }, "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", @@ -887,6 +1784,8 @@ }, "node_modules/acorn": { "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "peer": true, @@ -899,6 +1798,8 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -907,6 +1808,8 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -922,6 +1825,8 @@ }, "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" @@ -937,6 +1842,8 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -951,10 +1858,14 @@ }, "node_modules/ajv-formats/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/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": { @@ -969,10 +1880,14 @@ }, "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==", "license": "Python-2.0" }, "node_modules/assertion-error": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -980,22 +1895,28 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "0.3.10", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.11.tgz", + "integrity": "sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" + "js-tokens": "^10.0.0" } }, "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/body-parser": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -1018,6 +1939,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -1027,6 +1950,8 @@ }, "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" @@ -1034,6 +1959,8 @@ }, "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", @@ -1045,6 +1972,8 @@ }, "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", @@ -1059,6 +1988,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -1067,6 +1998,8 @@ }, "node_modules/chai": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -1075,6 +2008,8 @@ }, "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": { @@ -1094,6 +2029,8 @@ }, "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": { @@ -1105,16 +2042,22 @@ }, "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/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/content-disposition": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -1126,6 +2069,8 @@ }, "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" @@ -1133,6 +2078,8 @@ }, "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" @@ -1140,6 +2087,8 @@ }, "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" @@ -1147,6 +2096,8 @@ }, "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", @@ -1162,6 +2113,8 @@ }, "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", @@ -1174,6 +2127,8 @@ }, "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" @@ -1189,11 +2144,15 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "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" @@ -1201,6 +2160,8 @@ }, "node_modules/dotenv": { "version": "17.2.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz", + "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -1211,6 +2172,8 @@ }, "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", @@ -1223,10 +2186,14 @@ }, "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/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" @@ -1234,6 +2201,8 @@ }, "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" @@ -1241,6 +2210,8 @@ }, "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" @@ -1248,11 +2219,15 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1263,6 +2238,8 @@ }, "node_modules/esbuild": { "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1303,10 +2280,14 @@ }, "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": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -1318,6 +2299,8 @@ }, "node_modules/eslint": { "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { @@ -1376,6 +2359,8 @@ }, "node_modules/eslint-config-prettier": { "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { @@ -1390,6 +2375,8 @@ }, "node_modules/eslint-plugin-prettier": { "version": "5.5.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", + "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", "dev": true, "license": "MIT", "dependencies": { @@ -1419,6 +2406,8 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1434,6 +2423,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1445,6 +2436,8 @@ }, "node_modules/espree": { "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1461,6 +2454,8 @@ }, "node_modules/esquery": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1472,6 +2467,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1483,6 +2480,8 @@ }, "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": { @@ -1491,6 +2490,8 @@ }, "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": { @@ -1499,6 +2500,8 @@ }, "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": { @@ -1507,6 +2510,8 @@ }, "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" @@ -1514,6 +2519,8 @@ }, "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" @@ -1524,6 +2531,8 @@ }, "node_modules/eventsource-parser": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -1531,6 +2540,8 @@ }, "node_modules/expect-type": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1539,6 +2550,8 @@ }, "node_modules/express": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "peer": true, "dependencies": { @@ -1581,6 +2594,8 @@ }, "node_modules/express-rate-limit": { "version": "8.2.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", + "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", "license": "MIT", "dependencies": { "ip-address": "10.0.1" @@ -1597,25 +2612,35 @@ }, "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-diff": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, "license": "Apache-2.0" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -1630,6 +2655,8 @@ }, "node_modules/fdir": { "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -1646,6 +2673,8 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1657,6 +2686,8 @@ }, "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", @@ -1676,6 +2707,8 @@ }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -1691,6 +2724,8 @@ }, "node_modules/flat-cache": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -1703,11 +2738,15 @@ }, "node_modules/flatted": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "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" @@ -1715,6 +2754,8 @@ }, "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" @@ -1722,7 +2763,10 @@ }, "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": [ @@ -1734,6 +2778,8 @@ }, "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" @@ -1741,6 +2787,8 @@ }, "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", @@ -1763,6 +2811,8 @@ }, "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", @@ -1774,6 +2824,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -1785,6 +2837,8 @@ }, "node_modules/globals": { "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -1796,6 +2850,8 @@ }, "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" @@ -1806,6 +2862,8 @@ }, "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": { @@ -1814,6 +2872,8 @@ }, "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" @@ -1824,6 +2884,8 @@ }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1833,7 +2895,9 @@ } }, "node_modules/hono": { - "version": "4.11.7", + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz", + "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==", "license": "MIT", "peer": true, "engines": { @@ -1842,11 +2906,15 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "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", @@ -1865,6 +2933,8 @@ }, "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" @@ -1879,6 +2949,8 @@ }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -1887,6 +2959,8 @@ }, "node_modules/import-fresh": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1902,6 +2976,8 @@ }, "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": { @@ -1910,10 +2986,14 @@ }, "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/ip-address": { "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", "license": "MIT", "engines": { "node": ">= 12" @@ -1921,6 +3001,8 @@ }, "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" @@ -1928,6 +3010,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -1936,6 +3020,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1947,14 +3033,20 @@ }, "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/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -1963,6 +3055,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1976,6 +3070,8 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1988,18 +3084,24 @@ }, "node_modules/jose": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/js-tokens": { - "version": "9.0.1", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -2010,25 +3112,35 @@ }, "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": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "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/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "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": { @@ -2037,6 +3149,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2049,6 +3163,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -2063,11 +3179,15 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lowdb": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-7.0.1.tgz", + "integrity": "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==", "license": "MIT", "dependencies": { "steno": "^4.0.2" @@ -2081,6 +3201,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": { @@ -2088,17 +3210,21 @@ } }, "node_modules/magicast": { - "version": "0.5.1", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -2113,6 +3239,8 @@ }, "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" @@ -2120,6 +3248,8 @@ }, "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" @@ -2127,6 +3257,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" @@ -2137,6 +3269,8 @@ }, "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" @@ -2144,6 +3278,8 @@ }, "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" @@ -2158,6 +3294,8 @@ }, "node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -2169,10 +3307,14 @@ }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -2190,11 +3332,15 @@ }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "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" @@ -2202,6 +3348,8 @@ }, "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" @@ -2209,6 +3357,8 @@ }, "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" @@ -2219,6 +3369,8 @@ }, "node_modules/obug": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -2228,6 +3380,8 @@ }, "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" @@ -2238,6 +3392,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" @@ -2245,6 +3401,8 @@ }, "node_modules/optionator": { "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2261,6 +3419,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2275,6 +3435,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -2289,6 +3451,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -2300,6 +3464,8 @@ }, "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" @@ -2307,6 +3473,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -2315,6 +3483,8 @@ }, "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" @@ -2322,6 +3492,8 @@ }, "node_modules/path-to-regexp": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", "funding": { "type": "opencollective", @@ -2330,16 +3502,22 @@ }, "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/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.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -2351,6 +3529,8 @@ }, "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" @@ -2358,6 +3538,8 @@ }, "node_modules/postcss": { "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -2385,6 +3567,8 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -2393,6 +3577,8 @@ }, "node_modules/prettier": { "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", "peer": true, @@ -2408,6 +3594,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -2419,6 +3607,8 @@ }, "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", @@ -2430,6 +3620,8 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -2438,6 +3630,8 @@ }, "node_modules/qs": { "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -2451,6 +3645,8 @@ }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -2458,6 +3654,8 @@ }, "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", @@ -2471,6 +3669,8 @@ }, "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" @@ -2478,6 +3678,8 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -2485,7 +3687,9 @@ } }, "node_modules/rollup": { - "version": "4.57.0", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2499,36 +3703,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.0", - "@rollup/rollup-android-arm64": "4.57.0", - "@rollup/rollup-darwin-arm64": "4.57.0", - "@rollup/rollup-darwin-x64": "4.57.0", - "@rollup/rollup-freebsd-arm64": "4.57.0", - "@rollup/rollup-freebsd-x64": "4.57.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", - "@rollup/rollup-linux-arm-musleabihf": "4.57.0", - "@rollup/rollup-linux-arm64-gnu": "4.57.0", - "@rollup/rollup-linux-arm64-musl": "4.57.0", - "@rollup/rollup-linux-loong64-gnu": "4.57.0", - "@rollup/rollup-linux-loong64-musl": "4.57.0", - "@rollup/rollup-linux-ppc64-gnu": "4.57.0", - "@rollup/rollup-linux-ppc64-musl": "4.57.0", - "@rollup/rollup-linux-riscv64-gnu": "4.57.0", - "@rollup/rollup-linux-riscv64-musl": "4.57.0", - "@rollup/rollup-linux-s390x-gnu": "4.57.0", - "@rollup/rollup-linux-x64-gnu": "4.57.0", - "@rollup/rollup-linux-x64-musl": "4.57.0", - "@rollup/rollup-openbsd-x64": "4.57.0", - "@rollup/rollup-openharmony-arm64": "4.57.0", - "@rollup/rollup-win32-arm64-msvc": "4.57.0", - "@rollup/rollup-win32-ia32-msvc": "4.57.0", - "@rollup/rollup-win32-x64-gnu": "4.57.0", - "@rollup/rollup-win32-x64-msvc": "4.57.0", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "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", @@ -2543,10 +3749,14 @@ }, "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/semver": { - "version": "7.7.3", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, "license": "ISC", "bin": { @@ -2558,6 +3768,8 @@ }, "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", @@ -2582,6 +3794,8 @@ }, "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", @@ -2599,10 +3813,14 @@ }, "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/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" @@ -2613,6 +3831,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" @@ -2620,6 +3840,8 @@ }, "node_modules/side-channel": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2637,6 +3859,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2651,6 +3875,8 @@ }, "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", @@ -2667,6 +3893,8 @@ }, "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", @@ -2684,11 +3912,15 @@ }, "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/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": { @@ -2697,11 +3929,15 @@ }, "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" @@ -2709,11 +3945,15 @@ }, "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/steno": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/steno/-/steno-4.0.2.tgz", + "integrity": "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==", "license": "MIT", "engines": { "node": ">=18" @@ -2724,6 +3964,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -2735,6 +3977,8 @@ }, "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": { @@ -2746,6 +3990,8 @@ }, "node_modules/synckit": { "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2760,11 +4006,15 @@ }, "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/tinyexec": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, "license": "MIT", "engines": { @@ -2773,6 +4023,8 @@ }, "node_modules/tinyglobby": { "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2788,6 +4040,8 @@ }, "node_modules/tinyrainbow": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -2796,6 +4050,8 @@ }, "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" @@ -2803,6 +4059,8 @@ }, "node_modules/ts-api-utils": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -2814,6 +4072,8 @@ }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -2825,6 +4085,8 @@ }, "node_modules/type-is": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -2837,6 +4099,8 @@ }, "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", "peer": true, @@ -2850,6 +4114,8 @@ }, "node_modules/typescript-eslint": { "version": "8.54.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.54.0.tgz", + "integrity": "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2872,11 +4138,15 @@ }, "node_modules/undici-types": { "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "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" @@ -2884,6 +4154,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2892,6 +4164,8 @@ }, "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" @@ -2899,6 +4173,8 @@ }, "node_modules/vite": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", "peer": true, @@ -2973,6 +4249,8 @@ }, "node_modules/vitest": { "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", "peer": true, @@ -3050,6 +4328,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -3063,6 +4343,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": { @@ -3078,6 +4360,8 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -3086,10 +4370,14 @@ }, "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/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -3101,6 +4389,8 @@ }, "node_modules/zod": { "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "peer": true, "funding": { @@ -3109,6 +4399,8 @@ }, "node_modules/zod-to-json-schema": { "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4"